📄 key.c
字号:
#include <stdio.h>
#include "STC89C51RC.H"
sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit SPEAK = P3^6;
unsigned char UartStauts;
unsigned char SpeakOn;
unsigned char code keynum[8][8]={
/* A~Z*/
0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,
0x17,0x24,0x25,0x26,0x32,0x31,0x18,0x19,
0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,
0x15,0x2C,
/* 0......9*/
0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,
/*F1..….f10*/
0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,
/* . ; + - / */
0x34,0x27,0x0D,0x0C,0x35,
/* ↑↓←→空格 */
0x1E,0x1F,0x20,0x21,0x22,
/* Ctrl Alt Shift Esc Del */
0x23,0x24,0x25,0x1E,0x1F,
/* Insert BackSpace 回车 Pageup Pagedown End */
0x52,0x0E,0x1C,0x49,0x51,0x4F,
}; //key1~key5,enter,right,left.
unsigned char code keynum1[3]={0x01,0x02,0x03};
unsigned char Key_flag; //有键按下标志
unsigned char Key_num; //按下键盘值
/******************************************************************************
******************************************************************************/
void Delay()
{
unsigned int i;
for(i=0;i<1000;i++){i=i;}
}
/******************************************************************************
******************************************************************************/
void Delay20ms()
{
unsigned int i;
for(i=0;i<500;i++){i=i;}
}
/******************************************************************************
******************************************************************************/
void mcu_int()
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数
TH1 = 0xFC; //14.3184MHz 9600波特率
TL1 = 0xFC;
PS = 1;
ES=1; //Enable serial
EA=1;
TI = 0;
TR1 = 1; //启动定时器
}
/******************************************************************************
******************************************************************************/
void Char_send(unsigned char chr)
{
SBUF=chr;
while(!TI);
TI=0;
}
char Getdata(unsigned char num)
{
switch(num)
{
case 0x01 : return 0; break;
case 0x02 : return 1; break;
case 0x04 : return 2; break;
case 0x08 : return 3; break;
case 0x10 : return 4; break;
case 0x20 : return 5; break;
case 0x40 : return 6; break;
case 0x80 : return 7; break;
}
}
/******************************************************************************
******************************************************************************/
void Key_scan()
{
unsigned char temp,i=0;
unsigned char line,col,s1,s2;
P2 = 0;
if((P0 != 0xff)||((P1&0x1c)!=0x1c))
{
if(SpeakOn == 1)
SPEAK = 1;
Delay20ms();
if(P0 != 0xff)
{
Key_flag=1;
line = 0xfe;
for(i=0;i<8;i++)
{
P2 = line;
if(P0 != 0xff)
{
col = P0;
s1=Getdata(~line);
s2=Getdata(~col);
Key_num = keynum[s1][s2];
break;
}else
line=(line<<1)|0x01;
}
while(P0 != 0xff);
}
if ((P1&0x1c)!=0x1c)
{
Key_flag=1;
temp = P1&0x1c ;
switch(temp)
{
case 0x0c: Key_num=keynum1[0]; //enter
break;
case 0x14: Key_num=keynum1[1]; //right
break;
case 0x18: Key_num=keynum1[2]; //left
break;
default :
break;
}
}
}
else SPEAK = 0;
}
/******************************************************************************
******************************************************************************/
void Key_send()
{
while(P1!=0xff);
Char_send(0xeb); //包头
Delay();
Char_send(0x67);
Delay();
Char_send(Key_num);
Delay();
Char_send(0xfb);
}
/*******************UART 中断处理程序*****************************/
void serial0_process(void) interrupt 4 using 1
{
unsigned char temp;
if(RI)
{
EA=0;RI=0;
switch(UartStauts)
{
case 0 :
if(SBUF != 0xeb)UartStauts=0x00;
else UartStauts=0x01;
break;
case 1 :
temp = SBUF;
if(temp == 0x66)
UartStauts=0X02;
break;
case 2 :
temp = SBUF;
if (temp == 1)
SpeakOn = 1;
if (temp == 0)
SpeakOn = 0;
UartStauts=0x03;
break;
case 3 :
temp = SBUF;
UartStauts=0x00;
break;
}
EA=1;
}
}
/******************************************************************************
******************************************************************************/
void main(void)
{
SPEAK = 0;
mcu_int();
while(1)
{
Key_scan();
if(Key_flag == 1)
{
Key_flag = 0;
Key_send();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -