|
51单片机用K1-K3控制数码管移位显示设计
功能:1.按下 K1 时加1 计数并增加显示位,
2.按下K2 时减1 计数并减少显示位,
3.按下K3 时清零。
#include<reg51.h> //头文件
#define uchar unsigned char // 把uchar 定义为usigned char 为后面定义的时候方便
#define uint unsigned int
uchar code acode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};// 其阳极数码管0到9的数字,即为段码
uchar code index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位码
uchar buffer[]={0,10,10,10,10,10,10,10};//待显示到各数码管的数字缓冲(开始仅在0 位显示0,其他黑屏)
void delay(uchar x) //延时程序
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
void show() //显示程序
{
uchar i;
for(i=0;i<8;i++)
{
P0=0xff;//消除对P0口的影响
P0=acode[buffer[i]];//P0口为连接数码管的端口
P2=index[i];// 位选
delay(2);//延时
}
}
void main()//主程序
{
uchar i,key1,keycount=0;//定义变量i,key1,keycount
P0=0xff;
P1=0xff;
P2=0x00;
while(1)
{
show();
P1=0xff;
key1=P1;/将P1的状态保存到key1中
switch (key1)//通过P1的状态来决定作什么操作
{
case 0xfe: keycount++;//当P1=0xfe时即P1.0=0,即k1按下
if(keycount>8) keycount=8;
buffer[keycount-1]=keycount;//按下 K1 时加1 计数并增加显示位
break;
case 0xfd: if(keycount>0) buffer[--keycount]=10;//当P1=0xfd时即P1.1=0,即k2按下
break; 按下 K2时减1 计数并减少显示位
case 0xfb: buffer[0]=0;
for(i=0;i<8;i++) buffer[i]=10;//当P1=0xfb时即P1.2=0,即k2按下
keycount=0;//按下K3 时清零。
}
while(P1!=0xff) show();
//查询是否有键按下,若没有继续判断,若有则显示出来相应结果
}
}
Protues仿真图: