keil+proteus 单片机实现:按下某按键数码管显示数字递增(0-999)

今天恰好学到了按键这部分!所以结合之前编写数码管动态扫描显示数字的有关知识编了代码实现了一个小功能~

功能:按一下按键,数码管显示的数字加一(1-999)。


具体代码:

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit  DIOLA=P2^5;//控制八个LED灯点亮的芯片的某控制端
sbit key=P3^4;//某按键~可以任意哒
sbit dula=P2^6;
sbit wela=P2^7;
uint num,i,number;
uchar temp;
uchar code table[]={ 0x3f ,0x06 ,0x5b ,0x4f,0x66 ,0x6d, 0x7d ,0x07 ,0x7f, 0x6f};
//数字0-9对应段选
uchar code b[]={0xdf,0xef,0xf7};//动态扫描位
uint  a[3];
void delay(uint z);


void main()
{
	P1=0xff;
	P0=0xff;
	DIOLA=1;
	P3=0xff;
		
	dula=0;
	wela=0;

	number=0;

  while(1)
  {

	P1=0xff;//LED灯未按下按键 
		
	a[2]=number/100;
	a[1]=(number%100)/10;
	a[0]=(number%100)%10;
	
	
	if(a[2]==0&&a[1]==0) num=1;
	else if(a[2]==0&&a[1]!=0) num=2;
	else  num=3;
	
	i=num;
	wela=0;
	
    while(1)
    {

	temp=b[i-1];//位选
	wela=1;
        P0=temp;
        wela=0;
		
        P0=0xff;//消隐
		
        dula=1;
        P0=table[a[i-1]];//段选
        dula=0;
        delay(5);		
		
	if(i>1)i--;
	else i=num;
		
	if(temp!=0xdf)temp=_crol_(temp,1);//位选改变
	else temp=b[i-1];
		
	P0=0xff;
		
	
	if(key==0)
	{
		
		P1=0x0;	//按键按下时LED点亮
                while(!key);
                P1=0xff;//按键未按下时LED熄灭状态	
		number++;//显示数字加一
		if(number==999) number=0;
		break;
	
	}
	
     }

  }
}

	
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}

 

做个笔记!

1.按键按下再擡起计数才加一 不等于按键按下就计数加一!否则你按下的时间很长时计数会一直增加。

while(!key);语句可以解决问题,把这句话看作“固定某个状态,让程序暂停了。”

2.设置了两个大循环,按键按完后跳出一层循环(数码管位选段选动态刷新显示),进入大循环(重新计算需显示数字的各位)。

3.在Main函数中使用的数据类型只能作为全局变量声明(在main函数外面)?不然会报错~


仿真效果:

中间下方那个按钮s2在被按!

问题:注意到在按钮被按下的时候,数码管显示是不正常的...没有办法显示稳定的多位数,只能显示一位。

毕竟用while(!key);语句给暂停住程序了嘛,,,没办法正常动态刷新显示啦。

暂时不知道怎么改,以后没准就会了哦。


碎碎念:加了实验室但是还是好迷茫啊哭哭,大创连个方向都没有申报啥呀(再次哭哭)。

感觉我写的代码也蠢蠢的和我一样迷茫....害!快乐当条咸鱼不好么哼!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章