//用一個外部中斷做按5次的鍵,一個定時器來判斷3秒溢出, 如果定時器在3秒內按了5次, 外部中斷重新賦初值,這樣防止定時器在3秒溢出,綠燈亮。反之,定時器溢出將使得紅燈亮, 用12M crystal 和數碼管+38譯碼器
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
code uchar number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a[6];
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit Green_LED =P2^0;
sbit Red_LED =P2^1;
void timer1_init()
{
TMOD |= 0x10;
TMOD &= 0xdf;
TH1 = 0x3C;
TL1 = 0xB0;
TR1 = 1;
}
void interrupter_init()
{
ET1 = 1;
EA=1; //諾ÖÖD¶Ï¿a
EX0=1; //ía2¿ÖD¶Ï0¿a
IT0=1; //±ßÑØ′¥·¢
}
void Scanning_Numerical_LED(void)
{
static uchar j = 0;
switch(j)
{
case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[0]];break;
case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[1]];break;
case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[2]];break;
case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[3]];break;
case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 = number[a[4]];break;
case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[a[5]];break;
default: break;
}
}
main()
{
ENLED = 0; ADDR3 = 1;
timer1_init();
interrupter_init();
while(1)
{
Scanning_Numerical_LED();
}
}
void ISR_Key(void) interrupt 0 using 1
{
uchar counter1;
counter1++;
TR1=1;
if (counter1==5)
{
counter1=0;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
}
}
void interrupt_timer1() interrupt 3
{
uint sec;
uchar counter;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
counter++;
if(counter ==20)
{
counter = 0;
sec++;
if (sec>=3)
{
Red_LED=1;
TR1=0; 停定時器1;
}
else Green_LED=1;
if (sec==10)
sec=0;
a[0] = sec%10;
a[1] = sec/10;
//a[2] = sec/100%10;
// a[3] = sec/1000%10;
//a[4] = sec/10000%10;
// a[5] = sec/100000%10;
}
}
|