




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用义隆单片机做的一个豆浆机控制程序并用单片机直接驱动LCD brmcu 发表于 2008-8-25 22:56:00 阅读全文(1319) | 回复(0) | 引用通告(0) | 编辑i nclude EM78x156xx.h#define DISI() _asmdisi#define ENI() _asmeni#define SLEP() _asmslep#define NOP() _asmnop#define WDTC() _asmwdtc#define uchar unsigned int#define uint unsigned short#define Key R53#define Bz R51#define Out R50#define Com1 R60#define Com2 R61#define Com3 R62#define Seg1 R63#define Seg2 R64#define Seg3 R65#define Seg4 R66#define Seg5 R67#define InCom1 (P6CR|=0x01)#define InCom2 (P6CR|=0x02)#define InCom3 (P6CR|=0x04)#define OutCom1 (P6CR&=0x0E)#define OutCom2 (P6CR&=0x0D)#define OutCom3 (P6CR&=0x0B)bit OkFlag;bit BzOutFlag;bit StartFlag;bit KeyFlag;uchar Count 0x2F;uint BzOutTime;uint TimeFlag;uchar Minute;uchar Second;uchar BiasTime;const uchar Number110=0x6F,0x06,0x3D,0x37,0x56,0x73,0x7B,0x26,0xFF,0x77;const uchar Number210=0xF7,0x03,0x5E,0x1F,0x8B,0x9D,0xFD,0x13,0xFF,0xBF;void SysInt(void);void KeyProcess(void);void Delayms(uint ms);void BzOut(void);void LcdDisplay(uchar Num1,uchar Num2);void TimeDisplay(void);void main()SysInt();while(1)KeyProcess();TimeDisplay();void TimeDisplay(void)uchar temp1,temp2;/Count+;Out=!StartFlag;if(BzOutFlag=1)if(BzOutTime%1000)=0)BzOut();if(BzOutTime=20000)BzOutTime=0;BzOutFlag=0;BzOutTime+;if(Count=249)&(StartFlag=1)/Count=249Count=0;if(Second0)Second-;if(Second=0)if(Minute0)Minute-;Second=60;elseStartFlag=0;BzOutFlag=1;OkFlag=1;if(OkFlag=1)LcdDisplay(0x0,0x0);else if(Minute=1)if(Minute=1)&(Second0)&(StartFlag=1)temp2=(Minute+1)/10;temp1=(Minute+1)%10;elsetemp2=Minute/10;temp1=Minute%10;if(StartFlag=1)&(Count125)LcdDisplay(0x00,0x00);elseLcdDisplay(Number1temp1,Number2temp2);elsetemp2=Second/10;temp1=Second%10;LcdDisplay(Number1temp1,Number2temp2);void SysInt(void)WDTCR=0;DISI();_asmmov a,0x44contw ISR=0;IMR=0x01;TCC=5;PHCR=0xFF;PDCR=0xFF;P5CR=0x08;P6CR&=0x07;InCom1;InCom2;InCom3;Seg1=0;Seg2=0;Seg3=0;Seg4=0;Seg5=0;BiasTime=0;BzOutTime=0;TimeFlag=0;OkFlag=0;StartFlag=0;BzOutFlag=0;Count=0;Second=0;Minute=0;Bz=0;Out=1;KeyFlag=0;ENI();void LcdDisplay(uchar Num1,uchar Num2)switch(BiasTime)case 0:OutCom1;Com1=1;InCom2;InCom3;if(Num1&0x01)=0)Seg1=1;else Seg1=0;if(Num1&0x08)=0)Seg2=1;else Seg2=0;if(Num2&0x01)=0)Seg3=1;else Seg3=0;if(Num2&0x04)=0)Seg4=1;else Seg4=0;if(Num2&0x20)=0)Seg5=1;else Seg5=0;break;case 1: OutCom1;Com1=0;InCom2;InCom3;if(Num1&0x01)=0)Seg1=0;else Seg1=1;if(Num1&0x08)=0)Seg2=0;else Seg2=1;if(Num2&0x01)=0)Seg3=0;else Seg3=1;if(Num2&0x04)=0)Seg4=0;else Seg4=1;if(Num2&0x20)=0)Seg5=0;else Seg5=1;break;case 2:InCom1;OutCom2;Com2=1;InCom3;if(Num1&0x02)=0)Seg1=1;else Seg1=0;if(Num1&0x10)=0)Seg2=1;else Seg2=0;if(Num2&0x02)=0)Seg3=1;else Seg3=0;if(Num2&0x08)=0)Seg4=1;else Seg4=0;if(Num2&0x40)=0)Seg5=1;else Seg5=0;break;case 3:InCom1;OutCom2;Com2=0;InCom3;if(Num1&0x02)=0)Seg1=0;else Seg1=1;if(Num1&0x10)=0)Seg2=0;else Seg2=1;if(Num2&0x02)=0)Seg3=0;else Seg3=1;if(Num2&0x08)=0)Seg4=0;else Seg4=1;if(Num2&0x40)=0)Seg5=0;else Seg5=1;break;case 4: InCom1;InCom2;OutCom3;Com3=1;if(Num1&0x04)=0)Seg1=1;else Seg1=0;if(Num1&0x20)=0)Seg2=1;else Seg2=0;if(Num1&0x40)=0)Seg3=1;else Seg3=0;if(Num2&0x10)=0)Seg4=1;else Seg4=0;if(Num2&0x80)=0)Seg5=1;else Seg5=0;break;case 5:InCom1;InCom2;OutCom3;Com3=0;if(Num1&0x04)=0)Seg1=0;else Seg1=1;if(Num1&0x20)=0)Seg2=0;else Seg2=1;if(Num1&0x40)=0)Seg3=0;else Seg3=1;if(Num2&0x10)=0)Seg4=0;else Seg4=1;if(Num2&0x80)=0)Seg5=0;else Seg5=1;default:break; Delayms(1);BiasTime+;if(BiasTime=6)BiasTime=0;void KeyProcess(void) if(TimeFlag0)&(TimeFlag=2000)StartFlag=1;if(Key=0)&(KeyFlag=0)&(StartFlag=0)TimeFlag=1;Minute+;if(Minute99)Minute=0;if(OkFlag=1)/OkFlag=0;/ Minute=0;SysInt();KeyFlag=1;elseif(Key=1)KeyFlag=0;if(Key=0)&(KeyFlag=0)&(StartFlag=1)SysInt();KeyFlag=1;void BzOut(void)uchar i,j;for(i=0;i150;i+)Bz=!Bz;for(j=0;j58;j+)NOP();NOP();/*Delayms(50);for(i=0;i100;i+)Bz=!Bz;for(j=0;j50;j+)NOP();NOP();*/Bz=0;void Delayms(uint ms)uint i,j;for(i=0;ims;i+)for(j=0;j 0x1F ; R3 - 0x3E (ram bank 1); R4 - 0x3F (ram bank 1)MOV 0X1F,A ;backup A to 0x1FSWAPA 0X04 ;backup R4 to 0x3F at bank 3MOV 0X3F,A ;backup R4 to 0x3F at bank 3SWAPA 0X03 MOV 0X3E,A ;backup R3 to 0x3E at bank 3 void _intcall interrupt(void) int 0if(TCIF=0)return;DISI();ISR=0;_asmmov a,0x44contw TCC=5;_asmSWAPA 0X3E ;restore R3MOV 0X03,ASWAPA 0X3F ;restore R4MOV 0X04,ASWAP 0X1F ;restore ASWAPA 0X1F_asmINC 0X2FENI();这是我的程序:(因为刚刚开始用AVR,从最简单的开始,就直接用汇编了) Timer2用外接32768晶振提供时钟,整个系统耗电大约30微安。 ; lcddisplay.asm ; Test raw LCD display .include m48def.inc .org 0x0000 rjmp start .org OC2Aaddr rjmp isr_timer2 .org 0x0020 table: .DB 0b11101101, 0b00101000, 0b10110101, 0b10111001 .DB 0b01111000, 0b11011001, 0b11011101, 0b10101000 .DB 0b11111101, 0b11111001 start: ldi r16, 1PUD out MCUCR, r16 ; disable all I/O pull-up ldi r16, 1AS2 sts ASSR, r16 ; enable asynchronous mode ldi r16, 1WGM21 sts TCCR2A, r16 ; CTC mode ldi r16, 31 sts OCR2A, r16 ; preset compare A ldi r16,1CS21 ; divide by 8 ; ldi r16,1CS20 ; use clkIO as source sts TCCR2B, r16 ldi r16, 1OCF2A out TIFR2, r16 ; clear flag ldi r16, 1OCIE2A sts TIMSK2, r16 ; enable interrupt on compare match A ser r16 out DDRD, r16 ; Port D output - LCD segment control clr r5 ldi r16, 0x55 mov r6, r16 clr r7 clr r8 ldi r16, 9 mov r10, r16 mov r11, r16 mov r12, r16 mov r13, r16 dec r10 sei ; enable global interrupt ldi r16, (1SE) out SMCR, r16 ; use Idle mode here, waiting 1 second clr r2 iniw:sleep dec r2 brne iniw ldi r16, (1SM1)|(1SM0)|(1SE) out SMCR, r16 ; use power-save mode nop nop clr r2 loop: nop nop sleep nop nop dec r2 dec r2 breq adjtime rjmp loop adjtime: ldi r17, 10 inc r10 cp r10, r17 brne updcount clr r10 inc r11 cp r11, r17 brne updcount clr r11 inc r12 cp r12, r17 brne updcount clr r12 inc r13 cp r13, r17 brne updcount clr r13 updcount: rcall calcor rjmp loop isr_timer2: clr r16 out DDRC, r16 ; float all COMx pins bst r4, 1 brts show34 bst r4, 0 brts show2 mov r0, r5 ldi r18, 1 rjmp sel show2: mov r0, r6 ldi r18, 11 rjmp sel show34: bst r4, 0 brts show4 mov r0, r7 ldi r18, 12 rjmp sel show4: mov r0, r8 ldi r18, 13 sel: bst r4, 2 brtc lcden com r0 com r16 lcden: out PORTC, r16 out PORTD, r0 out DDRC, r18 iext:inc r4 reti calcor: ; translate R10R13 to R5R8 clr r5 clr r6 clr r7 clr r8 ldi ZH, high(table1) ldi ZL, low(table1) add ZL, r10 lpm ; load table data to R0 rcall filler ldi ZL, low(table1) add ZL, r11 lpm rcall filler ldi ZL, low(table1) add ZL, r12 lpm rcall filler ldi ZL, low(table1) add ZL, r13 lpm rcall filler ret filler: rol r0 rol r5 rol r0 rol r5 rol r0 rol r6 rol r0 rol r6 rol r0 rol r7 rol r0 rol r7 rol r0 rol r8 rol r0 rol r8 ret/*段式LCD驱动实验 外部晶体:12MHz 作者: 邮箱: 日期:2011.08.26 */#include #include /管脚定义sbit COM0=P35;sbit COM1=P34;sbit COM2=P33;sbit COM3=P32;sbit BI_4=P37;sbit RTC_CLK=P30;sbit RTC_IO=P31;sbit RTC_RST=P37; /复用/P3口模式寄存器sfr P3M1=0xb1;sfr P3M0=0xb2;/当前时间(BCD码):秒、分、时、日、月、星期、年unsigned char ClockBuffer8=0x34,0x12,0x08,0x20,0x03,0x05,0x09;/09的段码查询表/位序 D7 D6 D5 D4 D3 D2 D1 D0/段 A B C D E F G DOT code unsigned char seg_code10=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09;unsigned char ScanCoun=0; /动态扫描显示位数计数器unsigned char DisplayBuf4=1,2,3,4; /4位数字对应的显示暂存/段码缓冲区unsigned char SegBuf4=0x00,0x00,0x00,0x00;/COM1、COM2、COM3、COM4的段码bit bi_4a=0; /COM0对应的4abit bi_4b=0; /COM1对应的4abit bi_4c=0; /COM2对应的4a/延时void dly(unsigned char x) unsigned char i; for (i=0; ix; i+); /ds1302写1字节void rtc_wt_byte(unsigned char sent_buf) unsigned char i; for (i=0; i1; RTC_CLK=0; dly(5); /ds1302读1字节unsigned char rtc_rd_byte(void) unsigned char i,read_buf; RTC_IO=1; /RTC_IO置1,保证为输入状态 for (i=0; i1; RTC_CLK=0; dly(5); if (RTC_IO) read_buf=read_buf|0x80; else read_buf=read_buf&0x7f; RTC_CLK=1; dly(5); RTC_CLK=0; dly(5); return read_buf; /ds1302写入时间void rtc_wr_time(unsigned char *p_wt_time) unsigned char i; unsigned char tmp1; dly(30); RTC_RST=1; rtc_wt_byte(0xbe); /burst写入时间 for (i=0; i8; i+) tmp1=*p_wt_time+; rtc_wt_byte(tmp1); RTC_CLK=0; RTC_RST=0; /ds1302读出时间void rtc_rd_time(unsigned char *p_rd_time) unsigned char i; unsigned char tmp1; dly(30); RTC_RST=1; rtc_wt_byte(0xbf); /burst读取时间 RTC_IO=1; for (i=0; i8; i+) tmp1=rtc_rd_byte(); *p_rd_time+=tmp1; RTC_CLK=0; RTC_RST=0; /ds1302初始化void ini_rtc() RTC_CLK=0; RTC_RST=0; dly(30); RTC_RST=1; rtc_wt_byte(0x8e); /写CONTROL寄存器 rtc_wt_byte(0x00); /值:去掉写保护 RTC_RST=0; /复位 RTC_RST=1; /正常工作 rtc_wt_byte(0x90); /写TRICKLE CHARGER寄存器 rtc_wt_byte(0xa9); /值:使能充电,串联2个二极管,串联2k欧姆的电阻 RTC_CLK=0; RTC_RST=0; /把4位数字的SEG放到COM1、COM2、COM3、COM4对应的段码/LCD的管脚定义与LED不同,它不是一个COM对应一位数字,而是对应每个数字的一部分SEG/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 / - - COM0 / - - COM1 / - - COM2 / 1d 1h 2d 2h 3d 3h 4d - - COM3void Seg2Seg()unsigned char SegXX; SegBuf0=0; SegBuf1=0; SegBuf2=0x08; SegBuf3=0; bi_4a=0; bi_4b=0; bi_4c=0; SegXX=seg_codeDisplayBuf0; /第1位数字 if (SegXX&0x80) SegBuf0|=0x40; if (SegXX&0x40) SegBuf1|=0x40; if (SegXX&0x20) SegBuf2|=0x40; if (SegXX&0x10) SegBuf3|=0x80; if (SegXX&0x08) SegBuf2|=0x80; if (SegXX&0x04) SegBuf0|=0x80; if (SegXX&0x02) SegBuf1|=0x80; if (SegXX&0x01) SegBuf3|=0x40; SegXX=seg_codeDisplayBuf1; /第2位数字 if (SegXX&0x80) SegBuf0|=0x10; if (SegXX&0x40) SegBuf1|=0x10; if (SegXX&0x20) SegBuf2|=0x10; if (SegXX&0x10) SegBuf3|=0x20; if (SegXX&0x08) SegBuf2|=0x20; if (SegXX&0x04) SegBuf0|=0x20; if (SegXX&0x02) SegBuf1|=0x20; if (SegXX&0x01) SegBuf3|=0x10; SegXX=seg_codeDisplayBuf2; /第3位数字 if (SegXX&0x80) SegBuf0|=0x02; if (SegXX&0x40) SegBuf1|=0x02; if (SegXX&0x20) SegBuf2|=0x02; if (SegXX&0x10) SegBuf3|=0x04; if (SegXX&0x08) SegBuf2|=0x04; if (SegXX&0x04) SegBuf0|=0x04; if (SegXX&0x02) SegBuf1|=0x04; if (SegXX&0x01) SegBuf3|=0x02; SegXX=seg_codeDisplayBuf3; /第4位数字 if (SegXX&0x80) bi_4a=1; if (SegXX&0x40) bi_4b=1; if (SegXX&0x20) bi_4c=1; if (SegXX&0x10) SegBuf3|=0x01; if (SegXX&0x08) SegBuf2|=0x01; if (SegXX&0x04) SegBuf0|=0x01; if (SegXX&0x02) SegBuf1|=0x01;/*一个BCD码转化成两个十进制数(如:0x79转化成0x07和0x09)*/BcdToDec(unsigned char BcdValue,unsigned char *pDecValue) /if (BcdValue=0x9a|(BcdValue&0x0f)=0x0a) return 0; *pDecValue+=(BcdValue&0xf0)4; *pDecValue=BcdValue&0x0f; /return 1; /初始化MCS51内部资源InitInterResource() IE=0; /关全部中断 TCON=0; /清全部中断请求 IP=0; /清中断优先级 TMOD=0x01; /T0工作方式1(16位定时器) TH0=0x00; /T0定时器辅初值 TL0=0x00; TR0=1; /允许T0定时 ET0=1; /允许T0中断 EA=0; /关全局中断 RTC_RST=0; void main() InitInterResource(); ini_rtc(); /初始化DS1302 rtc_wr_time(ClockBuffer); /写入时间初始值 EA=1; /开全局中断 while(1) /定时器0中断服务程序,5ms定时器,4位数码管动态显示驱动void tmr0_p(void) interrupt 1 TL0=0x78; /重新定时5ms TH0=0xec; Seg2Seg(); P3M1=0x3c; P3M0=0x00; switch(ScanCoun) /动态扫描显示 case 0: /COM0正向驱动 P1= SegBuf0; BI_4= bi_4a; COM0=0; P3M1=0x1c; /除COM0输出外,其余COM设为输入 P3M0=0x00; break; case 1: /COM0反向驱动 P1= SegBuf0; BI_4= bi_4a; COM0=1; P3M1=0x1c; P3M0=0x00; break; case 2: /COM1正向驱动 P1= SegBuf1; BI_4= bi_4b; COM1=0; P3M1=0x2c; P3M0=0x00; break; case 3: /COM1反向驱动 P1= SegBuf1; BI_4= bi_4b; COM1=1; P3M1=0x2c; P3M0=0x00; break; case 4: /COM2正向驱动 P1= SegBuf2; BI_4= bi_4c; COM2=0; P3M1=0x34; P3M0=0x00; break; case 5: /COM2反向驱动 P1= SegBuf2; BI_4= bi_4c; COM2=1; P3M1=0x34; P3M0=0x00; break; case 6: /COM3正向驱动 P1= SegBuf3; COM3=0; P3M1=0x38; P3M0=0x00; RTC_RST=0; rtc_rd_time(ClockBuffer); /读时间 BcdToDec(ClockBuffer0,DisplayBuf+2); /秒送入显示缓冲 BcdToDec(ClockBuffer1,DisplayBuf); /分送入显示缓冲 BI_4= bi_4c; break; case 7: /COM3反向驱动 P1= SegBuf3; COM3=1; P3M1=0x38; P3M0=0x00; break; ScanCoun+; /下一位 if (ScanCoun7) ScanCoun=0; 单片机直接驱动段式液晶Direct Driving of LCD Using General Purpose IO分析作者:Free 文章来源:Free 点击数: 421 更新时间:2011-3-31 先看看连接图:Notice the pull up resistors on the COM signals: These resistors supply the ? VCC voltage, which is necessary when a COM signal goes to the Inactive state. The ATmega48 simply sets the respective output pin to an input, and the resistors pull the signal to ? VCC.即上拉电阻提供COM需要的1/2VCC电压,当COM对应的单片机引脚为输入的时候,COM为1/2VCC再看一下显示字符0-9所需要的码表,需要COM1(A,B脚输入数据) ,COM2(A,B脚输入数据) ,COM3(A,B脚输入数据) ,COM4(A,B脚输入数据) 全都经过一遍才能显示一个字符下面是Diagram of COM1-COM4 SignalsThe total time for all 4 COMs to cycle is approximately 16 msec, which refreshes the LCD at about a 60 Hz rate.。每个COM高电平持续时间为2ms,用单片机时候需要定时器产生2ms的中断=下面程序:Mega48的,明天移植到mega16/ File name: LCX_App_Note_5_3_05.c Demo C code to run Pacific Displays PPD-332 3 1/2 digit LCD/ Compiled with CodeVision AVR, version 1.24.4a Evaluation version, available from http:/www.hpinfotech.ro/ This program displays 4 incrementing decimal digits on the LCD. LCD has 4 COMs and 8 segment connections (12 total)/ COM1-COM4 outputs on PORTD/Segment Outputs on PORTC, called 1A, 1B, 2A, 2B, 3A, 3B to match A&B values in segment_table array/ The PD-332 has identical LCD wiring for each of 3 digits; 2 segment pins per digit, labeled A and B#include unsigned char segs_out = 0;unsigned char state_counter = 8;unsigned char output_change = 0;unsigned char LCD_d_1 =0; / counter starts at 000unsigned char LCD_d_2 =0;unsigned char LCD_d_3 =0;unsigned char LCD_d_4 =0;unsigned char Pt_1_sec =0; / 0.1 second counter/ Prototypes defined
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年执业医师考试复习全攻略及试题及答案
- 2025年经济法知识点提炼试题及答案
- 2025年卫生资格考试合规性试题及答案
- 2025年执业护士考试技能操作试题与答案
- 知识提升之路卫生资格考试试题及答案
- 2025年经济法快速复习试题及答案
- 日常护理流程试题及答案
- 主管护师考试实时反馈机制探讨试题及答案
- 2025年实习护工的要求试题及答案
- 科目分析执业医师考试试题及答案核心
- 中国古代的声学成就
- MOOC 英国小说-南京大学 中国大学慕课答案
- 房建监理投标文件技术部分
- 新厂规划方案
- 门窗知识讲解课件
- 室速的护理措施
- 镇痛药物在糖尿病足疼痛治疗中的效果评估
- 北京南站流线分析报告
- 洼田饮水试验操作指引
- 咖啡品鉴大全
- 狂犬病暴露预防处置工作规范(2023年版)课件
评论
0/150
提交评论