|
3黑幣
如題,想做一個(gè)單片機(jī)按鍵程序,按鍵第30次重置為零。想法是超過(guò)9時(shí)數(shù)碼管能顯示兩位,但實(shí)際表現(xiàn)中只能顯示低位,不能顯示高位,想了很久還是沒(méi)想通。以下是我自己的程序(我是取余+動(dòng)態(tài)刷新),希望大佬們幫我解惑
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY16 = P2^7;
unsigned char code ledchar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char ledbuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
bit keyset = 1;
void main ()
{
char i;
unsigned char buf[6];
unsigned char cnt = 0;
bit backup = 1;
EA = 1;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
TMOD = 0x01;
TH0 = 0xF8;
TL0 = 0xCD;
ET0 = 1;
TR0 = 1;
P2 = 0xFE;
while (1)
{
if (keyset != backup)
{
if (backup == 0)
{
cnt++;
if (cnt >= 30)
{
cnt = 0;
}
buf[0]=cnt%10;
buf[1]=cnt/10%10;
buf[2]=cnt/100%10;
buf[3]=cnt/1000%10;
buf[4]=cnt/10000%10;
buf[5]=cnt/100000%10;
for(i=5;i>=1;i--)
{
if(buf[ i]==0)
ledbuff[ i]=0xFF;
else
break;
}
for(;i>=0;i--)
{
ledbuff[ i]=ledchar[buf[ i]];
}
}
backup = keyset;
}
}
}
void interrupttime0 () interrupt 1
{
unsigned char j=0;
static unsigned char keybuf = 0xFF;
TH0 = 0xF8;
TL0 = 0xCD;
keybuf = (keybuf << 1) |KEY16;
if (keybuf == 0x00)
{
keyset = 0;
}
else if(keybuf == 0xFF)
{
keyset = 1;
}
else
{}
P0=0xFF;
switch(j)
{
case 0:ADDR2=0;ADDR1=0;ADDR0=0;j++;P0=ledbuff[0];break;
case 1:ADDR2=0;ADDR1=0;ADDR0=1;j++;P0=ledbuff[1];break;
case 2:ADDR2=0;ADDR1=1;ADDR0=0;j++;P0=ledbuff[2];break;
case 3:ADDR2=0;ADDR1=1;ADDR0=1;j++;P0=ledbuff[3];break;
case 4:ADDR2=1;ADDR1=0;ADDR0=0;j++;P0=ledbuff[4];break;
case 5:ADDR2=1;ADDR1=0;ADDR0=1;j=0;P0=ledbuff[5];break;
default:break;
}
} |
最佳答案
查看完整內(nèi)容
中斷內(nèi)的j應(yīng)設(shè)為靜態(tài)變數(shù)
否則每次進(jìn)入中斷
j都會(huì)初始化為0
void interrupttime0 () interrupt 1
{
static unsigned char j=0;
|