//P2为键盘输入位;P3.3为一个发光二极管,用来标志锁是否打开
//P3.0,P3.1,P3.2分别为RS,RW,EN; P4为数据传输位
#include<msp430x14x.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_RS_H P3OUT |= BIT0 //P3.0
#define LCD_RS_L P3OUT &= ~BIT0
#define LCD_RW_H P3OUT |= BIT1 //P3.1
#define LCD_RW_L P3OUT &= ~BIT1
#define LCD_EN_H P3OUT |= BIT2 //P3.2
#define LCD_EN_L P3OUT &= ~BIT2
//液晶显示程序
void delay(uint z); //液晶延时函数
void initial();
void write_com(uchar com);
void write_data(uchar dat);
void write_string(uchar *string);
//键盘程序
void menu(); //菜单选择函数,用以选择解锁,设密码功能
void input_show(); //开锁时读取键盘值并显示函数
void set_show(); //设定密码时读取键盘值并显示函数
void delay2(uchar z); // 键盘延时函数
uchar scan_keys(void); //键盘扫描函数
uchar unlock(void); //解锁函数
void wait(); //3次密码输入错误,执行锁屏函数
uchar exit = 0;//设全局变量,用以在输入密码三次错误时强制退出解锁系统
//键盘编码
uchar table[]={ //switch语句中的键盘值
0x00,0x31,0x32,0x33,0x46, //不显示, 1, 2, 3, 设置密码 1, 2, 3, 4
0x34,0x35,0x36,0x47, // 4, 5, 6, 确定 5, 6, 7, 8
0x37,0x38,0x39,0x48, // 7, 8, 9, 解锁 9,10,11,12
0x45,0x30,0x48,0x00}; // 复位, 0, 退出主菜单, 返回主菜单 13,14,15,16
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
uchar table_turn[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //将数字转化为ASCII码
uchar tip[][40]={"设置密码成功",
"设置密码失败",
"解锁成功",
"解锁失败",
"请按键,选择所要进行的操作",
"请输入6 位密码:",
"密码匹配中",
"请输入6 位新密码:",
"三次密码输入错误,请等待响应:"};
uchar input_password[6]={0}; //将输入的密码存入数组
uchar password[6]={1,1,1,2,2,2}; //存储密码数组,预设密码为111222
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF; //蜂鸣器
P1OUT |= BIT2;
P1OUT &= ~BIT0; //二极管灭
P1OUT &= ~BIT1;
P3DIR = 0XFF; //液晶读写控制I/O口
P4DIR = 0Xff; //液晶数据传输I/O口
P2DIR = 0X0f; //矩阵键盘I/O口
P2OUT = 0X00; //清除干扰
P2IES = 0X00; //上升沿触发
P2IFG = 0X00; //因为P1IES设置会使中断标志置位,故清零
P2IE = 0XFF; //系统中断允许
_EINT();
initial(); //初始化
LPM0;
}
//P2中断程序
#pragma vector = PORT2_VECTOR
__interrupt void P2_Interrupt(void)
{
menu();
}
uchar unlock(void)
{
uchar i = 0,flag = 1; //设置flag标志,若为1,则密码输入正确;若为0,密码输入错误
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[6]);
while(i<6)
{
if(table_turn[ password[i] ] != input_password[i])
{
flag = 0;
break;
}
if(table_turn[ password[i] ] == input_password[i]) i++;
}
return flag;
}
void wait()
{
uchar control_1,control_2,stop = 0;
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[8]);
write_com(0x0c); ///整体显示,游标显示,游标位置显示
P1OUT &= ~BIT2;
for(control_1 = 0;control_1 < 10;control_1++)
{
write_com(0x8F);
write_data(0x39 - stop);
stop++;
for(control_2 = 0;control_2 < 10;control_2++) //输错时间延时
{
delay2(255);
}
}
P1OUT |= BIT2;
}
void menu()
{
P1OUT &= ~BIT0; //二极管灭
P1OUT &= ~BIT1;
uchar temp = 0,cc; //temp为 unlock()返回标志,用以确定是否解锁成功
write_com(0x01);//清屏
write_com(0x0F);
write_string(tip[4]);
while(1)
{
cc = scan_keys();
if(cc)
{
switch(cc)
{
case 12://解锁
input_show();
temp = unlock();
if(temp == 0)
{
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[3]);
write_com(0x0c); //显示指令:开显示,光标关
exit++;
if(exit == 3) goto await; //三次输密错误,强制进入wait()函数
}
else
{
P1OUT |= BIT0; //P3.3为1,灯亮,锁打开
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[2]);
write_com(0x0c); //显示指令:开显示,光标关
}
while(1)
{
cc = scan_keys();
if(cc == 16)
{
menu();break;
}
}
case 4: //设置密码
P1OUT |= BIT1;
input_show();
temp = unlock(); //设置密码时,首先验证旧密码。若为1,则密码输入正确;若为0,密码输入错误
if(temp == 0) //不能更改密码
{
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[1]);
write_com(0x0c); //显示指令:开显示,光标关
exit++;
if(exit == 3) goto await;
}
else //temp = 1,可以更改密码
{
set_show(); //更改密码
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[0]);
write_com(0x0c); //显示指令:开显示,光标关
}
while(1)
{
cc = scan_keys();
if(cc == 16)
{
menu();break;
}
}
case 15:exit = 0;
LPM0; //人工强制进入低功耗
break;
default: break;
}
}
if(exit == 3)
{
await:exit = 0;
wait(); //3次输入密码错误时,进入wait()函数,在wait()函数中编写,结束后返回menu()
menu();
break;
}
}
}
void input_show()
{
uchar flag = 0, j = 0,aa;
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[5]);
while(1)
{
aa = scan_keys();
if(aa)
{
switch(aa)
{
case 1:case 2:case 3:case 5:case 6:case 7:case 9:case 10:case 11:case 14:
P5OUT = table[aa];
write_data(P5OUT);
input_password[j] = table[aa]; j++; //将输入密码存入数组
break;
case 16: menu(); break;
case 13: write_com(0x01);//清屏
write_com(0x80);
write_string(tip[5]);
j = 0; //将j置零,清除存入input_password中错误的信息
continue;
case 8: flag = 1;break; //密码输入完成,置标志flag = 1
default:break;
}
}
if(flag == 1) break; //跳出while循环
}
}
void set_show()
{
uchar j=0,k = 0,flag = 0,bb;
write_com(0x01);//清屏
write_com(0x80);
write_string(tip[7]);
while(1)
{
bb = scan_keys();
if(bb)
{
switch(bb)
{
case 1:case 2:case 3:case 5:case 6:case 7:case 9:case 10:case 11:case 14:
P5OUT = table[bb];
write_data(P5OUT);
input_password[j] = table[bb] - 0x30; j++;//table[bb]中为数字的ASCII码,减去0x30,将其转换为与十进制相等的十六进制形式,再将其存入数组
break;
case 16: menu();break;
case 13: write_com(0x01);//清屏
write_com(0x80);
write_string(tip[5]);
j = 0; //将j置零,清除存�
mima.zip_430f149单片机
版权申诉
146 浏览量
2022-09-24
20:54:29
上传
评论
收藏 3KB ZIP 举报
局外狗
- 粉丝: 66
- 资源: 1万+
最新资源
- ModStartCMS v8.4.0 框架稳定性持续迭代,修复部分已知问题
- bleder 教室学校学生教育室办公室考试
- 人脸检测-使用OpenCV实现的动漫+漫画人脸检测算法-附项目源码-优质项目实战.zip
- 道路贴图,材质材料免费
- 人脸检测-基于OpenCV+Node.js+WebSockets实现的实时人脸检测应用-附项目源码-优质项目实战.zip
- 一些常见的MySQL死锁案例-mysql-deadlocks-master(源代码+案例+图解说明)
- UE4动画烘焙器-ue4.27
- 新建文件夹.zip
- 1103a2a791bbd96ea98021062e327495b1c422e32fb27e0c2d6404b1bd74b692.gif
- 同城相亲交友php小程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0