Слияние кода завершено, страница обновится автоматически
#include "stc12c5a60s2.h"
#include "key.h"
#include "eeprom.h"
#include "lcd.h"
#include "string.h"
#include "intrins.h"
#include "others.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
unsigned int code addr = 0x0000;//EEPROM扇区1地址(第一个字节)
u8 ole_pwd[6] = {1,1,1,1,1,1};
u8 input_pwd[6] = {0,0,0,0,0,0};
u8 pwd_len = 0;
u8 pwd_error = 0;//密码错误次数
extern u8 time_LCD1602_A;
//测试字符数组
//u8 code key_num[4][4]={
//{'1','2','3','A'},
//{'4','5','6','B'},
//{'7','8','9','C'},
//{'*','0','#','D'}
//};
/******
1,2,3,A
4,5,6,B
7,8,9,C
*,0,#,D
******/
//向左摆
u8 code key_num[4][4]={ { 1, 2, 3,13},
{ 4, 5, 6,14},
{ 7, 8, 9,15},
{11,10,12,16} };
void Delay_1ms(u8 z) //@11.0592MHz
{
u8 i, j, k;
for(k=0;k<z;k++)
{
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//线反转法
//键盘扫描获取键值
//返回值:键值
//u8 KEY_Scan(void)
//{
// u8 key_val = 0;
// u8 row, col;
// u8 temp;
//
// GPIO_KEY = 0xF0;
// if(GPIO_KEY == 0xF0) //没有键被按下
// return 0;
// else
// {
// Delay_1ms(5); //5ms延时消抖
// if(GPIO_KEY == 0xF0)
// return 0;
// }
//
// GPIO_KEY = 0xF0;
// if((GPIO_KEY & 0xF0) != 0xF0)
// {
// Delay_1ms(10); //10ms延时消抖
// if((GPIO_KEY & 0xF0) != 0xF0)
// {
// temp = GPIO_KEY & 0xF0;
// switch(temp)
// {
// case 0x70: row = 0;break;
// case 0xB0: row = 1;break;
// case 0xD0: row = 2;break;
// case 0xE0: row = 3;break;
// }
//
// GPIO_KEY = 0x0F;
// Delay_1ms(10); //10ms延时消抖
// temp = GPIO_KEY & 0x0F;
// switch(temp)
// {
// case 0x07: col = 0;break;
// case 0x0B: col = 1;break;
// case 0x0D: col = 2;break;
// case 0x0E: col = 3;break;
// }
// while((GPIO_KEY & 0x0F) != 0x0F);//等待按键松开
// key_val = key_num[row][col];
// return key_val;
// }
// }
// return 0;
//}
//键盘扫描:行扫描法
//返回值 :1-16,键值(正常)
// 0,无按键按下
u8 KEY_Scan(void)
{
u8 key_val = 0;
u8 row, col;
u8 temp;
// GPIO_KEY = 0xF0;
// if(GPIO_KEY == 0xF0) //没有键被按下
// return 0;
// else
// {
// Delay_1ms(5); //5ms延时消抖
// if(GPIO_KEY == 0xF0)
// return 0;
// }
//第一行
GPIO_KEY = 0x7F;
if(GPIO_KEY != 0x7F)
{
Delay_1ms(10); //10ms延时消抖
if(GPIO_KEY != 0x7F)
{
temp = GPIO_KEY;
switch(temp)
{
case 0x77: row = 0;col = 0;break;
case 0x7B: row = 0;col = 1;break;
case 0x7D: row = 0;col = 2;break;
case 0x7E: row = 0;col = 3;break;
}
while(GPIO_KEY != 0x7F);//等待按键松开
key_val = key_num[row][col];
return key_val;
}
}
//第二行
GPIO_KEY = 0xBF;
if(GPIO_KEY != 0xBF)
{
Delay_1ms(10); //10ms延时消抖
if(GPIO_KEY != 0xBF)
{
temp = GPIO_KEY;
switch(temp)
{
case 0xB7: row = 1;col = 0;break;
case 0xBB: row = 1;col = 1;break;
case 0xBD: row = 1;col = 2;break;
case 0xBE: row = 1;col = 3;break;
}
while(GPIO_KEY != 0xBF);//等待按键松开
key_val = key_num[row][col];
return key_val;
}
}
//第三行
GPIO_KEY = 0xDF;
if(GPIO_KEY != 0xDF)
{
Delay_1ms(10); //10ms延时消抖
if(GPIO_KEY != 0xDF)
{
temp = GPIO_KEY;
switch(temp)
{
case 0xD7: row = 2;col = 0;break;
case 0xDB: row = 2;col = 1;break;
case 0xDD: row = 2;col = 2;break;
case 0xDE: row = 2;col = 3;break;
}
while(GPIO_KEY != 0xDF);//等待按键松开
key_val = key_num[row][col];
return key_val;
}
}
//第四行
GPIO_KEY = 0xEF;
if(GPIO_KEY != 0xEF)
{
Delay_1ms(10); //10ms延时消抖
if(GPIO_KEY != 0xEF)
{
temp = GPIO_KEY;
switch(temp)
{
case 0xE7: row = 3;col = 0;break;
case 0xEB: row = 3;col = 1;break;
case 0xED: row = 3;col = 2;break;
case 0xEE: row = 3;col = 3;break;
}
while(GPIO_KEY != 0xEF);//等待按键松开
key_val = key_num[row][col];
return key_val;
}
}
return 0;
}
//密码显示程序
//入口参数:length,密码长度,最长为6
void KEY_Len_Display(u8 length,u8 x,u8 y)
{
if(length == 0)
{
Lcd_Show_Data(x,y," ",6);
}
else if(length == 1)
{
Lcd_Show_Data(x,y,"* ",6);
}
else if(length == 2)
{
Lcd_Show_Data(x,y,"** ",6);
}
else if(length == 3)
{
Lcd_Show_Data(x,y,"*** ",6);
}
else if(length == 4)
{
Lcd_Show_Data(x,y,"**** ",6);
}
else if(length == 5)
{
Lcd_Show_Data(x,y,"***** ",6);
}
else if(length == 6)
{
Lcd_Show_Data(x,y,"******",6);
}
else
{
return;
}
}
//密码对比程序
//入口参数: string1,密码1
// string2,密码2
// length,密码对比长度
//返回值 : 1,密码匹配
// 2,密码错误
u8 KEY_Pwd_Compare(u8 *string1, u8 *string2, u8 length)
{
if(!strncmp(string1,string2,length))
return 1;
else
return 0;
}
//判断旧密码程序
void KEY_Judge_Old_Pwd(void)
{
u8 key_val;
u8 i;
while(1)
{
key_val = KEY_Scan();
if(key_val)
{
//显示重置
LCD1602_A = 1; //开背光
time_LCD1602_A = 15; //背光时间重置为15s
if((key_val <= 10)&&(key_val >=1))//密码建1,2,3,4,5,6,7,8,9,10(0)
{
if(pwd_len >= 6)
{
continue;
}
if(key_val == 10)
{
input_pwd[pwd_len] = 0;
}
else
{
input_pwd[pwd_len] = key_val;
}
pwd_len++;
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 13)//退格A
{
if(pwd_len == 0)
{
continue;
}
pwd_len--;
input_pwd[pwd_len] = 0;
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 14)//清空B
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 15)//返回C
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
Lcd_Show_Data(2,1,"input: ",16);
return;
}
else if(key_val == 16)//确认D
{
if(KEY_Pwd_Compare(ole_pwd,input_pwd,6))//密码正确
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
Lcd_Show_Data(2,9,"ture !",6);
Delay1000ms();
Lcd_Show_Data(2,1,"new pwd: ",16);
//设置新密码
KEY_Set_New_Pwd();
return;
}
else//密码错误
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
Lcd_Show_Data(2,9,"error!",6);
Delay1000ms();
Lcd_Show_Data(2,1,"input: ",16);
return;
}
}
}
}
}
//设置新密码
void KEY_Set_New_Pwd(void)
{
u8 key_val;
u8 i;
while(1)
{
key_val = KEY_Scan();
if(key_val)
{
//显示重置
LCD1602_A = 1; //开背光
time_LCD1602_A = 15; //背光时间重置为15s
if((key_val <= 10)&&(key_val >=1))//密码建1,2,3,4,5,6,7,8,9,10(0)
{
if(pwd_len >= 6)
{
continue;
}
if(key_val == 10)
{
input_pwd[pwd_len] = 0;
}
else
{
input_pwd[pwd_len] = key_val;
}
pwd_len++;
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 13)//退格A
{
if(pwd_len == 0)
{
continue;
}
pwd_len--;
input_pwd[pwd_len] = 0;
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 14)//清空B
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
KEY_Len_Display(pwd_len,2,9);
}
else if(key_val == 15)//返回C
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
Lcd_Show_Data(2,1,"input: ",16);
return;
}
else if(key_val == 16)//确认D
{
if(pwd_len < 6)//新密码长度不足6位
{
continue;
}
else
{
for(i=0;i<6;i++)
{
ole_pwd[i] = input_pwd[i];
}
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
/*写入EEPROM*/
IapEraseSector(addr);//擦除扇区1,地址:0000H
for(i=0;i<6;i++)
{
IapProgramByte(addr+i,ole_pwd[i]);
}
/*写入EEPROM*/
Lcd_Show_Data(2,9,"success!",8);
Delay1000ms();
Lcd_Show_Data(2,1,"input: ",16);
return;
}
}
}
}
}
/**********************
1,2,3,A---{ 1, 2, 3,13},
4,5,6,B---{ 4, 5, 6,14},
7,8,9,C---{ 7, 8, 9,15},
*,0,#,D---{11,10,12,16}
**********************/
void KEY_Pros(void)
{
u8 key_val;
u8 i;
key_val = KEY_Scan();
if(key_val)
{
//显示重置
LCD1602_A = 1; //开背光
time_LCD1602_A = 15; //背光时间重置为15s
if((key_val <= 10)&&(key_val >=1))//密码建1,2,3,4,5,6,7,8,9,10(0)
{
if(pwd_len >= 6)
{
return;
}
if(key_val == 10)
{
input_pwd[pwd_len] = 0;
}
else
{
input_pwd[pwd_len] = key_val;
}
pwd_len++;
KEY_Len_Display(pwd_len,2,7);
}
else if(key_val == 11)
{
}
else if(key_val == 12)
{
}
else if(key_val == 13)//退格
{
if(pwd_len == 0)
{
return;
}
pwd_len--;
input_pwd[pwd_len] = 0;
KEY_Len_Display(pwd_len,2,7);
}
else if(key_val == 14)//清空
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
KEY_Len_Display(pwd_len,2,7);
}
else if(key_val == 15)//修改
{
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
Lcd_Show_Data(2,1,"old pwd: ",16);
//判断旧密码
KEY_Judge_Old_Pwd();
return;
}
else if(key_val == 16)//确认
{
if(KEY_Pwd_Compare(ole_pwd,input_pwd,6))//密码正确
{
pwd_error = 0;//密码错误次数清零
relay = 1;
Delay1000ms();
Delay1000ms();
relay = 0;
Delay1000ms(); //这个延时不可少,需要等待电磁锁完全关断
/*重新初始化LCD1602,因为开锁会失效*/
LcdInit();
LCD1602_A = 1; //开背光
Lcd_Show_Data(1,1," Dumpling-Lock ",16);
Lcd_Show_Data(2,1,"input:",6);
/*重新初始化LCD1602,因为开锁会失效*/
}
else//密码错误
{
pwd_error++;//密码错误次数加1
Lcd_Show_Data(2,7,"error!",6);
Delay1000ms();
Lcd_Show_Data(2,7," ",6);
if(pwd_error>=3)
{
Beep_Open(10000);
}
Lcd_Show_Data(1,1," Dumpling-Lock ",16);
Lcd_Show_Data(2,1,"input:",6);
}
pwd_len = 0;
for(i=0;i<6;i++)
{
input_pwd[i] = 0;
}
KEY_Len_Display(pwd_len,2,7);
}
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )