1、void lcd_pos(char pos); /LCD数据指针位置程序 void lcd_init(); /LCD初始化设定程序 void pro_timedate(); /时间日期处理程序 void pro_display(); /显示处理程序 void pro_key(); /按键处理程序 void time_alarm(); /定时报警功能(闹钟) unsigned char scan_key(); /按键扫描程序 unsigned char week_proc(); /星期自动计算与显示函数 bit leap_year(); /判断是否为闰年 void lcd_sef_chr();
2、/LCD自定义字符程序 void update_disbuf(unsigned char t1,unsigned char t2,unsigned char dis_h,unsigned char dis_m,unsigned char dis_s); /更新显示缓冲区函数 / 延时程序 void delay(unsigned char ms) while(ms-) unsigned char i; for(i = 0; i 250; i+) _nop_(); /执行一条_nop_()指令为一个机器周期 /测试LCD忙碌状态 bit lcd_busy() bit result; rs = 0;
3、 rw = 1; ep = 1; result =(bit)(P0&0x80); /LCD的D0-D7中,D7=1为忙碌,D7=0为空闲 ep = 0; return result;/写入指令到LCD void lcd_wcmd(char cmd) while(lcd_busy(); /当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令 rw = 0; P0 = cmd;/写入数据到LCD void lcd_wdat(char dat) /当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据 rs = 1; P0 = dat;/
4、LCD数据指针位置程序 void lcd_pos(char pos) lcd_wcmd(pos|0x80); /数据指针=80+地址码(00H27H,40H67H) /设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00-0x07,即可定义8个字符) /这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001) void lcd_sef_chr() /第一个自定义字符 lcd_wcmd(0x40); /01 000 000 第1行地址 (D7D6为地址设定命令形式D5D4D3为字符存放位置(0-7),D2D1D0为字符行地址(0-7) lcd_w
5、dat(0x1f);XXX 11111 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) lcd_wcmd(0x41);01 000 001 第2行地址 lcd_wdat(0x11);XXX 10001 第2行数据 lcd_wcmd(0x42);01 000 010 第3行地址 lcd_wdat(0x15);XXX 10101 第3行数据 lcd_wcmd(0x43);01 000 011 第4行地址 第4行数据 lcd_wcmd(0x44);01 000 100 第5行地址 第5行数据 lcd_wcmd(0x45);01
6、000 101 第6行地址 lcd_wdat(0x0a);XXX 01010 第6行数据 lcd_wcmd(0x46);01 000 110 第7行地址 第7行数据 lcd_wcmd(0x47);01 000 111 第8行地址 lcd_wdat(0x00);XXX 00000 第8行数据 /第二个自定义字符 lcd_wcmd(0x48);01 001 000 第1行地址 lcd_wdat(0x01);XXX 00001 第1行数据 lcd_wcmd(0x49);01 001 001 lcd_wdat(0x1b);XXX 11011 lcd_wcmd(0x4a);01 001 010 lcd_
7、wdat(0x1d);XXX 11101 lcd_wcmd(0x4b);01 001 011 lcd_wdat(0x19);XXX 11001 lcd_wcmd(0x4c);01 001 100 lcd_wcmd(0x4d);01 001 101 lcd_wcmd(0x4e);01 001 110 lcd_wcmd(0x4f);01 001 111 第8行数据 /LCD初始化设定 void lcd_init() lcd_wcmd(0x38); /设置LCD为16X2显示,5X7点阵,八位数据借口 delay(1); lcd_wcmd(0x0c); /LCD开显示及光标设置(光标不闪烁,不显示-
8、) lcd_wcmd(0x06); /LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) lcd_wcmd(0x01); /清除LCD的显示内容 /闰年的计算 bit leap_year() bit leap; if(year%4=0&year%100!=0)|year%400=0)/闰年的条件 leap=1; else leap=0; return leap;/星期的自动运算和处理 unsigned char week_proc() unsigned char num_leap; unsigned char c; num_leap=year/4-year/100+year/400;/
9、自00年起到year所经历的闰年数 if( leap_year()& month 59) sec = 0; min+; if(min59) min=0; hour+; if(hour23) hour=0; date+; if (month=1|month=3|month=5|month=7|month=8|month=10|month=12) if (date31) date=1;month+; /大月31天 if (month=4|month=6|month=9|month=11) 30) date=1; /小月30天 if (month=2) if( leap_year() /闰年的条件
10、if (date29) date=1; /闰年2月为29天 28) date=1; /平年2月为28天 if (month12) month=1;year+; if (year99) year=0; week_proc(); if (sec=armsec & min=armmin & hour=armhour) if (alarm) TR1=1; /闹钟启用时,报警时间到,启动Timer1 /显示处理程序 void pro_display() unsigned char i; lcd_pos(0x00); for (i=0;i= 100) /1秒时间 (100*10ms=1000ms=1s)
11、sec100 = 0; pro_timedate();/调用时间和日期处理程序 if (sec&0x01) /willar闪一秒,停一秒 update_disbuf(0x00, ,hour,min,sec); /0x00表示显示00位置的自定义字符 pro_display(); /调用显示处理函数 /按键扫描程序 unsigned char scan_key() skey=0x00; /给变量vkey置初值 skey|=PRE; /读取PRE键的状态 skey=skey23) armhour=0; /光标回到原调整位置 case 2:armmin+; if (armmin59) armmin=0;armsec+; if (armsec59) armsec=0;,armhour,armm