51单片机100例实例之14例
//项目名称:按键控制数码管移位显示
//项目再创作者:科技小宅神
//完成时间:2021/01/21

#include <reg52.h>//c51头文件
#define uchar unsigned char
#define uint unsigned int
//段码,共阳极数码管0-9的数字
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//位码
uchar code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//待显示到个数码管缓冲(开始仅在0位显示0,其他黑屏,10为黑屏)
uchar Display_Buffer[]={0,10,10,10,10,10,10,10};
//1毫秒延时子程序
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}
//刷新显示程序
void Show()
{
uchar i;//定义一个局部变量i
for(i=0;i<8;i++)
{
P0=0xff;//消除对P0口的影响
P0 = duan[Display_Buffer[i]];//发送段码
P2 = wei[i];//发送位码
DelayMS(2);//延时
}
}
//主程序
void main()
{
uchar i;
uchar 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++; //可以加到按键计数值为8,按下k1时加1计数并增加显示位
//当P1=0xfe时,即P1.0=0,即k1按下
if(Keycount>8) Keycount=8;
//如果按键计数值大于8,那么按键计数值为8,第七位数码管亮
Display_Buffer[Keycount-1]=Keycount;
break;
case 0xfd: //当P1=0xfd时,即P1.1=0,即k2按下
if(Keycount>0) //如果按键计数值大于0
Display_Buffer[--Keycount]=10; //按下k2时减1计数并减少显示位
break; //如按键计数值为1,时,大括号里自减减1为Display_Buffer[7]=10,数码管第七位黑屏
case 0xfb: //当P1=0xfb时,即P1.2=0,即k3按下
Display_Buffer[0]=0;//0位显示0
for(i=1;i<8;i++)
Display_Buffer[i]=10;//无论之前计数是多少,只有0位显示0,其他黑屏
Keycount=0;//按下k3时清零
}
while(P1 != 0xff) Show();
//查询是否有按键按下,若没有继续判断,若有则继续显示出来相应的结果
}
}