使用独立按键来控制数码管显示数字
第一颗按键,计数加1
第二颗按键,计数减1
第三颗按键,计数清零
第四颗按键,自动计数
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dlkey1 = P3^1; //独立按键位控制
sbit dlkey2 = P3^0;
sbit dlkey3 = P3^2;
sbit dlkey4 = P3^3;
sbit led2 = P2^2; //控制数码管位选的位
sbit led3 = P2^3;
sbit led4 = P2^4;
uchar code duanxuan[] = {0x3f,0x06,0x5b,0x4f, //0,1,2,3
0x66,0x6d,0x7d,0x07, //4,5,6,7
0x7f,0x6f,0x77,0x7c, //8,9,A,B
0x39,0x5e,0x79,0x71}; //C,D,E,F 段选
uint numt0;int num;
void delay_xms(uint m) //延时ms操作
{
int i;
for(;m>0;m--)
for(i=110;i>0;i--);
}
void Init() //初始化内容
{
TMOD = 0X01; //定时器工作模式设置为01
TH0 = (65536-45872)/256;//计数器高八位赋初值
TL0 = (65536-45872)%256;//计数器低八位赋初值
EA = 1; //中断总开关
ET0 = 1; //定时器T0中断开关
}
void keyscan() //按键检测函数
{
if(dlkey1==0) //按键1按下后,num加一
{
delay_xms(10);
if(dlkey1==0)
{
num++; //先加数,后检测
if(num>60)
{
num=0;
}
while(!dlkey1); //按住按键时,没有反应,松开按键反应
}
}
if(dlkey2==0) //按键2按下后,num减一
{
delay_xms(10);
if(dlkey2==0)
{
num--; //先减数,后检测
if(num<0)
{
num=60;
}
while(!dlkey2); //按住按键时,没有反应,松开按键反应
}
}
if(dlkey3==0) //按键3按下后,num清零
{
delay_xms(10);
if(dlkey3==0)
{
num=0;
while(!dlkey3); //按住按键时,没有反应,松开按键反应
}
}
if(dlkey4==0) //按键4按下后,自动计数开启/关闭
{
delay_xms(10);
if(dlkey4==0)
{
while(!dlkey1);
TR0 = ~TR0; //按住按键时,没有反应,松开按键反应
}
}
}
void display(int i,int j,int k) //数码管显示函数
{
switch(i)
{
case(0):P0=duanxuan[j];led2=1,led3=1,led4=1;break;
case(1):P0=duanxuan[k];led2=0,led3=1,led4=1;break;
case(2):led2=1,led3=0,led4=1;break;
case(3):led2=0,led3=0,led4=1;break;
case(4):led2=1,led3=1,led4=0;break;
case(5):led2=0,led3=1,led4=0;break;
case(6):led2=1,led3=0,led4=0;break;
case(7):led2=0,led3=0,led4=0;break;
}
}
void main()
{
int i=0,j,k;
Init();
while(1)
{
keyscan(); //先按键检测对num值改变后
j=num/10,k=num%10; //再进行j、k的赋值操作
display(i,j,k); //数码管显示
if(numt0 >= 20) //20次50ms的中断检测为1s
{
num++; //计数加一
if(num >60)
{
num = 0;
}
numt0 = 0;
}
i=(i+1)%2; //i控制数码管的显示位置,目前为1号位和2号位
P0 = 0; //消影
}
}
void TR0_time() interrupt 1 //50ms中断系统
{
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
numt0++;
}
该实验对于num小于0的情况作出改进,如果num选用uint类型,那么num–,小于0之后就会出现bug,但是num使用int类型则不会。