各位看下这个例子为什么按一下按键串口输出N多数据
将键盘的值以1200bps发送到计算机,在计算机上显示。
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,temp,num,a;
void init()
{
TMOD=0x20; //timer1 mode2 8bit reload
TH1=0xE8; //1200bps
TL1=0xE8;
TR1=1; //open timer1
REN=1; //admit serial receive data
SM0=0; //10bit asynchronous
SM1=1;
EA=1;
ES=1; //open serial
}
void delay(uchar t) //delay function
{
uint i;
for(t;t>0;t--)
{
for(i=115;i>0;i--);
}
}
uchar keyscan();
void main()
{
init();
while(1)
{
ES=0;
//怎样让串口只输出一个字符?
SBUF=keyscan();
while(!TI);
TI=0;
ES=1;
}
}
uchar keyscan()
{
P3=0xfe; //将P3第一口拉低
temp=P3;
temp=temp&0xf0; //检测P3口
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: num=1;
break;
case 0xde: num=2;
break;
case 0xbe: num=3;
break;
case 0x7e: num=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd; //将P3第2口拉低
temp=P3;
temp=temp&0xf0; //检测P3口
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: num=5;
break;
case 0xdd: num=6;
break;
case 0xbd: num=7;
break;
case 0x7d: num=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb; //将P3第3口拉低
temp=P3;
temp=temp&0xf0; //检测P3口
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: num=9;
break;
case 0xdb: num=10;
break;
case 0xbb: num=11;
break;
case 0x7b: num=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7; //将P3第4口拉低
temp=P3;
temp=temp&0xf0; //检测P3口
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: num=13;
break;
case 0xd7: num=14;
break;
case 0xb7: num=15;
break;
case 0x77: num=16;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
你先试试单独发送一个数据行不行
而且num的数值不管有没有按键按下你都返回,肯定每次都要发送到串口了,会一直发的
嗯,提醒到我了,我在主函数中加了一条while语句,虽然能单个显示了,但是有时候不正确
void main()
{
init();
while(1)
{
ES=0;
while(keyscan()==keyscan());
SBUF=keyscan();
while(!TI);
TI=0;
ES=1;
}
}
1.num 既然是全局变量,感觉没必要return吧。
2.keyscan函数中按键弹起后flag置1,无按键置0
3. out函数只是检测是否输出完成
4.main中while改动较大
- /*
- 将键盘的值以1200bps发送到计算机,在计算机上显示。
- */
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar flag,temp,num,a,num_temp;
- void init()
- {
- TMOD=0x20; //timer1 mode2 8bit reload
- TH1=0xE8; //1200bps
- TL1=0xE8;
- TR1=1; //open timer1
- REN=1; //admit serial receive data
- SM0=0; //10bit asynchronous
- SM1=1;
- EA=1;
- ES=1; //open serial
- }
- void delay(uchar t) //delay function
- {
- uint i;
- for(t;t>0;t--)
- {
- for(i=115;i>0;i--);
- }
- }
- void out(uchar ch)
- {
- SBUF=ch;
- while(!TI);
- TI=0;
- }
- uchar keyscan();
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- if(flag==1)
- {
- ES=0;
- flag=0;
- if(num<10)
- out(num+48); //output 1-9
- else
- out(num+55); //output A-F
- out('\r');
- out('\n');
- ES=1;
- }
- }
- }
- void keyscan()
- {
- P3=0xfe; //将P3第一口拉低
- temp=P3;
- temp=temp&0xf0; //检测P3口
- while(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee: num=1;
- break;
- case 0xde: num=2;
- break;
- case 0xbe: num=3;
- break;
- case 0x7e: num=4;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- flag=1; //表示有按键
- }
- }
- P3=0xfd; //将P3第2口拉低
- temp=P3;
- temp=temp&0xf0; //检测P3口
- while(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xed: num=5;
- break;
- case 0xdd: num=6;
- break;
- case 0xbd: num=7;
- break;
- case 0x7d: num=8;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- flag=1; //表示有按键
- }
- }
- P3=0xfb; //将P3第3口拉低
- temp=P3;
- temp=temp&0xf0; //检测P3口
- while(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xeb: num=9;
- break;
- case 0xdb: num=10;
- break;
- case 0xbb: num=11;
- break;
- case 0x7b: num=12;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- flag=1; //表示有按键
- }
- }
- P3=0xf7; //将P3第4口拉低
- temp=P3;
- temp=temp&0xf0; //检测P3口
- while(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P3;
- switch(temp)
- {
- case 0xe7: num=13;
- break;
- case 0xd7: num=14;
- break;
- case 0xb7: num=15;
- break;
- case 0x77: num=16;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- flag=1; //表示有按键
- }
- }
- flag=0; //表示无按键
- }
键盘消抖动处理了吗?
其实可以没按钮按下时不发送,有按下时再发送相应键码
有时候解决这些问题很简单,只是想太多导致问题复杂化了。我也不想提类似模块化编程这样的说法,只是理所当然的就会想到应该这样去编才对啊。比如:串口发送,就单独编一个发送数据的功能,加多一个使能EN,当EN满足时将数据送出。再比如:按键识别,就单独编一个按键识别的功能,完成消抖一类的功能,返回键值和按键被触发的事件(可选)。然后再把这两个功能结合起来就OK。我们都应该培养这种功能块(别人也称模块化)的编程方法,每一个功能块通过形参等接口完成信息传递,这样每一个模块都可以独立调试,发现问题也能很快知道哪一个功能块出现问题。
模块化固然是好,只是现在实力没有,只能一步一步来了
学习了~~~~~~~~~~~~~~~~~~~