目的是为了熟悉定时器中断程序,使用定时器的中断控制数码管的多位扫描显示数字,通过按键S2和S3来控制数字的加减。欢迎各位指正不足!!!!!!
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
sbit key_s2 = P3^0;//独立按键S2
sbit key_s3 = P3^1;//独立按键S3
uchar num;//数码管显示的值
uchar ms_50,s; //记录50ms的个数 20个为1s
//共阴极数码管0-9
uchar code duanxuan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//位选前三个数码管
uchar code weixuan[] ={0xfe,0xfd,0xfb,0xf7};
void delay(uint x) //@12.000MHz 延迟函数1毫秒
{
unsigned char i, j;
while(x--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void display(uchar i) //数码管显示函数
{
static uchar wei;
uchar qian,bai, shi, ge;
qian =i/1000;
bai = i / 100%10;
shi = i /10%10;
ge = i % 10;
P0 = 0XFF;//清除断码
WE = 1; //位选打开
P0 = weixuan[wei];
WE = 0; //关闭位选寄存器
switch(wei)
{
case 0:DU = 1;P0 = duanxuan[qian];DU = 0;break;
case 1:DU = 1;P0 = duanxuan[bai];DU = 0;break;
case 2:DU = 1;P0 = duanxuan[shi];DU = 0;break;
case 3:DU = 1;P0 = duanxuan[ge];DU = 0;break;
}
wei++;
if(wei ==4)
wei =0;
}
void timer0Init() //定时器0初始化
{
EA =1;
ET0 =1;
TR0 =1;
//TCON中的打开定时器
TMOD =0x01; //TMOD不能位寻址 0000 0001中 0 01表示定时器模式 16位定时
TH0 =0xed; //(65535-46082)/256; //定时器 50ms 65536-50000/1.085/256 高8位
TL0 =0xff; //(65535-46082)%256; //低8位
}
void timer0() interrupt 1 //定时器0中断
{
TH0 =0xed;
TL0 =0xff;
display(num);
}
void main()
{
//uchar ms_50,s; //记录50ms的个数 20个为1s
//TR0 =1;
timer0Init();
while(1)
{
if(key_s2 == 0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s2 == 0)
{
if(num !=200)//如果值不等于9则+1,功能把值限定为小于99
num++;
while(!key_s2);//松手检测
}
}
if(key_s3 == 0)//判断S3是否被按下
{
delay(20);//按键消抖
if(key_s3 == 0)
{
if(num > 0) //如果大于0则执行减一
num--;
while(!key_s3);//松手检测
}
}
}
}