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);语句给暂停住程序了嘛,,,没办法正常动态刷新显示啦。

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


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

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

  • 16
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值