我對這個程序有點小疑問,如果我一直沒有按按鍵一直沒有按下,那么程序就會停在while(!TI)里面,那為什么我在單片機里面會看到小燈一直閃爍?
單片機源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
sbit wela=P2^7;
sbit dula=P2^6;
uint b;
int c;
uint d=0;
uchar DAT;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=144;y>0;y--);
}
}
void scon_crol()
{
SM0=0;//工作方式1 八位數據傳輸
SM1=1;
REN=1;//允許接收數據
TMOD=0x20;//計時器1工作模式2 八位自動裝填計時器
TH1=0xfd;//計時器初值
TL1=0xfd;//自動裝填:TL1=TH1
TR1=1;//打開計時器
}
uchar keydown()
{
uchar a;
P3=0xf0;
if(P3 != 0xf0)
{
delay(5);
if(P3 != 0xf0)
{
a=P3;
P3=0x0f;
a=a|P3;
}
while(P3!=0x0f);
}
P1=0xfe;//小燈閃爍
delay(50);
P1=0xff;
delay(50);
return a;
}
uchar keypro()
{
uchar key_value;
switch(keydown())
{
case 0xee: key_value =0x01; break;
case 0xde: key_value =0x02; break;
case 0xbe: key_value =0x03; break;
case 0x7e: key_value =0x04; break;
case 0xed: key_value =0x05; break;
case 0xdd: key_value =0x06; break;
case 0xbd: key_value =0x07; break;
case 0x7d: key_value =0x08; break;
case 0xeb: key_value =0x09; break;
case 0xdb: key_value =0x0a; break;
case 0xbb: key_value =0x0b; break;
case 0x7b: key_value =0x0c; break;
case 0xe7: key_value =0x0d; break;
case 0xd7: key_value =0x0e; break;
case 0xb7: key_value =0x0f; break;
case 0x77: key_value =0x10; break;
}
P1=0xfb;//小燈閃爍
delay(50);
P1=0xff;
delay(50);
return (key_value);
}
void main()
{
scon_crol();
while(1)
{
SBUF =keypro();
while(!TI);
TI=0;
}
}
|