小弟最近學(xué)到了串口通信,于是自己動(dòng)手寫(xiě)了個(gè)發(fā)送程序:
鍵盤是3*3的矩陣鍵盤,K1到K9以此對(duì)應(yīng)要發(fā)送的A到I字符
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char;
kbscan();鍵盤
rs232_into();
send(unsigned char sdata);
delay(uint t);
unsigned char key,dat;
main()
{
rs232_into();
while(1)
{
key=kbscan();鍵盤掃描帶回的返回值
dat=key&0x3f;屏蔽高兩位,保留六位
switch(dat)
{
case(0x1e): //k1
{
send('A');
break;
}
case(0x2e): //k2
{
send('B');
break;
}
case(0x36): //k3
{
send('C');
break;
}
case(0x1d): //k4
{
send('D');
break;
}
case(0x2d): //k5
{
send('E');
break;
}
case(0x35): //k6
{
send('F');
break;
}
case(0x1b): //k7
{
send('G');
break;
}
case(0x2b): //k8
{
send('H');
break;
}
case(0x33): //k9
{
send('I');
break;
}
default:
break;
}
}
}
rs232_into() //初始化232
{
SCON=0x50;//串口方式1,允許接收
TMOD=0x20;//啟用定時(shí)器1
PCON=0x80;//SMOD=0不加倍
TH1=0XFD;
TL1=0XFD;
TR1=1;
}
kbscan()//鍵盤掃描
{
unsigned char sccode,recode;
P1=0XF0;
if((P1&0xf0)!=0xf0)
{
delay(10000);
if((P1&0XF0)!=0XF0)
{
sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0)
{
recode=P1&0XF0;
sccode=sccode&0x0f;
return(recode+sccode);
}
else
sccode=sccode<<1|0x01;
}
}
}
return(0);
}
delay(uint t)
{
for(;t>0;t--);
}
send(unsigned char sdata)
{
SBUF=sdata;
while(!TI);
TI=0;
}
程序有些臃腫,
問(wèn)題是下載到實(shí)驗(yàn)板上K3,K6,K9始終沒(méi)有任何反應(yīng),更搞不懂的是在超級(jí)終端里顯示接收到得都是亂碼或者空格,用串口調(diào)試除了K1,K2,K5三個(gè)按鍵有反應(yīng)外其他都沒(méi)反應(yīng)像沒(méi)用一樣,可以確定的是鍵盤的硬件上沒(méi)有問(wèn)題,程序部分的鍵盤掃描是調(diào)用以前做數(shù)字鐘的部分程序返回值也是正確的,可是為什么會(huì)這樣呢?百思不得其解??
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |