完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 in发烧友ing 于 2013-3-3 10:39 编辑
//液晶数字时钟(重影问题还有待于解决) #include #define uchar unsigned char #define uint unsigned int ***it wela=P2^7; ***it dula=P2^6;//数码管 ***it rs=P3^5; ***it rw=P2^7; ***it e=P3^4;//液晶 ***it scom=P3^7; ***it s18=P3^0;//功能键 ***it s19=P3^1;//增加键 ***it s20=P3^2;//减小键 uchar code table1[]=" GOOD! 2013.2.28"; uchar code table2[]=" 00:00:00"; uchar count,keynum;// 计数,注意 char比int省内存些,单片机一般用char char shi,fen,miao;//注意是有符号型 void delay(uint z)//延时函数 { uint x,y; for(x=0;x for(y=0;y<110;y++); } void write_zl(uchar zl)//写指令函数 { rs=0; rw=0;//写 P0=zl; delay(5); //e一个高脉冲(初始为低) e=1;//e拉高 delay(5); e=0;//e拉低 } void write_date(uchar date)//写数据函数 { rs=1; rw=0; P0=date; delay(5); e=1; delay(5); e=0; } void write_change(uchar add,uchar numb)//调整时钟写显示 { uchar sw,gw; //将数字拆分为十位和个位 sw=numb/10; gw=numb%10; write_zl(0x80+0x40+add);//指针地址 write_date(0x30+sw);//写十位 write_date(0x30+gw);//写个位 } void write_key()//按键调整时钟 { scom=0; keynum=0; if(s18==0)//功能键按下 { delay(5); if(s18==0)//消抖 { keynum++; while(!s18);//等待松手 if(keynum==1)//按键次数 { TR0=0;//关定时器 write_zl(0x80+0x40+10);//指针指向秒(特别注意10是十进制的) write_zl(0x0f);//光标闪烁 } if(keynum==2) { write_zl(0x80+0x40+7);//指针指向分 } if(keynum==3) { write_zl(0x80+0x40+4);//指针指向时 } if(keynum==4) { keynum=0; write_zl(0x0c); TR0=1;//继续定时器 } } } if(keynum!=0) { if(s19==0)//增加键按下 { delay(5); if(s19==0) { while(!s19); if(keynum==1) { miao++; if(miao==60) miao=0; write_change(10,miao); write_zl(0x80+0x40+10);//指针回到秒的个位处 } if(keynum==2) { fen++; if(fen==60) fen=0; write_change(7,fen); write_zl(0x80+0x40+7);//指针回到秒的个位处(防止上一步跑到十位处) } if(keynum==3) { shi++; if(shi==24) shi=0; write_change(4,shi); write_zl(0x80+0x40+4);//指针回到秒的个位处(防止上一步跑到十位处) } } } if(s20==0)//减小键按下 { delay(5); if(s20==0) { while(!s20); if(keynum==1) { miao--; if(miao==-1) miao=59; write_change(10,miao); write_zl(0x80+0x40+10); } if(keynum==2) { fen--; if(fen==-1) fen=59; write_change(7,fen); write_zl(0x80+0x40+7); } if(keynum==3) { shi--; if(shi==-1) shi=23; write_change(4,shi); write_zl(0x80+0x40+4); } } } } } void init()//初始化函数 { uchar num; wela=0; dula=0;//关数码管 e=0;//初始为低 write_zl(0x38);//写显示模式指令 write_zl(0x0c);//开显示,不显示光标,不闪烁 write_zl(0x06);//读或写时指针自动加一 write_zl(0x01);//清屏 write_zl(0x80);//指针指向第一行 for(num=0;num<16;num++) { write_date(table1[num]);//显示第一行 delay(20); } write_zl(0x80+0x40);//指针指向第二行 for(num=0;num<12;num++) { write_date(table2[num]);//显示第二行 delay(20); } TMOD=0x01;//定时器0方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256;//装初值50毫秒 EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//启动定时器 } void main()//主函数 { init(); while(1) { write_key(); } } void timer() interrupt 1//定时器中断 { TH0=(65535-50000)/256; TL0=(65535-50000)%256;//装初值50毫秒 count++; if(count==20)//一秒(50*20) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } write_change(4,shi);//显示动态的时 } write_change(7,fen);//显示动态的分 } write_change(10,miao);//显示动态的秒 } }
|
|
相关推荐
1个回答
|
|
跟据郭天祥的教程10数字时钟自己写的,按下控制键有反应,光标闪烁,但无法控制时钟加减,
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
180 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
587 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
549 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
548 浏览 0 评论
1051 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11763 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:31 , Processed in 0.571335 second(s), Total 72, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号