串口使用练习三
按下矩阵键盘第一行时以1200bps发送 1,2,3,4,第二行时以2400bps发送5,6,7,8,第三行时以4800bps发送9,A,B,C,第四行时以9600bps发送D,E,F,0.
本实验使用锐志电子RZ-51/AVR V2.8单片机,不同单片机引脚可能不同。下面给出代码段,欢迎讨论。
#include<reg52.h>
#define uint_8 unsigned char
#define uint_16 unsigned int
#define key P1
uint_8 Fosc = 0xfd, flag = 0, count, bit0, bit1, temp = 0, Row, Column;
uint_8 code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uint_8 code unit_table[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint_8 code send_table[4][4] = {{'1','2','3','4'},{'5','6','7','8'},{'9','A','B','C'},{'D','E','F','0'}};
void delay(uint_16 x);
void keyScan();
void display(uint_8 bit1, uint_8 bit0);
void init();
void main()
{
init();
while(1){
TH1 = Fosc;
TL1 = Fosc;
keyScan();
if(flag != 0){
flag = 0;
SBUF = send_table[Row][Column];
while(TI == 0);
TI = 0;
bit0 = send_table[Row][Column] % 10;
bit1 = send_table[Row][Column] / 10;
}
display(bit1,bit0);
}
}
void keyScan()
{
P1 = 0xff;
key = key & 0x0f;
if(key != 0x0f){
delay(10);
key = P1 & 0x0f;
if(key != 0x0f){
flag = 1;
switch(key){
case(0x0e): Fosc = 0xe8; Row = 0; break;
case(0x0d): Fosc = 0xf4; Row = 1; break;
case(0x0b): Fosc = 0xfa; Row = 2; break;
case(0x07): Fosc = 0xfd; Row = 3; break;
}
}
}
P1 = 0xff;
key = key & 0xf0;
if(key != 0xf0){
delay(10);
key = key & 0xf0;
if(key != 0xf0){
switch(key){
case(0xe0): Column = 0; break;
case(0xd0): Column = 1; break;
case(0xb0): Column = 2; break;
case(0x70): Column = 3; break;
}
}
}
}
void init(){
TMOD = 0x20;
TR1 = 1;
SM0 = 0;
SM1 = 1;
IE = 0x90;
}
void display(uint_8 bit1, uint_8 bit0)
{
P0 = 0xff;
P2 = unit_table[3];
P0 = table[bit1];
delay(1);
P0 = 0xff;
P2 = unit_table[4];
P0 = table[bit0];
delay(1);
}
void delay(uint_16 x){
uint_16 i, j;
for(i=0; i<x; i++)
for(j=0; j<=350; j++);
}