📄 yjkey.c
字号:
/*.....................键盘程序.................*/
#include <reg51.h>
#include <intrins.h>
unsigned char key,Byte1,Byte2,count=0;//键盘中数字对应的汉字库中的值
unsigned char i,j,pwbuf[6],pw[6];
bit pwflag,enterflag,flag;
static unsigned char add=0x89;//定义初始的地址
//液晶程序引脚定义
sbit CS = P0^2;//片选
sbit SID = P0^1; //数据
sbit SCLK = P0^0; //时钟
sbit POWER= P1^1; //低电平电源开
sbit BACKLIGHT = P1^0; //背光
void lcdinit(void);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void SendByte(unsigned char dat);
void sendbyte(unsigned char bbyte);
void delay(unsigned int n) ;
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2);
void judge(void);
unsigned char keyscan(void);
bit pwcmp(void);
void lcdinit(void) //初始化LCD
{ CS=0;
delay(100); //启动等待,等LCM讲入工作状态
CS=1;
BACKLIGHT=0;
SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
void SendCMD(unsigned char dat) //发送指令
{
CS=1;
SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
CS=0;
}
void SendDat(unsigned char dat) //发送数据
{
CS=1;
SendByte(0xFA);//11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
CS=0;
}
void SendByte(unsigned char dat) //发送字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK=1;
if(dat&0x80) SID=1;else SID=0;
SCLK=0;
dat=dat<<1;
}
}
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2) // 显示
{
SendCMD(x_add);
SendDat(dat1);
SendDat(dat2);
}
void delay(unsigned int n) //延时函数
{
unsigned int i;
for(i=0; i<n; i++) {;}
}
unsigned char keyscan(void) //键扫描函数
{
unsigned char scancode,tmpcode;
P2=0xf0; //发行扫描码0
if((P2&0xf0)!=0xf0) //如果有键按下
{
delay(300); //延时消抖
if((P2&0xf0)!=0xf0) //延时再判断一次,去除抖动影响
{
scancode=0xfe;
while((scancode&0x10)!=0) //逐行扫描
{
P2=scancode;//输出行扫描码
if((P2&0xf0)!=0xf0)//本行有键按下
{
tmpcode=(P2&0xf0)|0x0f;//返回特征字节码,为1的位即对应行和列
return((~scancode)+(~tmpcode));
}
else scancode=(scancode<<1)|0x01;//行扫描码左移一位
}
}
}
return(0);//无键按下返回值为0
}
void judge(void) //判断是否超出密码范围
{
for(i=0;i<5;i++)
{
display(0x89,0xb3,0xac);//超
display(0x8a,0xb3,0xf6);//出
display(0x8b,0xc3,0xdc);//密
display(0x8c,0xc2,0xeb);//码
display(0x8d,0xb7,0xb6);//范
display(0x8e,0xce,0xa7);//围
display(0x8f,0xa2,0xf0);//输入为空
delay(10000000000);
}
for(i=0;i<5;i++)
{
display(0x89,0xc7,0xeb);//请
display(0x8a,0xd6,0xd8);//重
display(0x8b,0xd0,0xc2);//新
display(0x8c,0xca,0xe4);//输
display(0x8d,0xc8,0xeb);//入
display(0x8e,0xa2,0xf0);//输入为空
delay(10000000000);}
display(0x89,0xa2,0xf0);//输入为空
display(0x8a,0xa2,0xf0);//输入为空
display(0x8b,0xa2,0xf0);//输入为空
display(0x8c,0xa2,0xf0);//输入为空
display(0x8d,0xa2,0xf0);//输入为空
display(0x8e,0xa2,0xf0);//输入为空
add=0x89;//将光标放到初始地址
count=0;
pw[0]=0; //定义密码的值放在pw[]数组里面
pw[1]=0;
pw[2]=0;
pw[3]=0;
pw[4]=0;
pw[5]=0;
}
/* 密码比较函数 */
bit pwcmp(void)
{
unsigned char i;
for (i=0;i<6;i++)
{
if (pw[i]==pwbuf[i])
flag = 1;
else
{
flag = 0;
i = 6;
}
}
return(flag);
}
void main()
{
lcdinit();
pw[0]=0; //定义密码的值放在pw[]数组里面
pw[1]=0;
pw[2]=0;
pw[3]=0;
pw[4]=0;
pw[5]=0;
while(add>0x88&&add<0x90) //液晶模块的显示地址是在89H-8FH
{
delay(100);
display(0x82,0xbd,0xf5);//
display(0x83,0xcd,0xbc);//
display(0x84,0xca,0xfd);//
display(0x85,0xc2,0xeb);//
display(0x92,0xca,0xe4);//输
display(0x93,0xc8,0xeb);//入
display(0x94,0xc3,0xdc);//密
display(0x95,0xc2,0xeb);//码
key=keyscan();
switch(key) //判断键值
{
case 0x11: //第一行第一列,数字0
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 0;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x21: //第一行第二列,数字1
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 1;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x41: //第一行第三列, 数字2
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 2;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x81: //第一行第四列, 数字3
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 3;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x12: //第二行第一列, 数字4
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 4;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x22: //第二行第二列, 数字5
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 5;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x42: //第二行第三列, 数字6
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 6;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x82: //第二行第四列, 数字7
Byte1=0xa1;Byte2=0xef;// 显示五角星
display(add,Byte1,Byte2);
pwbuf[count] = 7;
count++;
add++;
judge();
delay(100000000); //沿时防止连续按键
break;
case 0x14: //第三行第一列, 数字8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -