单片机c语言程序问题

以下是我写的一段程序,希望实现串口通信,我用矩阵键盘按下0~9,在串口调试助手上显示0~9,但是实际情况是每次下载只有一个第一次按下按键会通信成功,之后不论我按下什么键,都没有反应了,请高手看看这是什么原因,程序怎么改?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uint temp;
uint flag,num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
num=16;
flag=0;
TMOD=0x20;//选择定时器1为工作方式2
TH1=0xfd; //装初值
TL1=0xfd;
TR1=1; //打开定时器1
SM0=0; //选择工作方式。
SM1=1;
REN=1; //是串口允许接收,必须写在SM0和SM1的后面
EA=1; //开总中断
ES=1; //开串口中断
}
uchar keyscan()
{
while(num==16)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=0;break;
case 0xd0:num=1;break;
case 0xb0:num=2;break;
case 0x70:num=3;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=4;break;
case 0xd0:num=5;break;
case 0xb0:num=6;break;
case 0x70:num=7;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=8;break;
case 0xd0:num=9;break;
case 0xb0:num=10;break;
case 0x70:num=11;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0xe0:num=12;break;
case 0xd0:num=13;break;
case 0xb0:num=14;break;
case 0x70:num=15;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
void main()
{
init();
while(1)
{

if(flag==1)
{
ES=0;
keyscan();
SBUF=0x30+num;
while(!TI); //检测传输是否结束。
TI=0; //TI手动清零
num=16;
flag=0;
ES=1; //打开中断。

}
}
}
void cuan() interrupt 4 //串口中断函数 。
{
RI=0;
flag=1; //RI清零。
}

主函数中,应该围绕 keyscan()函数来作文章,一旦有键按下,就发送。
现在却是:if(flag==1),以“收到”为条件,......
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网