完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、项目描述
本次项目是在上次用单片机做的计算器在有一定改进的基础上新加了时钟显示的 功能。之前所做的计算器只能实现简单的加减乘除运算,经后期改进,使其可以连续运算更符合我们心中的计算器的形象。加入时钟功能后,在使用单片机计算器功能时,如果一直不按键持续十秒,则进入时钟显示模式。进入时钟模式后,数码管前面两位显示时,中间两位显示分钟,后两位显示秒数。当之后任意键按下时,单片机恢复计算器模式,且根据按下键对进入时钟模式之前状态的数值进行处理。 二、 关键技术 在计算器功能上加入时钟模式,主要使用了时钟中断。 时钟中断: void timer0_INT_SRV(void) interrupt 1 { TL0 = (65536-46080)%256;//(65536-50000*11.0592/12)%256; TH0 = (65536-46080)/256; FOUT = !FOUT; if(++count1s>=20) //计时1秒 { time++; count1s=0; counter_key++; if(counter_key>=60) {counter_key=0; fen++; if(fen>=60) { fen=0; shi++; if(shi>=24) { shi=0; } } } } } 可以看到在单片机的时钟中断程序里,每二十次中断,秒数变量counter_key自加一次, 相当于计时一秒,时间积累变量time(初始值为0)也会自加一次。每当counter_key等于60则清零,并使分钟变量fen自加,同理,当分等于60则清零,并使时钟变量shi自加。而当shi等于24时,就使shi清零。可以看出变量counter_key、fen、shi对应了时钟的秒数,分钟和小时。变量time就是使单片机进入时钟模式的关键变量。 为使变量time起作用,在键盘码散转程序keybranch中,我便设置了每进入一次该函数,便使得time为0。也就是每次按键后time就会重置记录,按键后的等待时长。 得到时长后,进行判断就容易了。 所以在主函数里 void main(void) { byte k; TIMER0_init(); while(1) { if(time>10)shizhong(); k=keysearch(); if(k!=0xff) { delayms(10);//有键按下 k=keysearch(); keybranch(k); do { HEX_TO_BCD(dat);dot=0; k=keysearch(); scandisp(); } while(k!=0xff); //等待键释放 } calculate_handle(); scandisp(); } } 可以看到,在主程序循环里面,第一步就是检测变量time,当其大于10时,即按键10秒内无继续按键则进入时钟显示程序。这个程序很简单,就是让数码管分别显示shi、fen、counter_key的值。主函数之后的语句就是检测按键,消除抖动,每次按键就会使数码管显示计算器计算数据dat。 |
|
|
|
只有小组成员才能发言,加入小组>>
2975 浏览 9 评论
2692 浏览 16 评论
3214 浏览 1 评论
8438 浏览 16 评论
3777 浏览 18 评论
6961浏览 6评论
求助,请问MS51FB9AE带隙电压能作为侦测的基准电压吗?
7457浏览 3评论
6958浏览 3评论
支持UART-to-BLE透传的新唐NuTool – BLE ATCMD开发工具推荐
5805浏览 3评论
9375浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 10:59 , Processed in 1.093504 second(s), Total 75, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号