完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
用52单片机做的一个1602液晶显示时分秒的程序,按功能键时,定时器没关,按键没用,显示还在走,程序如下:
#include #define uchar unsigned char #define uint unsigned int ***it rs=P1^0;//1602数据/指令选择端 ***it rw=P1^1;//1602读/写选择端 ***it e=P1^2;//1602使能信号端 ***it beep=P1^5;//蜂鸣器控制口 ***it s1=P3^7;//按键-功能键 ***it s2=P3^6;//按键-增大键 ***it s3=P3^5;//按键-减小键 uchar code table1[]="2013-12-16 MON"; char miao,fen,shi; char zd; uchar miaoge,miaoshi,fenge,fenshi,shige,shishi; void delay(uint z)//延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void di()//蜂鸣器发声子函数 { beep=0; delay(100); beep=1; } void write_com(uchar com)//1602液晶写指令子函数 { rs=0;//写指令 P0=com;//送指令 delay(5); e=1;//使能信号高脉冲 delay(5); e=0;//使能信号低完成一次写指令 } void write_date(uchar date)//1602液晶写数据子函数 { rs=1;//写数据 P0=date;//送数据 delay(5); e=1;//使能信号高脉冲 delay(5); e=0;//使能信号低完成一次写数据 } void write_sfm(uchar add,uchar date)//写时分秒子函数 { uchar ge,shi; shi=date/10;//数据除10商给shi,余给ge ge=date%10; write_com(0x80+0x40+add);//写液晶第二行指令定义位置 write_date(0x30+shi);//ASCII表和1602的表,查表,液晶显示shi,ge数据 write_date(0x30+ge);// } void keyscan()//键盘扫描子函数 { uint s1num; //uchar miaoge,miaoshi,fenge,fenshi,shige,shishi; if(s1==0)//功能键按下 { delay(10); if(s1==0)//确认功能键按下 { s1num++;//功能键按下次数记录 while(!s1);//功能键释放确认 di();//按键按下蜂鸣器发声 if(s1num==1)//功能键第一次按下 { TR0=0;//关定时器 write_com(0x80+0x40+11);//光标定位到秒个位位置 write_com(0x0f);//光标开始闪烁 } if(s1num==2)//功能键第二次按下 { write_com(0x80+0x40+10);//光标定位到秒十位位置 } if(s1num==3)//功能键第三次按下 { write_com(0x80+0x40+8);//定位到分个位位置 } if(s1num==4)//功能键第四次按下 { write_com(0x80+0x40+7);//定位到分十位位置 } if(s1num==5)//功能键第五次按下 { write_com(0x80+0x40+5);//定位到时个位位置 } if(s1num==6)//功能键第五次按下 { write_com(0x80+0x40+4);//定位到时十位位置 } if(s1num==7)//功能键第四次按下 { s1num=0;//记录次数清零 write_com(0x0c);//关光标 TR0=1;//启动定时器 } } } if(s1num!=0)//只有功能键按下,增大减小键才起作用 { if(s2==0)//增大键按下 { delay(10); if(s2==0)//确认增大键按下 { while(!s2);//释放确认 di();//蜂鸣器响 if(s1num==1) { miaoge=miao%10; miaoge++; if(miaoge==10) miaoge=0; write_com(0x80+0x40+11); write_date(0x30+miaoge); write_com(0x80+0x40+11); } if(s1num==2) { miaoshi=miao/10; miaoshi++; if(miaoshi==6) miaoshi=0; write_com(0x80+0x40+10); write_date(0x30+miaoshi); write_com(0x80+0x40+10); } if(s1num==3) { fenge=fen%10; fenge++; if(fenge==10) fenge=0; write_com(0x80+0x40+8); write_date(0x30+fenge); write_com(0x80+0x40+8); } if(s1num==4) { fenshi=fen/10; fenshi++; if(fenshi==10) fenshi=0; write_com(0x80+0x40+7); write_date(0x30+fenshi); write_com(0x80+0x40+7); } if(s1num==5) { shige=shi%10; shige++; if(shishi==2) { if(shige==5) shige=0; } else { if(shige==10) shige=0; } write_com(0x80+0x40+5); write_date(0x30+shige); write_com(0x80+0x40+5); } if(s1num==6) { shishi=shi/10; shishi++; if(shishi==3) shishi=0; write_com(0x80+0x40+4); write_date(0x30+shishi); write_com(0x80+0x40+4); } } } if(s3==0)//减小键按下 { delay(5); if(s3==0)//确认减小键按下 { while(!s3);//释放确认 di();//蜂鸣器响 if(s1num==1) { miaoge=miao%10; miaoge--; if(miaoge==-1) miaoge=9; write_com(0x80+0x40+11); write_date(0x30+miaoge); write_com(0x80+0x40+11); } if(s1num==2) { miaoshi=miao/10; miaoshi--; if(miaoshi==-1) miaoshi=5; write_com(0x80+0x40+10); write_date(0x30+miaoshi); write_com(0x80+0x40+10); } if(s1num==3) { fenge=fen%10; fenge--; if(fenge==-1) fenge=9; write_com(0x80+0x40+8); write_date(0x30+fenge); write_com(0x80+0x40+8); } if(s1num==4) { fenshi=fen/10; fenshi--; if(fenshi==-1) fenshi=5; write_com(0x80+0x40+7); write_date(0x30+fenshi); write_com(0x80+0x40+7); } if(s1num==5) { shige=shi%10; shige--; if(shishi==2) { if(shige==-1) shige=3; } else { if(shige==-1) shige=9; } write_com(0x80+0x40+5); write_date(0x30+shige); write_com(0x80+0x40+5); } if(s1num==6) { shishi=shi/10; shishi--; if(shishi==-1) shishi=2; write_com(0x80+0x40+4); write_date(0x30+shishi); write_com(0x80+0x40+4); } } } } } void main()//主函数 { uchar num1; //1602液晶初始化 rw=0;//写选择 write_com(0x38);//设置16*2显示,5*7点阵。8位数据接口 write_com(0x0c);//开显示 write_com(0x06);//写一个字符后指针加1 write_com(0x01);//显示清屏 //初始第一行显示 write_com(0x80); for(num1=0;num1<15;num1++) { write_date(table1[num1]); delay(10); } //初始第二行显示 write_com(0x80+0x40+4); write_date('0'); write_date('0'); delay(5); write_com(0x80+0x40+6); write_date(':'); delay(5); write_com(0x80+0x40+7); write_date('0'); write_date('0'); delay(5); write_com(0x80+0x40+9); write_date(':'); delay(5); write_com(0x80+0x40+10); write_date('0'); write_date('0'); delay(5); // 定时器0初始 TMOD=0x01;//选定时器0工作方式1 TH0=(65536-50000)/256;//给定时器0赋初值 TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0*/ while(1) { keyscan(); } } void time0(void) interrupt 1//定时器0中断服务程序 { TH0=(65536-50000)/256;//重装定时器0初值 TL0=(65536-50000)%256; zd++; if(zd==20)//1秒时间到 { zd=0; miao++; if(miao==60)//一分钟到 { miao=0; fen++; if(fen==60)//一小时到 { fen=0; shi++; if(shi==24)//一天到 { shi=0; } write_sfm(4,shi);//小时变化重新写入 } write_sfm(7,fen);//分钟变化重新写入 } write_sfm(10,miao);//秒变化重新写入 } } |
|
相关推荐
3个回答
|
|
{:23:}{:23:}{:23:}
|
|
|
|
看看。。。。。。。。。。。。。。。。
|
|
|
|
有没有人知道什么问题呀?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
122 浏览 0 评论
565 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
772 浏览 0 评论
948 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
658 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12041 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 20:25 , Processed in 0.785980 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号