stm32f103c8t6 4乘4矩阵键盘密码锁代码
时间: 2023-09-04 20:08:20 浏览: 716
毕业设计:基于STM32单片机电子密码锁控制电路设计资料(BOM表、电路图、程序源代码).rar
5星 · 资源好评率100%
以下是一个基于STM32F103C8T6的4x4矩阵键盘密码锁的代码示例:
```c
#include "stm32f10x.h"
#define ROW1 GPIO_Pin_0
#define ROW2 GPIO_Pin_1
#define ROW3 GPIO_Pin_2
#define ROW4 GPIO_Pin_3
#define COL1 GPIO_Pin_4
#define COL2 GPIO_Pin_5
#define COL3 GPIO_Pin_6
#define COL4 GPIO_Pin_7
char keypad[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
void delay_ms(uint32_t ms)
{
uint32_t i;
for(i=0;i<ms;i++)
{
SysTick->LOAD = 72000-1;
SysTick->VAL = 0;
SysTick->CTRL = 0x5;
while((SysTick->CTRL & 0x10000) == 0);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = ROW1|ROW2|ROW3|ROW4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = COL1|COL2|COL3|COL4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
char Read_Keypad(void)
{
GPIO_SetBits(GPIOA, ROW1);
GPIO_ResetBits(GPIOA, ROW2);
GPIO_ResetBits(GPIOA, ROW3);
GPIO_ResetBits(GPIOA, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1)==0) return keypad[0][0];
if(GPIO_ReadInputDataBit(GPIOB, COL2)==0) return keypad[0][1];
if(GPIO_ReadInputDataBit(GPIOB, COL3)==0) return keypad[0][2];
if(GPIO_ReadInputDataBit(GPIOB, COL4)==0) return keypad[0][3];
GPIO_ResetBits(GPIOA, ROW1);
GPIO_SetBits(GPIOA, ROW2);
GPIO_ResetBits(GPIOA, ROW3);
GPIO_ResetBits(GPIOA, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1)==0) return keypad[1][0];
if(GPIO_ReadInputDataBit(GPIOB, COL2)==0) return keypad[1][1];
if(GPIO_ReadInputDataBit(GPIOB, COL3)==0) return keypad[1][2];
if(GPIO_ReadInputDataBit(GPIOB, COL4)==0) return keypad[1][3];
GPIO_ResetBits(GPIOA, ROW1);
GPIO_ResetBits(GPIOA, ROW2);
GPIO_SetBits(GPIOA, ROW3);
GPIO_ResetBits(GPIOA, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1)==0) return keypad[2][0];
if(GPIO_ReadInputDataBit(GPIOB, COL2)==0) return keypad[2][1];
if(GPIO_ReadInputDataBit(GPIOB, COL3)==0) return keypad[2][2];
if(GPIO_ReadInputDataBit(GPIOB, COL4)==0) return keypad[2][3];
GPIO_ResetBits(GPIOA, ROW1);
GPIO_ResetBits(GPIOA, ROW2);
GPIO_ResetBits(GPIOA, ROW3);
GPIO_SetBits(GPIOA, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1)==0) return keypad[3][0];
if(GPIO_ReadInputDataBit(GPIOB, COL2)==0) return keypad[3][1];
if(GPIO_ReadInputDataBit(GPIOB, COL3)==0) return keypad[3][2];
if(GPIO_ReadInputDataBit(GPIOB, COL4)==0) return keypad[3][3];
return 0;
}
int main(void)
{
char password[]="1234";
char input[4]={0,0,0,0};
uint8_t i=0;
GPIO_Configuration();
while(1)
{
input[i] = Read_Keypad();
if(input[i]!='\0')
{
i++;
if(i==4)
{
if(strcmp(input,password)==0)
{
//密码正确
}
else
{
//密码错误
}
i=0;
memset(input,0,sizeof(input));
delay_ms(500); //延时500ms防止连续输入
}
}
}
}
```
其中,ROW1~ROW4和COL1~COL4分别表示矩阵键盘的4行和4列,keypad定义了每个按键对应的字符,Read_Keypad函数用于读取当前按下的按键,并返回对应的字符。在主函数中,使用一个char类型的数组input来存储输入的4位密码,当输入完成时,使用strcmp函数比较实际输入的密码和预设的密码是否一致。如果一致则认为密码正确,否则认为密码错误。在每次输入完成后,需要清空input数组,并延时一段时间以防止连续输入。
阅读全文