完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
题目:数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。在以上基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
问题:我按下启动或者暂停的时候一直按着,只有个位显示,松开正常,怎么按着让他显示暂停的个十百都显示? #include #define uchar unsigned char #define uint unsigned int ***it wei1=P2^2; ***it wei2=P2^3; ***it wei3=P2^4; ***it key2=P3^0; ***it key1=P3^1; ***it key3=P3^2; ***it key4=P3^3; uchar code tableduan[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0x7c,0x39,0x5e,0x79,0x71}; uchar num,bai,shi,ge; uint temp; void init() { temp=0; P0=0X00; TMOD=0X01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=0; } void time() interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; num++; if(num==100) { num=0; temp++; if(temp==999) temp=0; } } void delay(uchar a) { uchar x,y; for(x=a;x>0;x--) for(y=10;y>0;y--); } void display() { bai=temp/100; shi=temp/10%10; ge=temp%10; P0=0X00; wei1=1; wei2=1; wei3=1; P0=tableduan[bai]; // delay(10); P0=0X00; wei1=0; wei2=1; wei3=1; P0=tableduan[shi]; // delay(10); P0=0X00; wei1=1; wei2=0; wei3=1; P0=tableduan[ge]; // delay(10); } void main() { init(); while(1) { display(); if(key1==0) { delay(50); if(key1==0) { TR0=0; while(!key1); } } if(key2==0) { delay(50); if(key2==0) { TR0=1; while(!key2); } } if(key3==0) { delay(50); if(key3==0) { temp=0; while(!key3); } } if(key4==0) { delay(50); if(key4==0) { TR0=~TR0; while(!key4); } } } } |
|
相关推荐
11个回答
|
|
参考下论坛大神 吴坚鸿的按键检测代码吧。 郭老师带领了无数人入门啊,我也是看郭天祥教程入门的。有个普遍的现象就是看郭老师的学生最后都会碰到数码管显示,按键不灵敏之类的问题,主要是老师当时没有刻意提醒一下大家程序的执行效率问题。所以,你要留意了。
最佳答案
|
|
|
|
由于delay造成的
|
|
|
|
P0=0X00; wei1=0; wei2=1; wei3=1; P0=tableduan[shi]; // delay(10); P0=0X00; wei1=1; wei2=0; wei3=1; P0=tableduan[ge]; 我如果把上边的shi和ge换位的话会出现,一直按下十位常亮;delay更改后还是一样? |
|
|
|
if(key1==0)
{ delay(50); if(key1==0) { TR0=0; while(!key1); } 因为这个松手检测造成的,按下后程序停下来了,显示的是最后送显示的那一位。 display里最后显示的个位,所以就只显示个位了。 改进:改变按键检测方法。 |
|
|
|
|
|
|
|
怎么改进,能不能给个例子,我这是按照郭天祥的思路来做的,刚学习! |
|
|
|
P0=0X00;//把数码管段关掉 wei1=1; wei2=0; wei3=1;//这三个是打开位选 由于不是用的郭天祥的线路板,原理图不一样! |
|
|
|
两种方法: 第一种办法。不要用 while(!key1); while(!key2);while(!key3); while(!key4);改成标志位。 第二种办法。 用while(!key1); while(!key2);while(!key3); while(!key4);但是要重新开启一个定时器中断,把display函数放在新的定时器中断里面。 评分
|
||
|
||
除了引脚控制不一样外,其它的都差不多 |
|
|
|
iysheng 发表于 2016-10-11 23:33 改成下面的就可以了,但是这样肯定会占用单片机很多资源的。
|
|
|
|
是的,上面我说的两个方法,你可以尝试下,用标志位也可以。 |
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2066 浏览 1 评论
3350 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2316 浏览 2 评论
2742 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
3989 浏览 5 评论
937浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6327浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 17:53 , Processed in 0.929630 second(s), Total 108, Slave 87 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号