完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
示例中用LCD1602做了一个简单的时钟,但是调整时间的时候,没有闪烁也没有光标提示,也不知道,现在是调整 时,还是 分。
/******************************************************************************* * 实验名 : 定时器实验 * 使用的IO : * 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择 *选择设置加1。 * 注意 : *******************************************************************************/ #include #include"lcd.h" ***it K1=P3^0; ***it K2=P3^1; ***it K3=P3^2; ***it K4=P3^3; unsigned char time; //用来计时间的值 void Delay1ms(unsigned int c); void TimerConfiguration(); void Int0Configuration(); unsigned char SetPlace; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { unsigned char hour,minute,second; unsigned int i; TimerConfiguration(); Int0Configuration(); LcdInit(); hour=12; LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteData('-'); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteData('-'); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); while(1) { if(TR0==0) { if(K1==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K1==0) { SetPlace++; if(SetPlace>=3) SetPlace=0; } while((i<50)&&(K1==0)) //检测按键是否松开 { Delay1ms(1); i++; } i=0; } if(K2==0) //检测按键K3是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { if(SetPlace==0) { second++; if(second>=60) second=0; } else if(SetPlace==1) { minute++; if(minute>=60) minute=0; } else { hour++; if(hour>=24) hour=0; } } while((i<50)&&(K2==0)) //检测按键是否松开 { Delay1ms(1); i++; } i=0; } } if(Time>=20) //一秒钟来到改变数值 { Time=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } //--显示时钟--// LcdWriteCom(0x80); LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteCom(0x83); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteCom(0x86); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); } } /******************************************************************************* * 函 数 名 : Delay1ms() * 函数功能 : 延时1ms * 输 入 : c * 输 出 : 无 *******************************************************************************/ void Delay1ms(unsigned int c) //误差 0us { unsigned char a,b; for (; c>0; c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : TimerConfiguration() * 函数功能 : 配置定时器值 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void TimerConfiguration() { TMOD = 0x01; //选择工作方式1 TH0 = 0x3C; //设置初始值 TL0 = 0x0B0; EA = 1; //打开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //启动定时器0 } /******************************************************************************* * 函 数 名 : Timer0() * 函数功能 : 定时器0中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Timer0() interrupt 1 { TH0 = 0x3C; //设置初始值 TL0 = 0x0B0; Time++; } /******************************************************************************* * 函 数 名 : Int0Configuration() * 函数功能 : 配置外部中断0 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /******************************************************************************* * 函 数 名 : Int0() interrupt 0 * 函数功能 : 外部中断0的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0() interrupt 0 { Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=0; } } 在第2个程序中,为了标明,现在调整的是 时,还是 分,我在时间的下面,对应位置上,添加 了个 * 号, /******************************************************************************* * 实验名 : 定时器实验 * 使用的IO : * 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择 *选择设置加1。 * 注意 : *******************************************************************************/ #include #include"lcd.h" ***it K1=P3^0; ***it K2=P3^1; ***it K3=P3^2; ***it K4=P3^3; unsigned char Time; //用来计时间的值 void Delay1ms(unsigned int c); void TimerConfiguration(); void Int0Configuration(); unsigned char SetPlace; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { unsigned char hour,minute,second; unsigned int i; TimerConfiguration(); Int0Configuration(); LcdInit(); hour=12; LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteData(':'); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteData(':'); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); while(1) { if(TR0==0) { LcdWriteCom(0xc7); LcdWriteData('*'); if(K1==0) //检测按键K1是否按下 { Delay1ms(10); //消除抖动 if(K1==0) { SetPlace++; if(SetPlace>=3) SetPlace=0; } while((i<50)&&(K1==0)) //检测按键是否松开 { Delay1ms(1); i++; } i=0; switch(SetPlace) {case 0 : {LcdWriteCom(0x01); LcdWriteCom(0xc7); LcdWriteData('*'); }break; case 1 : {LcdWriteCom(0x01); LcdWriteCom(0xc4); LcdWriteData('*'); }break; case 2 : {LcdWriteCom(0x01); LcdWriteCom(0xc1); LcdWriteData('*'); }break; } } if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { if(SetPlace==0) { second++; if(second>=60) second=0; } else if(SetPlace==1) { minute++; if(minute>=60) minute=0; } else { hour++; if(hour>=24) hour=0; } } while((i<50)&&(K2==0)) //检测按键K2是否松开 { Delay1ms(1); i++; } i=0; } } if(Time>=20) //一秒钟来到改变数值 { Time=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } //--显示时钟--// LcdWriteCom(0x80); LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteData(':'); LcdWriteCom(0x83); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteData(':'); LcdWriteCom(0x86); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); } } /******************************************************************************* * 函 数 名 : Delay1ms() * 函数功能 : 延时1ms * 输 入 : c * 输 出 : 无 *******************************************************************************/ void Delay1ms(unsigned int c) //误差 0us { unsigned char a,b; for (; c>0; c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 数 名 : TimerConfiguration() * 函数功能 : 配置定时器值 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void TimerConfiguration() { TMOD = 0x01; //选择工作方式1 TH0 = 0x3C; //设置初始值 50ms TL0 = 0xB0; EA = 1; //打开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //启动定时器0 } /******************************************************************************* * 函 数 名 : Timer0() * 函数功能 : 定时器0中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Timer0() interrupt 1 { TH0 = 0x3C; //设置初始值 50ms TL0 = 0xB0; Time++; } /******************************************************************************* * 函 数 名 : Int0Configuration() * 函数功能 : 配置外部中断0 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } /******************************************************************************* * 函 数 名 : Int0() interrupt 0 * 函数功能 : 外部中断0的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Int0() interrupt 0 { Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=0; if(TR0==1) {LcdWriteCom(0x01);} } } 我现在想请教的是,在调整时间的时候,怎样让数字闪烁,或者相应位置的光标闪烁,以提示,现在调整的是,小时,分钟,感谢。 |
|
相关推荐
3个回答
|
|
1602是有光标闪烁功能的,自己看数据手册
|
|
|
|
按照寄存器控制方式设置光标闪烁后,其他位置也会闪烁,必须在显示完那一位后在把光标关掉。如果是调时,比如我现在要求小时光标闪烁,我设置好光标模式后,显示分 秒 和其他位置时,也会有光标。。。这个怎么解决呢? |
|
|
|
|
|
1 条评论
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
787 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
1476 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1216 浏览 0 评论
900 浏览 0 评论
963 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11866 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 05:17 , Processed in 0.619682 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号