为什么给串口送的都是0。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar a ,b;
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
sbit dula = P2^6;
sbit wela = P2^7;
void Key_Scan();
void xianshi();
void fa_jian(uchar Num);
uchar KeyNo = 16;
uchar Pre_KeyNo = 16;
uchar Timer = 0 ,flag = 0;
void delayms(uint ms)
{
uint i,j;
for(i = ms;i > 0;i --)
for(j = 110;j > 0;j --);
}
void init()
{
TMOD = 0x21; //开定时器T0工作方式1于T1工作方式2
TH0 = (65536 - 5000)/256;
TL0 = (65536 - 5000)%256; //设置5ms初值
TR0 =1; //启动定时器0
ET0 = 1; //开定时器中断0
TH1 = 0xfd;
TL1 = 0xfd; //设置波特率为9600bps
TR1 = 1; //启动定时器2
REN = 1; //允许串口接收
SM0 = 0;
SM1 = 1; //设置串口工作方式1
EA = 1; //开总中断
ES = 1; //开串口中断
}
void main()
{
init();
while(1)
{
if(flag == 1)
{
flag = 0;
xianshi();
fa_jian(KeyNo);
}
}
}
void Key_Scan()
{
uchar Tmp;
P3 = 0x0f;
delayms(1);
Tmp = P3^0x0f;
switch(Tmp)
{
case 1: KeyNo = 0; break;
case 2: KeyNo = 1; break;
case 4: KeyNo = 2; break;
case 8: KeyNo = 3; break;
default: KeyNo = 16;
}
P3 = 0xf0;
delayms(1);
Tmp = (P3 >> 4) ^ 0x0f;
switch(Tmp)
{
case 1: KeyNo += 0; break;
case 2: KeyNo += 4; break;
case 4: KeyNo += 8; break;
case 8: KeyNo += 12;
}
}
void ser() interrupt 4
{
if(RI == 1)
{
RI = 0;
// a = SBUF;
}
}
void fa_jian(uchar Num)
{
ES = 0;
SBUF = Num;
while(!TI);
TI = 0;
ES = 1;
}
void xianshi()
{
P3 = 0xf0;
if(P3 != 0xf0) Key_Scan();
if( KeyNo < 16)
{
dula = 1;
P0 = table[KeyNo];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delayms(5);
}
}
void T0_Timer() interrupt 1
{
TH0 = (65536 - 5000)/256;
TL0 = (65536 - 5000)%256;
if(++Timer == 20)
{
Timer = 0;
flag = 1;
}
}
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |