📄 key.c
字号:
#include <reg51.h>
const char skey[10]={'1','2','3','4','5','6','7','8','9','0'};
const unsigned char act[3]={0xf7,0xef,0xdf};
const unsigned char roll[3]={0x03,0x05,0x06};
unsigned char key;
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit LED= P2^6;
sbit LED_RUN=P2^7;
unsigned char Rec;
unsigned char find;
delay(unsigned int i)
{
while(i--);
}
void InitSP()
//串口初始化,工作模式1,用定时器1做波特率发生器,9600b/s
{
SCON=0x40; /*串行控制寄存器,设定工作模式*/
TMOD=0x20; /*定时器模式控制寄存器,设定工作模式*/
TH1=0xFD; /*P1口寄存器*/
TR1=1; /*启动TR1*/
ET1=0; /*禁止T1中断*/
ES=1; /*允许串行口中断*/
EA=1; /*开中断*/
REN=1; /*允许接收*/
}
char scan_key()
//键盘扫描子程序,通过P1口进行循环扫描,判断那个键按下,从而确定键值
{
unsigned char i,j,ini,inj;
unsigned char in;
find=0;
for(i=0;i<3;i++)
{
P1=act[i];
in=P1;
if(in==act[i]) continue;
in=in&07;
for(j=0;j<3;j++)
if(roll[j]==in)
{
find=1;
ini=i;
inj=j;break;
}
if(find==1) break;
}
if(find==0)
return 0;
key=ini*3+inj;
return 1;
}
void get_key() //消抖子程序防止键盘抖动
{
while(1)
if(scan_key()==1){LED=0;break;}
while(1)
if(scan_key()==0){LED=1;break;}
}
void LCDWriteCommand(Cmd)
//液晶写命令子程序,RS为0,RW为0,E的下降沿将指令写入;
unsigned char Cmd;
{
RS=0;
RW=0;
P0=Cmd;
delay(10);
E=1;
delay(10);
E=0;
}
void LCDWriteData(Data)
//液晶写数据子程序,RS为1,RW为0,E的下降沿将指令写入;
unsigned char Data;
{
RS=1;
RW=0;
P0=Data;
delay(10);
E=1;
delay(10);
E=0;
}
void sciint() interrupt 4 using 3
//串口中断子程序,在接收中断里,将数据写入液晶
{
if(TI!=0)
{
TI=0;
}
if(RI!=0)
{
RI=0;
Rec=SBUF;
LCDWriteData(Rec);
}
}
main()
{
key=9;LED=1;LED_RUN=1;
InitSP();
LCDWriteCommand(0x30);delay(100);
//0x30为工作方式:8为数据,5*7点阵一行显示
LCDWriteCommand(0x30);delay(100);
//工作方式需写入三遍以上
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x30);delay(100);
LCDWriteCommand(0x38);delay(1000);
//8为数据,5*7点阵两行显示
LCDWriteCommand(0x01);delay(1000);
//0x01表示清DDRAM和AC的值
LCDWriteCommand(0x06);delay(1000);
//0x06表示数据写入后,AC自动加一,且画面不动
LCDWriteCommand(0x0f);delay(1000);
//0x0f表示开显示、光标、闪烁
LCDWriteCommand(0xc0);delay(1000);
//0xc0表示起始地址从第二行开始
//写入指令(可对照液晶指令集)
LCDWriteData('O');
delay(100);
LCDWriteData('N');
delay(100);
LCDWriteData(':');
while(1)
{
LED_RUN=1;
delay(4000);
get_key();
if(key!=9)
{
SBUF=skey[key];
LCDWriteData(skey[key]);
}
LED_RUN=0;
delay(4000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -