📄 keyboard.c
字号:
#include"reg52.h"
#include "intrins.h"
#include "key.h" //按键通码与ascii对照表
#define uchar unsigned char
#define uint unsigned int
#define cmd_word 0xff //复位命令
//sbit Clk_Line = P3^3; //时钟线
//sbit Data_Line=P3^5; //键盘数据线
sbit Clk_Line = P3^3; //时钟线
sbit Data_Line=P3^4; //键盘数据线
uchar key=0; //按键最终值
uint Key_Value=0;
uchar save=0;
uchar Int_Time=0;
void init(void);
void delay(uint us); //us=12大约100us
void command(uchar cmd);
void commanden(uchar cmd);
void interrupt1_receive(void);
void getkey(void) ;////内部中断0 用来处理缓冲区里的数据
void main(void)
{
uchar thir=2;
init(); //初始化
while(thir--)
{
command(cmd_word);
//commanden(0xf4);
delay(1000);
}
delay(150);
delay(300);
while(1)
{
EX1=1;
while(EX1) ;
P0=Key_Value;
getkey();
}
}
void init(void)
{
EA = 1;
IT1 = 1; //外部中断1是下降沿触发方式
TMOD = 0x20; //定时器1工作于方式2
TL1 = 0xfd; //串口波特率设置为9600
TH1 = 0xfd;
SCON = 0xd8; //11011000 串口工作方式3,11位异步收发,波特率由定时器1控制
PCON = 0x00;
TR1 = 1; //启动定时器1
}
void getkey(void)
{
uchar i=0;
save = Key_Value;
//P0 = save;
for(i=0;i<80;i++)
{
if(noshift[i][0]==save) //普按键的通码在缓冲区的第一位
{
key=noshift[i][1]; //搜索到字母后进行相应的处理
P0 = key;
break;
}
}
}
void delay(uint us) //us=12大约100us
{
while(us--) ;
}
void interrupt1_receive(void) interrupt 2
{
_nop_();
if(Data_Line)
Key_Value|=0x8000;
Int_Time++;
if(Int_Time==11)
{
Key_Value>>=6;
Int_Time=0;
EX1=0;
}
Key_Value>>=1;
}
void command(uchar cmd)
{
uchar parity,time;
parity=0;
Clk_Line=1;
Data_Line=1;
delay(100);
Clk_Line=0;
delay(20);
Data_Line=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Clk_Line=1;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1; //数据开始了
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
parity=8;
if((parity&0x01))
Data_Line=0;
Data_Line=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!Clk_Line) ;
while(Clk_Line) ;
Data_Line=1;
while(!Clk_Line);
while(Data_Line) ;
while(Clk_Line) ;
while(!Clk_Line) ;
while(!Data_Line);
}
void commanden(uchar cmd)
{
uchar parity,time;
parity=0;
Clk_Line=1;
Data_Line=1;
delay(100);
Clk_Line=0;
delay(20);
Data_Line=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Clk_Line=1;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=0;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=0;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=0;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Data_Line=1;
while(!Clk_Line) ;
while(Clk_Line) ;
parity=5;
if((parity&0x01))
Data_Line=0;
Data_Line=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!Clk_Line) ;
while(Clk_Line) ;
Data_Line=1;
while(!Clk_Line);
while(Data_Line) ;
while(Clk_Line) ;
while(!Clk_Line) ;
while(!Data_Line);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -