定时炸dan程序就像是对之前学习的单片机知识的汇总,用到了蜂鸣器,矩阵按键,数码管及led灯的刷新,定时器及中断,分时复用等等综合性挺强,程序很多,不好码,写完之后在看程序时发现我对中断在整个程序中处的位置有些模糊,就去复习了一下。
定时炸dan程序
#include<reg52.h>
sbit BUZZ = P1^3;
sbit KEY_OUT_4 = P2^7;
sbit KEY_OUT_3 = P2^6;
sbit KEY_OUT_2 = P2^5;
sbit KEY_OUT_1 = P2^4;
sbit ENLED = P1^1;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit KEY_IN_1 = P2^0;
sbit KEY_IN_2 = P2^1;
sbit KEY_IN_3 = P2^2;
sbit KEY_IN_4 = P2^3;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char KeySta[4][4] = {
{1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}
};
unsigned char LedBuff[7] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char code KeyCodeMap[4][4] = {
{0x31,0x32,0x33,0x26},
{0x34,0x35,0x36,0x25},
{0x37,0x38,0x39,0x28},
{0x30,0x1B,0x0D,0x27}
};
unsigned long pdata KeyDownTime[4][4] = {
{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}
};
bit enBuzz = 0;
bit flag1s = 0;
bit flagStart = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned int CountDown = 0;
void ConfigTimer0(unsigned int ms);
void ShowNumber(unsigned long num);
void KeyDriver();
void main()
{
EA = 1;
ENLED = 0;
ConfigTimer0(1);
ShowNumber(0);
while(1)
{
KeyDriver();
if(flagStart && flag1s)
{
flag1s = 0;
if(CountDown>0)
{
CountDown--;
ShowNumber(CountDown);
if(CountDown == 0)
{
enBuzz = 1;
LedBuff[6] = 0x00;
}
}
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 28;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void ShowNumber(unsigned long num)
{
signed char i;
unsigned char buf[6];
for(i = 0;i<6;i++)
{
buf = num%10;
num = num/10;
}
for(i = 5;i>=1;i--)
{
if(buf == 0)
LedBuff = 0xFF;
else
break;
}
for(;i>=0;i--)
{
LedBuff = LedChar[buf];
}
}
void KeyAction(unsigned char keycode)
{
if(keycode == 0x26)
{
if(CountDown<9999)
{
CountDown++;
ShowNumber(CountDown);
}
}
else if(keycode == 0x28)
{
if(CountDown>1)
{
CountDown--;
ShowNumber(CountDown);
}
}
else if(keycode == 0x0D)
{
flagStart = 1;
}
else if(keycode == 0x1B)
{
enBuzz = 0;
LedBuff[6] = 0xFF;
flagStart = 0;
CountDown = 0;
ShowNumber(CountDown);
}
}
void KeyDriver()
{
unsigned char i,j;
static unsigned char pdata backup[4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
static unsigned long pdata TimeThr[4][4] = {
{1000,1000,1000,1000},{1000,1000,1000,1000},
{1000,1000,1000,1000},{1000,1000,1000,1000}
};
for(i = 0;i<4;i++)
{
for(j = 0;j<4;j++)
{
if(backup[j] != KeySta[j])
{
if(backup[j] != 0)
{
KeyAction(KeyCodeMap[j]);
}
backup[j] = KeySta[j];
}
if(KeyDownTime[j]>0)
{
if(KeyDownTime[j] >= TimeThr[j])
{
KeyAction(KeyCodeMap[j]);
TimeThr[j] += 200;
}
}
else
{
TimeThr[j] = 1000;
}
}
}
}
void KeyScan()
{
static unsigned char n = 0;
unsigned char i;
static unsigned char keyout = 0;
static unsigned char keybuf[4][4] = {
{0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF}
};
P20 = 1;
P21 = 1;
P22 = 1;
P23 = 1;
keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;
keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;
for(i = 0;i<4;i++)
{
if((keybuf[keyout] & 0x0F) == 0x00)
{
KeySta[keyout] = 0;
KeyDownTime[keyout] += 4;
}
else if((keybuf[keyout] & 0x0F) == 0x0F)
{
KeySta[keyout] = 1;
KeyDownTime[keyout] = 0;
}
}
keyout++;
keyout = keyout & 0x03;
switch(keyout)
{
case 0:KEY_OUT_4 = 0;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
case 1:KEY_OUT_4 = 1;KEY_OUT_3 = 0;KEY_OUT_2 = 1;KEY_OUT_1 = 1;break;
case 2:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 0;KEY_OUT_1 = 1;break;
case 3:KEY_OUT_4 = 1;KEY_OUT_3 = 1;KEY_OUT_2 = 1;KEY_OUT_1 = 0;break;
default:break;
}
P0 = 0xFF;
switch(n)
{
case 022 = 021 = 020 = 0;n++0 = LedBuff[5];break;
case 122 = 021 = 020 = 1;n++0 = LedBuff[4];break;
case 222 = 021 = 120 = 0;n++0 = LedBuff[3];break;
case 322 = 021 = 1;P20 = 1;n++;P0 = LedBuff[2];break;
case 422 = 1;P21 = 0;P20 = 0;n++;P0 = LedBuff[1];break;
case 522 = 1;P21 = 0;P20 = 1;n++;P0 = LedBuff[0];break;
case 622 = 1;P21 = 1;P20 = 0;n = 0;P0 = LedBuff[6];break;
default: break;
}
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
switch(i)
{
case 022 = 0;P21 = 0;P20 = 0;i++;P0 = LedBuff[5];break;
case 122 = 0;P21 = 0;P20 = 1;i++;P0 = LedBuff[4];break;
case 222 = 0;P21 = 1;P20 = 0;i++;P0 = LedBuff[3];break;
case 3:P22 = 0;P21 = 1;P20 = 1;i++;P0 = LedBuff[2];break;
case 4:P22 = 1;P21 = 0;P20 = 0;i++;P0 = LedBuff[1];break;
case 5:P22 = 1;P21 = 0;P20 = 1;i++;P0 = LedBuff[0];break;
case 6:P22 = 1;P21 = 1;P20 = 0;i = 0;P0 = LedBuff[6];break;
default: break;
}
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s = 0;
TH0 = T0RH;
TL0 = T0RL;
if(enBuzz)
BUZZ = ~BUZZ;
else
BUZZ = 1;
LedScan();
KeyScan();
if(flagStart)
{
tmr1s++;
if(tmr1s>=1000)
{
tmr1s = 0;
flag1s = 1;
}
}
else
{
tmr1s = 0;
}
}
|