📄 huangvn9.c
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define keyport P2//P2定义键盘端口
#define no_key 20//定义无键按下返回值
#define backkey 10;//定义退格键
#define clearkey 11;//定义清除键
#define modifykey 12;//定义管理员登陆键
#define lockkey 13;//定义闭锁键
#define enterkey 14;//定义确认键
//定义按键扫描码表 按键扫描时,4位列线和4位行线组成字节数据表
uchar code keycode[]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
uchar password1[]={1,2,3,4,5,6}; //定义用户始初密码表
uchar code password2[]={6,5,4,3,2,1} ;// 定义 管理员初始化密码
uchar passinbuf1[6];//保存用户输入密码
uchar passinbuf2[6];//保存管理员登陆密码
uchar passinbuf3[6];//保存管理员修改密码第一次值
uchar passinbuf4[6];//保存管理员第二次输入密码值
uchar dispbuf[6];//保存显示的字符
uchar pass1=0;//用户输入密码存放passinbuf1[]中
uchar pass2=0;//管理员输入密码存放passinbuf2[]中
uchar pass3=0;//管理员修改输入第一次密码存放passinbuf3[]中
uchar pass4=0;//管理员修改输入第二次密码存放passinbuf4[]中
uchar errorcnt=0;//用户连续输入错误次数
uchar sysmode=0;//系统所处模式 0:用户输入密码模式 1:管理员修改密码模式 2:等待管理员解锁 3:管理员解密输入 4:管理员登陆
uchar xg=0;//0:管理员登陆 1:修改密码第一次输入做准备 2:修改密码再次输入做准备
//*************************************液晶部分定义
// 液晶显示控制
sbit lcd_psb=P1^0;
sbit lcd_e=P1^6;
sbit lcd_rw=P1^5;
sbit lcd_rs=P1^4 ;
sbit lcd_ret=P1^7;
sbit ACC7 = ACC^7;
sbit int00=P3^2; //使用外部中断0为键盘中断
sbit alarmcon=P1^2;// 控制蜂鸣器鸣叫
sbit lockcon=P1^3;//控制电子锁开闭
void write_cmd(unsigned char lcd_cmd); //写命令到LCD
void write_data(unsigned char lcd_data); //写数据到LCD
void lcd_int(void); //初始化LCD
void functionset(void);
void clear_lcd(void) ;
void delayms(unsigned int count);//延时1ms
void zhici();//开机致辞
void yonghu();//用户界面
void guanliyuan();//管理员界面
void xiugai();//修改密码第一次输入界面
void chaoshi();//输入密码超时
void queding();//修改密码第二次输入界面
void chenggong();//操作成功
void suoding(); //关闭服务器
//**********************
//1ms延时函数
void delayms(unsigned int count)//延时
{
unsigned int i;
while (count)
{
i=250;
while(i>0)i--;
count--;
}
}
//初始化LCD
void lcd_int(void)
{lcd_ret=0;
delayms(10);
lcd_ret=1;
_nop_();
lcd_psb=1;
_nop_();
}
//设置
void functionset(void)
{
write_cmd(0x30);//功能设置8位控制界面,基本指令集
write_cmd(0x0c);//显示打开,光标关,反白显示关
write_cmd(0x06);//DDRAM的地址计数器AC加1
write_cmd(0x01);//清除屏幕显示,将DDRAM的地址计数器清零
delayms(1);
}
//清屏
void clear_lcd(void)
{
write_cmd(0x01);
//write_cmd(0x34);
write_cmd(0x30);
}
//写命令到LCD
void write_cmd(unsigned char lcd_cmd) //写命令
{
delayms(100);
lcd_rs=0;
lcd_rw=0;
P0=lcd_cmd;
lcd_e=1;
_nop_();
_nop_();
lcd_e=0;
}
//写数据
void write_data( unsigned char lcd_data)//写数据
{
delayms(100);
lcd_rs=1;
lcd_rw=0;
P0=lcd_data;
lcd_e=1;
_nop_();
_nop_();
lcd_e=0;
}
//开机显示题目函数:基于弹片机的电子密码锁(保持5S)
void zhici()
{
write_cmd(0x91);
write_data(0xBB); //基
write_data(0xF9);
write_data(0xD3); //于
write_data(0xDA);
write_data(0xB5); //单
write_data(0xA5);
write_data(0xC6); //片
write_data(0xAC);
write_data(0xBB); //机
write_data(0xFA);
write_data(0xB5); //的
write_data(0xC4);
write_cmd(0x89);
write_data(0xB5); //电
write_data(0xE7);
write_data(0xD7); //子
write_data(0xD3);
write_data(0xC3); //密
write_data(0xDC);
write_data(0xC2); //码
write_data(0xEB);
write_data(0xCB); //锁
write_data(0xF8);
delayms(1000);//保持1S
clear_lcd();
}
//用户界面
void yonghu()
{
write_cmd(0x90);
write_data(0xCA);//输
write_data(0xE4);
write_data(0xC8);//入
write_data(0xEB) ;
write_data(0xC3); //密
write_data(0xDC);
write_data(0xC2);//码
write_data(0xEB);
write_data(0x3A);//冒号
}
//管理员界面
void guanliyuan()
{
write_cmd(0x90);
write_data(0xB9);//管
write_data(0xDC);
write_data(0xC0);//理
write_data(0xED);
write_data(0xD4);//员
write_data(0xB1);
write_data(0xCA);//输
write_data(0xE4);
write_data(0xC8);//入
write_data(0xEB) ;
write_data(0xC3); //密
write_data(0xDC);
write_data(0xC2);//码
write_data(0xEB);
write_data(0x3A);//冒号
}
void xiugai()
{
write_cmd(0x90);
write_data(0xD0);//修
write_data(0xDE);
write_data(0xB8);//改
write_data(0xC4);
write_data(0xC3); //密
write_data(0xDC);
write_data(0xC2);//码
write_data(0xEB);
write_data(0x3A);//冒号
}
void chaoshi()
{
write_cmd(0x90);
write_data(0xca);//输
write_data(0xe4);
write_data(0xc8);//入
write_data(0xeb);
write_data(0xc3);// 密
write_data(0xdc);
write_data(0xc2);// 码
write_data(0xeb);
write_data(0xca);//时
write_data(0xb1);
write_data(0xbc);//间
write_data(0xe4);
write_data(0xd2);//已
write_data(0xd1);
write_data(0xb5);//到
write_data(0xbd);
}
void queding()
{
write_cmd(0x90);
write_data(0xD4);//再
write_data(0xD9);
write_data(0xB4);//次
write_data(0xCE);
write_data(0xCA);//输
write_data(0xE4);
write_data(0xC8);//入
write_data(0xEB) ;
write_data(0x3A);//冒号
}
//密码输入成功界面
void chenggong()
{
write_cmd(0x91);
write_data(0xc3);//密
write_data(0xdc);
write_data(0xc2);//码
write_data(0xeb);
write_data(0xca);//输
write_data(0xe4);
write_data(0xc8);//入
write_data(0xeb);
write_data(0xd5);//正
write_data(0xfd);
write_data(0xc8);//确
write_data(0xb7);
}
//锁定界面
void suoding()
{
write_cmd(0x91);
write_data(0xb7);//服
write_data(0xfe);
write_data(0xce);//务
write_data(0xf1);
write_data(0xc6);//器
write_data(0xf7);
write_data(0xd2);//已
write_data(0xd1);
write_data(0xb1);//被
write_data(0xbb);
write_data(0xcb);//锁
write_data(0xf8);
write_cmd(0x88);
write_data(0xc7);//请
write_data(0xeb);
write_data(0xd3);//与
write_data(0xeb);
write_data(0xb9);//管
write_data(0xdc);
write_data(0xc0);//理
write_data(0xed);
write_data(0xd4);//员
write_data(0xb1);
write_data(0xc1);//联
write_data(0xaa);
write_data(0xcf);//系
write_data(0xb5);
}
// 键盘中断服务程序
uchar find_key()
{
delayms(10);//延时10MS消抖
if(int00==0)
{
uchar keytemp,i;
keytemp=keyport;//读按键端口值
if(keytemp==0xf0)
return no_key;
keyport=keytemp|0x0f;//线反转法
keytemp=keyport;//读取按键端口值
for(i=0;i<16;i++)
{
if(keytemp==keycode[i])//根据按键端口扫描值,查找按键值
//while(!int00);//直到按键释放返回键值
return i; //返回按键值
}
}
else
return no_key;
}
//键值处理函数
void key_process(uchar keytemp)
{
uchar a=0;
//uchar output;
uchar i;
/*uchar code dispnumber[]=
{0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,
};*/
if(keytemp==no_key)
return;//无键按下,不处理
switch(sysmode)
{
case 0://用户输入密码
switch(keytemp)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
TR0=1;//启动定时器T0
write_cmd(0x8A+pass1); //密码输入起始位
//output=dispnumber[keytemp];//查找代码
//write_data(output);//显示输入密码
write_data(0xA1);//显示黑点
write_data(0xf1);
passinbuf1[pass1]=keytemp;//保存用户输入的密码
if(pass1<6)
{
pass1++;//调整保存下一个密码位置
}
else
{
pass1=0;//只能输入6位的密码
}
//alarmcon=1;//发按键提示音200ms
//delayms(200);
//alarmcon=0;
break;
case 10://退格键
pass1=pass1-1;
write_cmd(0x8a+pass1);
write_data(0x20);//显示空格
write_data(0x20);
pass1=pass1-1;
break;
case 11://清除键
if(pass1!=0)
{
for(a=0;a<=pass1;a++)
{
write_cmd(0x8A+a); //从第一位开始清除
write_data(0x20);//显示空格
write_data(0x20);
}
a=0;
}
pass1=0;
break;
case 12 ://定义管理员登陆键
sysmode=1;//管理员登陆模式
clear_lcd();//清屏
break;
case 13://定义闭锁键
lockcon=1;
break;
case 14://定义确认键
for (i=0;i<6;i++)
{//比较用户输入密码与系统预设密码是否一致
if(passinbuf1[i]!=password1[i])
break; }
if(i>=6)
{ //输入密码正确
clear_lcd();
chenggong();
pass1=0;
errorcnt=0;//错误次数清零
lockcon=0;//开锁
alarmcon=1;//开蜂鸣器
delayms(2000);//蜂鸣器鸣叫2S
alarmcon=0;//关闭蜂鸣器
delayms(3000);//延时5S自动闭锁
lockcon=1;//闭锁
clear_lcd();
return;
}
else
{
errorcnt++;// 出错次数加1
if(errorcnt>2)
{//次数超过3次
// errorcnt=0;
pass1=0;
alarmcon=1;//报警1分钟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -