#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit flag_sz; //设置状态标志,1代表设置状态
bit flag_sx; //设置闪显状态标志,1代表闪显位灭
uchar disp_buf[8] = {0,0,0,0,0,0,0,0};
uchar set_buf[8] = {2,0,0,9,0,11,0,2};
uchar code disp_code[12] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x83};
uchar time_300ms;
uchar set_num = 0; //表示设置位置的数值
uchar key_num; //存放键值
//*****************************************************
//函数:void set_sx(void)
//功能:设置位闪烁
//*****************************************************
void set_sx(void)
{
uchar i;
uchar *p = disp_buf;
uchar *q = set_buf;
time_300ms ++;
if(time_300ms == 30)
{
time_300ms = 0;
flag_sx = !flag_sx;
for(i=0;i<8;i++)
{
p[i] = q[i];
}
if(flag_sx)
{
switch(set_num)
{
case 0x00: disp_buf[0] = 10; break;
case 0x01: disp_buf[1] = 10; break;
case 0x02: disp_buf[2] = 10; break;
case 0x03: disp_buf[3] = 10; break;
case 0x04: disp_buf[4] = 10; break;
case 0x05: disp_buf[5] = 10; break;
case 0x06: disp_buf[6] = 10; break;
case 0x07: disp_buf[7] = 10; break;
default: break;
}
}
}
}
//***********************************************************
//函数:void key(void)
//功能:键盘扫描、识别以及处理
//***********************************************************
void key(void)
{
uchar temp;
P1 = P1 | 0x0f;
temp = P1;
temp &= 0x0f;
if(temp != key_num)
{
key_num = temp;
switch(key_num)
{
case 0x0e: flag_sz = 1; break;
case 0x0d: if(flag_sz == 1)
{
set_num ++;
if(set_num > 8)
set_num = 0;
}
break;
case 0x0b: if(flag_sz == 1)
{
switch(set_num)
{
case 0x00: set_buf[0]++;
if(set_buf[0] > 9)
set_buf[0] = 0; break;
case 0x01: set_buf[1]++;
if(set_buf[1] > 9)
set_buf[1] = 0; break;
case 0x02: set_buf[2]++;
if(set_buf[2] > 9)
set_buf[2] = 0; break;
case 0x03: set_buf[3]++;
if(set_buf[3] > 9)
set_buf[3] = 0; break;
case 0x04: set_buf[4]++;
if(set_buf[4] > 9)
set_buf[4] = 0; break;
case 0x05: set_buf[5]++;
if(set_buf[5] > 11)
set_buf[5] = 0; break;
case 0x06: set_buf[6]++;
if(set_buf[6] > 9)
set_buf[6] = 0; break;
case 0x07: set_buf[7]++;
if(set_buf[7] > 9)
set_buf[7] = 0; break;
default: break;
}
}
break;
case 0x07: if(flag_sz == 1)
flag_sz = 0;
break;
default: break;
}
}
}
//*********************************************************
//函数:void delay_1ms(void)
//功能:数码管显示延时1ms
//*********************************************************
void delay_1ms(void)
{
uint i;
for(i=0; i<100; i++);
}
//*********************************************************
//函数:void display(uchar *buf)
//功能:数码管动态显示
//*********************************************************
void display(uchar *buf)
{
uchar i;
uchar temp = 0x01;
for(i=0;i<8;i++)
{
P0 = disp_code[*buf];
buf++;
P2 = temp;
delay_1ms();
P2 = 0x00;
temp <<= 1;
}
}
//**********************************************************
//函数:void int_timer0(void)interrupt 1
//功能:定时器0中断,定时10ms,处理键盘以及显示
//**********************************************************
void time1() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(flag_sz)
{
set_sx();
display(disp_buf);
}
else
display(set_buf);
key();
}
//*****************************************************
//函数:void main()
//功能:主函数,初始化,等待中断
//*****************************************************
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}