为什么这个程序让单片机数码管程序的数字一闪一闪的

外控数码管一闪一闪的是什么原因?_百度知道君,已阅读到文档的结尾了呢~~
基于单片机的设计
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
数码管动态显示数字
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口51单片机初学者,数码管动态显示跳动的数字,我这个程序正确吗?_百度知道查看: 3518|回复: 14
新手求助,我想写一个有两个按键的程序,K1按下数码管数字加1,K2按下数码管数字减1;
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
这是源程序,求大神指点,我知道我写的不对。。。
[C] 纯文本查看 复制代码#include &reg51.h&
#include &intrins.h&
GPIO_LED P0
//led使用P0口
sbit K1=P1^0;
sbit K2=P1^1;
//--定义全局函数--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
void Delay10ms(unsigned int c);
//延时10ms
unsigned char Key_Scan();
void main(void)
Key_Scan();
GPIO_LED=~DIG_CODE[KeyValue];
unsigned char Key_Scan()
//保存键值
if (K1==0||K2==0)
//检测按键是否按下
Delay10ms(1); //消除抖动
if (K1==0||K2==0) //再次检测按键是否按下
{ KeyValue=0;
KeyValue++;
if(KeyValue&17)
KeyValue=0;
KeyValue--;
if(KeyValue&0)
KeyValue=17;
while ((i&50) && K1!=0 && K2!=0)
//检测按键是否松开
Delay10ms(1);
void Delay10ms(unsigned int c)
//误差 0us
unsigned char a,
for (;c&0;c--)
for (b=38;b&0;b--)
for (a=130;a&0;a--);
回复【9楼】linxi:
--------------------------------
仔细分析改了一下,感觉问题主要出现在KeyValue=0的定义是不是全局变量还有松手检测也出了问题。&改成如下功能就可以实现了(但是感觉按键还不是很灵敏。。。有时按一次没反应):
unsigned&char&Key_Scan()
{
unsigned&char&i=0;&//保存键值
&&&&&&&&&&&&if(K1==0)&
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【9楼】linxi:
--------------------------------
仔细分析改了一下,感觉问题主要出现在KeyValue=0的定义是不是全局变量还有松手检测也出了问题。&改成如下功能就可以实现了(但是感觉按键还不是很灵敏。。。有时按一次没反应):
unsigned&char&Key_Scan()
{
unsigned&char&i=0;&//保存键值
&&&&&&&&&&&&if(K1==0)&
Delay10ms(1);
KeyValue=KeyValue+1;
if(KeyValue&15)
KeyValue=0;
Delay10ms(1);
KeyValue=KeyValue-1;
if(KeyValue&0)
KeyValue=15;
while&((i&30)&&&&K1==0) &//检测按键是否松开
Delay10ms(1);
while&((i&30)&&&&K2==0) &//检测按键是否松开
Delay10ms(1);
return&0;
}
主题帖子精华
在线时间377 小时
帮顶。。。。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
在线时间18 小时
为啥要取反呢?
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【2楼】正点原子:
---------------------------------
...原子哥。。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【3楼】xouou_53320:
---------------------------------
因为那个定义的显示码是我直接复制过来的。。。好像那个显示码是共阴极的,而实际电路是共阳极。。
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
按键松手检测可以不用循环,直接定义两个keylock变量,key1==1&&keylock==0,才加一&,一旦进去就把keylock置一。别的地方没有看出来问题。
不做浮躁的嵌入式攻城狮。。。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【6楼】linxi:
---------------------------------
key1==1&&keylock==0?&不太懂。。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【3楼】xouou_53320:
---------------------------------
解疑老师&&求指点啊
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
回复【7楼】xiaobudonglaoshi:
---------------------------------
就是if(key1==1&&keylock1==0)然后执行相应的加一操作,然后立即把keylock1置一。在按键去抖里再将keylock置0,就可以避免while等待了。
另外不知道你现在发生的问题是什么,看了你的程序,应该是可以实现的。另外你为什么说自己写的不对?有没有烧进单片机验证下。
不做浮躁的嵌入式攻城狮。。。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【9楼】linxi:
---------------------------------
我写的那个只能加到1&&然后就加不动了&&减的话之间显示8.。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
回复【9楼】linxi:
---------------------------------
对了&&还有俩警告&&:MAIN.C(80):&warning&C173:&missing&return-expression
MAIN.C(80):&warning&C290:&missing&return&value
主题帖子精华
中级会员, 积分 375, 距离下一级还需 125 积分
在线时间53 小时
看看了这是普中例程。。。。没必要在它上面加,按自己理解重新写,问题在按键处理上而且逻辑都不对,警告是“unsigned&char&Key_Scan()”,又没有return.
主题帖子精华
新手上路, 积分 36, 距离下一级还需 14 积分
在线时间0 小时
回复【13楼】xiaobudonglaoshi:
---------------------------------
按键不灵敏的话,可以适当把防抖动延时减小一点。如果楼主是按照开发板的源程序改的,建议搞清楚原理自己试试能跑就行。因为这个程序在实际中不是很实用。学完相关的单片机外设后,可是试着用定时器累计变量值来实现去抖动,按键用自锁变量实现。原则就是不让单片机等待。加油吧!
不做浮躁的嵌入式攻城狮。。。。
主题帖子精华
新手上路, 积分 15, 距离下一级还需 35 积分
在线时间2 小时
缘分吧,看到这个网站,
附上我测试通过的程序:
#include&STC12C2052AD.h&
sbit LED1=P3^5;
sbit LED2=P3^4;
sbit LED3=P3^3;
sbit LED4=P3^2;
sbit key=P3^1;
sbit key1=P3^0;
uchar i,ge,shi,bai,
uchar code table[]={& & & &&&//共阳数码管真值表,加code 数组将存入程序存储RAM内,不占用内存Rom Flash
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
void delay(uint x)& & & & & & & & & & & && &
& & & & for(;x&0;x--)
& & & & & & & & for(y=0;y&600;y--);
void main()
& & & & bit x=0,y=0;
//& & & & bit y=1;
& & & & TMOD=0x01;
& & & & TH0=()/256;
& & & & TL0=()%256;
& & & & EA=1;
& & & & ET0=1;
& & & & TR0=1;
& & & & while(1)
& & & && & ge=aa%10;
& & & && & shi=aa/10%10;
& & & && & bai=aa/100%10;
& & & && & qian=aa/1000%10;
& & & && & x=
& & & && & if(y!=key){
& & & && & & & & && & delay(100);
& & & & & & & & & & & & if(x==key){
& & & & & & & & & & & && &if(y==0){
& & & & & & & & & & & && &
& & & & & & & & & & & && && & & &&&aa++;
& & & & & & & & & & & && &}
& & & & & & & & & & & &&&y=
& & & & & & & & & & & & }
& & & && & }
& & & & & & & & if(key1==0){aa=0;}
void Timerinterrupt0()interrupt 1 //using 3
& & & & TR0=0;
&&& & & & TH0=()/256;
& & & & TL0=()%256;
& & & & P1=0xFF;
& & & & & & & &&&switch(i)
& & & & & & & &&&{
& & & & & & & && & case 0: LED1=0;LED4=1;& & & & i++;& & & & P1=table[ge];& & & & delay(1);& & & &
& & & & & & & && & case 1: LED2=0;LED1=1;& & & & i++;& & & & P1=table[shi];& & & & delay(1);& & & &
& & & & & & & && & case 2: LED3=0;LED2=1;& & & & i++;& & & & P1=table[bai];& & & & delay(1);& & & &
& & & & & & & && & case 3: LED4=0;LED3=1;& & & & i=0;& & & & P1=table[qian];& & & & delay(1);& & & &
& & & & & & & && & default: LED1=1;LED2=1;LED3=1;LED4=1;& & & &
& & & & & & & &&&}
& & & && & TR0=1;
Powered by

我要回帖

更多关于 数码管显示数字 的文章

 

随机推荐