完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`题目是这样的: 数码管前三位显示一个跑表,从000到999之间以1秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。 错误: 大体功能我实现了,但是有些细节没搞明白,也没解决,恳请各位老哥帮我看一下,看看问题出在哪里不胜感激。就是我按下key2和key3是数码管会灭两个,但是功能正常,而且最后一个数码管会格外的亮。后面我会附上两张图,请各位大哥看一下,下面我把我的程序贴上去。 程序: #include #define uint unsigned int #define uchar unsigned char ***it key1=P3^4; ***it key2=P3^5; ***it key3=P3^6; ***it key4=P3^7; ***it dula=P2^6; ***it wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uchar bai,shi,ge,tt; uint num; void keyscan(); void init(); void delay(uint z); void display(uchar bai,uchar shi,uchar ge); void main() { init(); while(1) { bai=num/100; //给百十个位定义 shi=num%100/10; ge=num%10; keyscan(); display(bai,shi,ge); //调用显示子程序 } } //----------------------------- void init() //初始化函数 { num=0; tt=0; TMOD=0x01; //定时方式1 EA=1; //总中断打开 ET0=1; //定时T0允许中断 TR0=1; //打开定时T0中断 TH0=(65536-50000)/256; //给定时器T0附初值 TL0=(65536-50000)%256; } //-------------------------------- void exter() interrupt 1 //T0工作方式1 { TH0=(65536-50000)/256; //给定时器T0附初值 TL0=(65536-50000)%256; tt++; } //------------------------------- void delay(uint z) { uint x,y; //延时程序延时一毫秒 for(x=z;x>0;x--) for(y=110;y>0;y--); } //-------------------------------- void display(uchar bai,uchar shi,uchar ge) //3位显示程序 { dula=1; P0=table[bai]; dula=0; //对百位赋值 P0=0xff; //防止数据进入位选造成错乱 wela=1; P0=0xfe; wela=0; delay(1); //打开数码管第一个即百位 dula=1; P0=table[shi]; dula=0; //对十位赋值 P0=0xff; //防止数据进入位选造成错乱 wela=1; P0=0xfd; wela=0; delay(1); //打开数码管第二个即十位 dula=1; P0=table[ge]; dula=0; //对个位赋值 P0=0xff; //防止数据进入位选造成错乱 wela=1; P0=0xfb; wela=0; delay(1); //打开数码管第三个即个位 } //--------------------------------------- void keyscan() //键盘扫描程序 { if(key1==0) //判断key1是否按下 { delay(5); //防抖 if(key1==0) { TR0=0; //关闭定时器 dula=1; //关闭数码管 P0=0xff; dula=0; delay(1); wela=1; P0=0xff; wela=0; } while(!key1); //判断key1是否松开 delay(5); //防抖 while(!key1); TR0=1; //打开定时器 } else //key1断开 { if(tt==20) //判断是否一秒 { tt=0; //一秒一数 num++; //数字累加 if(num==999) //判断NUM是否为999 { num=0; //num归0 } } } //------------------------------- if(key2==0) //判断key2是否按下 { delay(5); //消抖 if(key2==0) { TR0=0; //关闭定时器 } while(!key2); //抬起检测 delay(5); while(!key2); } //-------------------------------- if(key3==0) { delay(5); if(key3==0) { TR0=0; //关闭定时器 } while(!key3); //抬起检测 delay(5); while(!key3); TR0=1; //开启定时器 } //---------------------------------- if(key4==0) { delay(5); if(key4==0) { num=0; if(tt==20) //判断是否一秒 { tt=0; //一秒一数 num++; //数字累加 if(num==999) //判断NUM是否为999 { num=0; //num归0 } } } } } ` |
|
相关推荐
1个回答
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
828 浏览 0 评论
824 浏览 0 评论
861 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
836 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1292 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11821 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 11:06 , Processed in 0.698996 second(s), Total 85, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号