电子密码锁设计
**功能:支持3~20位的密码设置,初始密码为123456;若要重设密码,需先输入正确密码开锁。
** 正常显示情况下,按下确认键上锁;按下密码键,开始输入密码。
**接线:PE[0..3]----4*4键盘的行线,均用中断方式,上拉输入,下降沿触发
** PE[4..7]----4*4键盘的列线,下拉输入,在中断内临时改为上拉输入,用于读键值
** PD[0..7]----LCD12864 D0~D7
** PD[13..15]--LCD12864 RS,RW,E
** PA.1 连接继电器,低电平时合上,高电平时断开相当于开锁与上锁
*****************************************************************************/
#include "stm32f10x.h"
#include "LCD12864.h"
extern __IO uint16_t keyval;
extern __IO uint16_t keyflag;
uint16_t password[21]={1,2,3,4,5,6,'$'}; //初始密码为
123456
uint16_t passwordtmp[21];
#define OPEN_DOOR GPIOA->BRR = GPIO_Pin_1
#define CLOSE_DOOR GPIOA->BSRR = GPIO_Pin_1
//数组中存放各个备份数据寄存器基于BKP基地址的偏移地址,用于存储密码
uint16_t BKPDataReg[21] =
{
BKP_DR2, BKP_DR3, BKP_DR4, BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8,
BKP_DR9,
BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14,
BKP_DR15,BKP_DR16,BKP_DR17,
BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22
};
void WritePasswordToBackupReg(uint16_t
passwordarray[])
{
uint32_t index = 0;
PWR_BackupAccessCmd(ENABLE);
BKP_ClearFlag();
for (index = 0; passwordarray[index]!='$';
index++)
{ //偏移地址 和 数据
BKP_WriteBackupRegister(BKPDataReg[index],
passwordarray[index]);
}
BKP_WriteBackupRegister(BKPDataReg[index], passwordarray[index]);
//写入密码结尾符
}
void Load_Password(void)
{
uint32_t index = 0;
for(index = 0; BKP_ReadBackupRegister(BKPDataReg[index])!='$';
index++)
{
password[index]=BKP_ReadBackupRegister(BKPDataReg[index]);
}
password[index]='$';
}
void RCC_Configuration()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC|\
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE,ENABLE);//使能所有GPIO的时钟
}
//GPIO配置函数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;//定义GPIO的模式设置结构体变量
// PA1 接继电器 模拟开锁功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
CLOSE_DOOR; // 初始锁上
}
// 矩阵键盘接口配置
void KeyBoard_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 行线上拉输入
GPIO_InitStructure.GPIO_Pin = 0x000f;