基于stm32f407的ch451l矩阵键盘控制源码(4*4,16个按键的矩阵键盘实际应用)

ch451l.c

#include "ch451l.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
Question    My = {
	
	0,        // Q_Start;
	0,         //My.Mode
	0,
};

int key_num = 20;

void ch451_write(u16 command)
{
   u8 i;
   load_0;   
   for(i=0;i<12;i++)           //д12λÃüÁî  
   {
      if(command&0x0001) din_1;
      else               din_0;
      dclk_0;                  //¸øÆäÒ»¸öÉÏÉýÑØ
      dclk_1;
      command>>=1;
   }
   load_1;                         //¼ÓÔؽøÈ¥
}



void ch451_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10|GPIO_Pin_9;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;     // ÆÕͨÊä³öģʽ
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    //ÍÆÍìÊä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      //ÉÏÀ­
	GPIO_Init(GPIOG, &GPIO_InitStructure);     //³õʼ»¯   GPIO
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      //ÉÏÀ­
	GPIO_Init(GPIOG, &GPIO_InitStructure);
	din_0;
  din_1;  
  ch451_write(0x0201);//оƬÄÚ²¿¸´Î»
  ch451_write(0x0403);	
}


u16 ch451_read(void)
{  
   u8 i,keycode=0;
   u16 command;
	 u8 t=0;
   command=0x07;            
   load_0;                
   for(i=0;i<4;i++)
   {
      if(command&0x0001) din_1;
      else               din_0;                //¶ÁÈ¡Ç°ËÄλ°´¼ü´úÂëÃüÁî
      dclk_0;
      dclk_1;
      command>>=1;
   }
   load_1;
   for(i=0;i<7;i++)
   {
      keycode<<=1;
      if(dout) keycode|=0X01;        //´®¿Ú½ÓÊÕÊý¾Ý
      dclk_1;
      dclk_0; 
   }
   
   switch(keycode)
   {
      case 67:t=1;break;
      case 66:t=2;break;
      case 65:t=3;break;
      case 64:t=4;break;
      case 75:t=5;break;
      case 74:t=6;break;
      case 73:t=7;break;
      case 72:t=8;break;
      case 83:t=9;break;
      case 82:t=10;break;
      case 81:t=11;break;
      case 80:t=12;break;
      case 91:t=13;break;
      case 90:t=14;break;
      case 89:t=15;break;
      case 88:t=16;break;
      default:t=0;break; 
   }
    return t; 	
}

ch451l.h

#ifndef __CH451L_H
#define __CH451L_H
#include "sys.h"

typedef struct
{
	u16    Q_Start;
	u16    Mode;         //ÎÊÌâÑ¡Ôñ±ê־λ
	u16    POS_Sec;
	u8     save_flag;    //±£´æ±ê־λ
	u8     flash_start;
  u8     change_mode;    //¸Ä±ä·þÎñº¯Êý
}Question;
extern  Question  My;



#define  dclk_0  GPIO_ResetBits(GPIOG,GPIO_Pin_11)
#define  dclk_1  GPIO_SetBits(GPIOG,GPIO_Pin_11)
#define  din_0   GPIO_ResetBits(GPIOG,GPIO_Pin_10)
#define  din_1   GPIO_SetBits(GPIOG,GPIO_Pin_10)
#define  load_0  GPIO_ResetBits(GPIOG,GPIO_Pin_9)
#define  load_1  GPIO_SetBits(GPIOG,GPIO_Pin_9)
#define  dout    GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_12)

void  ch451_write(u16 command);
void  ch451_init(void);
u16   ch451_read(void);
u8 get_val(u8 a);
u16 get_value(u8 mode);
void CH451_Get_val(void);



#endif



主函数中的具体调用:

    ch451_init();//初始化

 while(1){

    key=ch451_read();//读取键值

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您可以参考以下步骤: 1. 首先,在stm32f407zet6的官方库中,需要打开GPIO外设和USART外设的时钟,可以使用如下代码: ``` RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); // 打开GPIOx外设时钟 RCC_APBxPeriphClockCmd(RCC_APBxPeriph_USARTx, ENABLE); // 打开USARTx外设时钟 ``` 2. 然后,需要配置4x4矩阵键盘的GPIO口,可以使用如下代码: ``` GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; // 配置对应的GPIO引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 配置为输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // GPIO速率为100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上下拉电阻 GPIO_Init(GPIOx, &GPIO_InitStructure); // 初始化GPIO ``` 3. 接下来,需要对USART外设进行配置,包括波特率、数据位、停止位、校验位等参数的设置,可以使用如下代码: ``` USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; // 波特率为9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位为8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位为1位 USART_InitStructure.USART_Parity = USART_Parity_No; // 不使用校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用硬件流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 启用接收和发送模式 USART_Init(USARTx, &USART_InitStructure); // 初始化USART USART_Cmd(USARTx, ENABLE); // 使能USART ``` 4. 在主函数中,可以使用如下代码实现增删改查密码功能: ``` char password[4] = {'1', '2', '3', '4'}; // 初始密码为1234 char input[4]; // 存储用户输入的密码 int index = 0; // 当前输入密码的下标 while (1) { // 检测矩阵键盘按键是否被按下 for (int i = 0; i < 4; i++) { GPIO_ResetBits(GPIOx_row, GPIO_Pin_x); // 逐行扫描 if (GPIO_ReadInputDataBit(GPIOx_col, GPIO_Pin_x) == RESET) { // 判断当前列是否有按键按下 input[index] = '1' + i * 4 + j; // 记录当前按键值 index++; // 下标加1 while (GPIO_ReadInputDataBit(GPIOx_col, GPIO_Pin_x) == RESET); // 等待按键释放 GPIO_SetBits(GPIOx_row, GPIO_Pin_x); // 恢复输出高电平 delay_ms(100); // 延时一段时间,避免重复输入 } GPIO_SetBits(GPIOx_row, GPIO_Pin_x); // 恢复输出高电平 } // 判断是否输入完整个密码 if (index >= 4) { // 判断输入的密码是否正确 if (strcmp(input, password) == 0) { // 如果密码正确 USART_SendData(USARTx, 0x01); // 发送开锁信号 while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); // 等待发送完成 } else { // 如果密码错误 USART_SendData(USARTx, 0x02); // 发送错误提示信息 while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); // 等待发送完成 } index = 0; // 重置下标 memset(input, 0, sizeof(input)); // 清空输入缓冲区 } } ``` 以上就是基于官方库实现4x4矩阵键盘增删改查密码串口通信的方法,您可以根据实际需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电赛张小七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值