📄 sercom.c
字号:
#include <reg51.h>
#include <intrins.h>
sbit P34 = 0xB4;
sbit P35 = 0xB5;
unsigned char get_char(void); /* 函数说明 */
void delay(void);
main() {
unsigned char keybuf[16], count; /* 键盘缓冲区和读键计数变量 */
SCON=0; /* 将串行口设置成工作方式0 */
ES=0; /* 禁止串口中断 */
EA=0;
count=0;
while(count<16) keybuf[count++]=get_char(); /* 读入16个按键的键值 */
}
unsigned char get_char(void) {
/* 定义表示列号、键序号和待发送数据的变量column、key_code和mask */
unsigned char key_code, column=0, mask=0x00;
/* 下列语句从串行口向74LS164移位输出8个0 */
TI=0;
SBUF=mask;
while(TI==0); /* 等待发送完毕 */
/* 下列语句通过检测P3.4和P3.5是否为0来判断是否有键压下, 检测到有键压下时
延时10ms以消除桉键抖动, 然后继续检测P3.4和P3.5是否为0, 若不为0则表明
检测到干扰信号并继续等待按键, 否则表示有一个键被可靠地按下并退出循环
*/
while(1) {
while((P34&P35)!=0);
delay();
if((P34&P35)!=0) continue;
else break;
}
/* 下列语句分析被按下的键所在的列号 */
mask=0xfe;
while(1) {
TI=0;
SBUF=mask;
while(TI==0);
if((P34&P35)!=0) {
mask=_crol_(mask,1); /* mask的值循环左移一位 */
column++;
if(column>=8) column=0;
continue;
}
else break;
}
/* 下列语句分析被按下的键所在的行号并计算键序号 */
if(P34==0) key_code=column;
else key_code=8+column;
return(key_code);
}
void delay(void) {
unsigned int i=10; /* 延时10ms */
while(i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -