小弟最近學(xué)到了串口通信,于是自己動手寫了個發(fā)送程序:
鍵盤是3*3的矩陣鍵盤,K1到K9以此對應(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;//啟用定時器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; } 程序有些臃腫,
問題是下載到實驗板上K3,K6,K9始終沒有任何反應(yīng),更搞不懂的是在超級終端里顯示接收到得都是亂碼或者空格,用串口調(diào)試除了K1,K2,K5三個按鍵有反應(yīng)外其他都沒反應(yīng)像沒用一樣,可以確定的是鍵盤的硬件上沒有問題,程序部分的鍵盤掃描是調(diào)用以前做數(shù)字鐘的部分程序返回值也是正確的,可是為什么會這樣呢?百思不得其解?? |