LCD1602电子钟有图有真相.docx
- 文档编号:3319991
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:17
- 大小:82.31KB
LCD1602电子钟有图有真相.docx
《LCD1602电子钟有图有真相.docx》由会员分享,可在线阅读,更多相关《LCD1602电子钟有图有真相.docx(17页珍藏版)》请在冰豆网上搜索。
LCD1602电子钟有图有真相
亲测有效!
顺利通过课程设计!
有图有真相
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P0^5;//寄存器类型,1表示数据寄存器,2表示指令寄存器
sbitrw=P0^6;//读写选择,1表示读,0表示写
sbitep=P0^7;//读写使能,下降沿使能
sbitpcf8563_scl=P0^4;
sbitpcf8563_sda=P0^3;
sbitsetup=P1^0;
sbitshi=P1^1;
sbitfen=P1^2;
sbitled=P1^6;
ucharnum[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//数字
ucharsg;
ucharsd;
ucharfg;
ucharfd;
ucharmg;
ucharmd;
ucharng;
ucharnd;
ucharyg;
ucharyd;
ucharrg;
ucharrd;
ucharhou=14;
ucharmin=30;
ucharsec=0;
ucharyear=12;
ucharmon=12;
ucharday=12;
ucharweek=3;
ucharnumber;
bitbusy;
voidstart_pcf8563(void);
voidsend_pcf8563_byte(void);
voidlcd_init(void);
voidlcd_pos(ucharpos);
voidlcd_wdat(uchardat);
bitlcd_busy();
voiddisplay0(void);
voiddisplay(void);
voidstop_pcf8563(void);
voidreceive_pcf8563_byte(void);
voidspit_time(void);
voidupdate(void);
voidscan(void);
voiddelay(ucharms);
voiddelay(uintt)//单位延时1ms,总延时1ms*t.(121为实验测试值)
{
uinti,j;
for(i=0;i for(j=0;j<121;j++); } bitlcd_busy()//判断LCD是否忙碌,1忙碌 { bitresult; rs=0; rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P2&0x80); ep=0; returnresult; } voidlcd_wcmd(ucharcmd)//写指令 { while(lcd_busy());//判断LCD是否忙碌 rs=0; rw=0; ep=0; _nop_(); _nop_(); P2=cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } voidlcd_pos(ucharpos)//显示地址 { lcd_wcmd(pos|0x80); } //写数据 voidlcd_wdat(uchardat) { while(lcd_busy());//判断LCD是否忙碌 rs=1; rw=0; ep=0; P2=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } voidlcd_wstr(constuchar*s)//写字符串 { unsignedchari=0; while(s[i]! ='\0') { lcd_wdat(s[i]);//显示字符 delay(250); i++; } } voidlcd_init()//LCD初始化 { lcd_wcmd(0x3c);//功能设定 delay (1); lcd_wcmd(0x0c);//显示器开关 delay (1); lcd_wcmd(0x06);//设定进入模式 delay (1); lcd_wcmd(0x01);//清除显示屏,把光标移至左上角 delay (1); } voiddisplay0()//显示时钟背景 { lcd_pos(0x00); lcd_wstr("20"); lcd_pos(0x04); lcd_wdat('-'); lcd_pos(0x07); lcd_wdat('-'); lcd_pos(0x46); lcd_wdat(': '); lcd_pos(0x49); lcd_wdat(': '); } voiddisplay()//显示年、月、日、时间和星期 { uchartemp12; uchartemp11; uchartemp10; uchartemp9; uchartemp8; uchartemp7; uchartemp6; uchartemp5; uchartemp4; uchartemp3; uchartemp2; uchartemp1; lcd_pos(0x02); temp12=num[ng]; lcd_wdat(temp12); lcd_pos(0x03); temp11=num[nd]; lcd_wdat(temp11); lcd_pos(0x05); temp10=num[yg]; lcd_wdat(temp10); lcd_pos(0x06); temp9=num[yd]; lcd_wdat(temp9); lcd_pos(0x08); temp8=num[rg]; lcd_wdat(temp8); lcd_pos(0x09); temp7=num[rd]; lcd_wdat(temp7); lcd_pos(0x0c); switch(week%7) { case0: lcd_wstr("SUN");break; case1: lcd_wstr("MON");break; case2: lcd_wstr("TUE");break; case3: lcd_wstr("WED");break; case4: lcd_wstr("THU");break; case5: lcd_wstr("FRI");break; case6: lcd_wstr("SAT");break; } lcd_pos(0x44); temp6=num[sg]; lcd_wdat(temp6); lcd_pos(0x45); temp5=num[sd]; lcd_wdat(temp5); lcd_pos(0x047); temp4=num[fg]; lcd_wdat(temp4); lcd_pos(0x48); temp3=num[fd]; lcd_wdat(temp3); lcd_pos(0x4a); temp2=num[mg]; lcd_wdat(temp2); lcd_pos(0x4b); temp1=num[md]; lcd_wdat(temp1); } voidupdate()//更新时间 { if(sec>59) { min++; sec=0; } if(min>59) { hou++; min=0; } if(hou>23) { day++; week++; hou=0; } if(day>30) { mon++; year=0; } if(mon>12) { year++; mon=0; } if(year>99) year=0; } voidspit_time() { ng=(int)year/10;//年的高位 nd=(int)year%10;//年的低位 yg=(int)mon/10;//月的高位 yd=(int)mon%10;//月的低位 rg=(int)day/10; rd=(int)day%10; sg=(int)hou/10; sd=(int)hou%10; fg=(int)min/10; fd=(int)min%10; mg=(int)sec/10; md=(int)sec%10; } voidscan()//扫描键盘 { if(setup==0) { delay (1); } if(setup==0) { led=0; if(shi==0) { delay (1); } if(shi==0) { hou++; led=1; shi=1; } if(fen==0) { delay(10); } if(fen==0) { min++; led=1; fen=1; } } } voidSend_pcf8563_byte(ucharbb)//向PCF8563发送一个字节 { ucharaa; pcf8563_scl=0; for(aa=0;aa<8;aa++) { if((bb&0x80)==0x80) { pcf8563_sda=1; } else { pcf8563_sda=0; } pcf8563_scl=1; pcf8563_scl=0; bb=bb<<1; } _nop_(); _nop_(); pcf8563_sda=1; pcf8563_scl=1; busy=0; if(pcf8563_sda) { busy=1; } else { _nop_(); _nop_(); pcf8563_scl=0; busy=0; } } voidwrite_pcf8563(ucharsubadd,uchardat)//向PCF8563对应地址写数据 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(! busy) { Send_pcf8563_byte(subadd); if(! busy) { Send_pcf8563_byte(dat); } } stop_pcf8563(); } voidread_pcf8563()//读当时的时,分,钞 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(! busy) { Send_pcf8563_byte(0x02); if(! busy) { start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); sec=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); min=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); hou=number&0x3f; } } stop_pcf8563(); } voidreceive_pcf8563_byte()//从PCF8563接受一个字节 { ucharCC; pcf8563_sda=1; number=0; for(CC=0;CC<8;CC++) { number<<=1; pcf8563_scl=0; pcf8563_scl=1; _nop_(); _nop_(); number=number|pcf8563_sda; } pcf8563_scl=0; _nop_(); _nop_(); } voidstart_pcf8563()//开启PCF8563IIC { pcf8563_sda=1; pcf8563_scl=1; pcf8563_sda=0;//SCL为低,SDA执行一个上跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } voidstop_pcf8563()//关闭PCF8563IIC { pcf8563_sda=0; pcf8563_scl=1; pcf8563_sda=1;//SCL为高,SDA执行一个上跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } voidmain(void) { lcd_init();//初始化LCD delay(10); lcd_pos(0x00);//设置显示位置 //i=0; lcd_wstr("HELLOWORLD! "); lcd_pos(0x40); lcd_wstr("GOODBYE2012! "); delay(5000); lcd_wcmd(0x01); display0(); while (1) { write_pcf8563(0x08,year);//写年 write_pcf8563(0x07,mon);//写月 write_pcf8563(0x05,day);//写日 write_pcf8563(0x02,sec);//写钞 write_pcf8563(0x03,min);//写分 write_pcf8563(0x04,hou);//写时 spit_time(); display(); delay(420); sec++; while(setup==0) { scan(); update(); spit_time(); display(); } led=1; update(); } } 里面有关PCF8563的程序其实没作用,纯属凑数顺便发了个烟雾弹。 以免老师发现没用上PCF8563。 因为楼主没学好,确实不会对PCF8563编程只好略施小计。 放心,老师不仔细看程序是不会发现的(其实老师只要看到效果就行了,一大堆程序他也看不出个所以然)。 只要你的电路板上焊上PCF8563电路部分。 只能帮你们到这了! 以后可得好好学习! ! !
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 电子钟 有图有 真相