/*
定时:使用T0作为16位定时器,最小时间单元设定为5ms(晶振为11.0592MHZ);
显示:使用4个LED作为显示器
输入:使用3个独立按键作为输入
中断嵌套:ET0= 1;EX0 = 1; 定时器0 和外部中断0两重嵌套
*/
#include <reg52.h>
#define uint unsigned int //0~65535
#define uchar unsigned char//0~255
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
};
//sbit buzz = P2^4;
sbit wela = P2^5;//74HC573数据锁存器的片选端
sbit dg = P2^3; //右边第一个LED
sbit ds = P2^2;
sbit db = P2^1;
sbit dq = P2^0;
sbit key1 = P3^2;//INT0的外部输入
sbit key2 = P3^3;
sbit key3 = P3^4;
sbit key4 = P3^5;
sbit key5 = P3^7;
uint t0; //定时器0计数器
uint temp;
uchar keyV1 = 0;//按键1扫描值
void delay(uint z);
void interruptInit();
void TimerInit();
void TestSMG();
void KeyScan();
int main()
{
TimerInit();
while(1)
{
if (t0 >= 200)//延时1s
{
t0 = 0;
temp++;
}
if (temp >= 19)
temp = 0;
KeyScan();
TestSMG();
}
}
//定时器初始化
void TimerInit()
{
TMOD = 0x01;//0000 0001 T0 16位定时器
//延时 5000μm = 5ms
TH0 = (65535 - 5000)/256;//高八位
TL0 = (65535 - 5000)%256;//低八位
interruptInit();
TR0 = 1;
}
//定时器服务子程序
void Timer0() interrupt 1 //定时器0默认的中断优先级为1
{
TH0 = (65535 - 5000)/256;//高八位
TL0 = (65535 - 5000)%256;//低八位
t0++;
}
//中断初始化
void interruptInit()
{
//IT0 = 1;//外部中断设为边沿触发
EA = 1;
ET0 = 1; //使能T0中断
//EX0 = 1;//使能外部中断
}
/*
//外部中断服务子程序
void key() interrupt 0//按键使用外部中断,优先级为0
{
temp++;
}
*/
/*
function : display temp
形参:temp
局部变量:g,s,b,q
全局位变量:dg,ds,db,dq
*/
void TestSMG()
{
uchar g = temp%10;
uchar s = (temp/10)%10;
uchar b = (temp/100)%10;
uchar q = temp/1000;
wela = 1;
P0 = table[g];
wela = 0;
dg = 0;
ds = 1;
db = 1;
dq = 1;
delay(1);
wela = 1;
P0 = table[s];
wela = 0;
dg = 1;
ds = 0;
db = 1;
dq = 1;
delay(1);
wela = 1;
P0 = table[b];
wela = 0;
dg = 1;
ds = 1;
db = 0;
dq = 1;
delay(1);
wela = 1;
P0 = table[q];
wela = 0;
dg = 1;
ds = 1;
db = 1;
dq = 0;
delay(1);
}
/*
按键扫描
全局变量:
sbit key1 = P3^2;//INT0的外部输入
sbit key2 = P3^3;
sbit key3 = P3^4;
sbit key4 = P3^5;
sbit key5 = P3^7;
uchar keyV1 = 0;//按键1扫描值
*/
void KeyScan()
{
if (key1 == 0)
{
delay(1);
if (key1 == 0)
{
switch(keyV1)
{
case 0: TR0 = 0; break;
case 1: //重新装初值
TH0 = (65535 - 5000)/256;//高八位
TL0 = (65535 - 5000)%256;//低八位
TR0 = 1;
break;
}
keyV1++;
if(keyV1 == 2)
{
keyV1 = 0;
}
}
while(!key1);//下降沿去抖动
delay(1);
while(!key1);//上升沿去抖动
}
if (keyV1 == 1)
{
if (key2 == 0)
{
delay(1);
if (key2 == 0)
{
temp++;
}
while(!key2);
delay(1);
while(!key2);
}
else
{
if (key3 == 0)
{
delay(1);
if (key3 == 0)
{
temp--;
}
while(!key3);
delay(1);
while(!key3);
}
}
}
}
/*
********************************************
延时函数 ,z=1时,延时1ms
局部变量 x,y,z
********************************************
*/
void delay(uint z)
{
uint x, y;
for(x = z; z > 0; z--)
for(y = 110; y > 0; y--);
}