1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/rao-jiechang-Lock-STC12C5A60S2

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
key.c 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
dumpling Отправлено 20.02.2022 18:13 45a98ae
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
#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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/rao-jiechang-Lock-STC12C5A60S2.git
git@api.gitlife.ru:oschina-mirror/rao-jiechang-Lock-STC12C5A60S2.git
oschina-mirror
rao-jiechang-Lock-STC12C5A60S2
rao-jiechang-Lock-STC12C5A60S2
master