0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32的薄膜式键盘的应用设计

CW32生态社区 来源:CW32生态社区 2023-09-07 18:22 次阅读

一、简介

1.薄膜式键盘是一种常见的输入设备,它由一层薄膜电路板和一层触摸膜组成。薄膜电路板上印有导电图案,而触摸膜则具有与之对应的按键区域。这种键盘的应用场景非常广泛,以下是几个典型的应用场景:

(1)电子产品:薄膜式键盘被广泛应用于各种电子产品中,如手机、平板电脑数码相机等。由于其结构简单、体积小巧,可以很好地满足电子产品的设计需求。

(2)工业控制:在工业自动化领域,薄膜式键盘常用于控制面板和操作界面。它们具有防尘、防水、抗腐蚀等特性,能够适应恶劣的工作环境。

(3)医疗设备:医疗设备通常需要高度卫生和易清洁的特点,薄膜式键盘因其表面光滑、易擦拭的特性而被广泛应用于医疗设备中,如手术台、心电图仪等。

二、所需物料

本实验使用到了CW32-48F大学计划开发板、5*4薄膜式键盘模块、0.96寸OLED显示屏及Keil5开发环境。开发板上留有矩阵键盘接口,可以直接将模块插上使用。

cbf9af72-4d67-11ee-a25d-92fbcf53809c.png

键盘内部连线示意图

注:键盘的9根引线从左至右分别与单片机引脚PB15、PB14、PB13、PB12、PA6、PA5、PA4、PA1、PA0相连。

三、核心代码

main.c:
#include "main.h"
#include "OLED.h"
#include "Key.h"
#include "Delay.h"
#include "BTIM.h"


#define NUM_LENGTH 6


uint8_t choose_flag=0;    //选中标识
uint8_t choose_index=0;   //数组下标
uint8_t exert_flag=0;     //执行标识


uint8_t number[NUM_LENGTH]={0};    //存储6位数字
uint8_t num_index=0;      //数组下标    
char temp='.';            //默认值'.'
         
int main()
{
  uint8_t i;
  uint8_t position=0;     //选中的数字在数组中的位置
  OLED_Init();            //OLED显示
  Key_GPIO_Init();        //5*4薄膜键盘GPIO初始化
  BTIM_Init();            //定时器初始化,控制按键扫描周期
  while(1)
  { 
    if(exert_flag==1)     //若执行标识已打开
    {
      switch(temp)
      {
        case '<':           //选中左移
          if(choose_flag==0) position=choose_index+1; //向左选中数字
          if(position!=0)                              //若已有数字输入
          {
            choose_flag=1;                            //打开选中标识        
            OLED_Clear_Row(2);                         //先清除已有标识符号‘^’
            if(--position==0) position=choose_index;  //选中左移
            OLED_ShowChar(2,position,'^');            //显示选中标识符号'^'
          }
          break;
        case '>':
          if(choose_flag==0) position=choose_index;   //向右选中数字
          if(position!=0)                              //若已有数字输入
          {
            choose_flag=1;                            //打开选中标识
            OLED_Clear_Row(2);                        //先清除已有标识符号'^'
            if(++position==choose_index+1) position=1;//选中右移
            OLED_ShowChar(2,position,'^');            //显示选中标识符号'^'
          }
          break;
        case 'E':
          choose_flag=0;                              //关闭选中标识
          OLED_Clear_Row(2);                          //清除选中标识符号'^'
          break;
        default:
          if(choose_flag==0)                           //若未打开选中标识
          {
            choose_index=num_index+1;                  
            if(num_index==0)                          
            {
              OLED_Clear_Row(1);
              for(i=0;i=18) 
    {
      cnt=0;
      temp=Key_Scan(); //每180ms执行一次按键扫描,返回值赋值给temp
      if(temp!='.')  exert_flag=1;    //打开执行标识
    }
    BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除标志位
  }
}
Key.c:
#include "Key.h"
#include "main.h"
#include "Delay.h"
#include "OLED.h"


#define  ROW_PORT CW_GPIOA      //键盘行引脚端口
#define  COL_PORT CW_GPIOB      //键盘列引脚端口


#define  ROW_NUM  4     //4行
#define  COL_NUM  4     //4列


uint16_t row_pins[ROW_NUM]={GPIO_PIN_1,GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6};     //每一行所对应的引脚


uint16_t col_pins[COL_NUM]={GPIO_PIN_15,GPIO_PIN_14,GPIO_PIN_13,GPIO_PIN_12}; //每一列所对应的引脚


char key_value[ROW_NUM][COL_NUM]={    //键值
  1,   2,  3,   '(', 
  4,   5,  6,   ')',
  7,   8,  9,   'E',
  '<', 0,  '>', 'Y'
};


void Key_GPIO_Init(void)
{
  __RCC_GPIOA_CLK_ENABLE();
  __RCC_GPIOB_CLK_ENABLE();
  
  //rows-->置行
  GPIO_InitTypeDef GPIO_InitStruct; 
  GPIO_InitStruct.IT=GPIO_IT_NONE;
  GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;      //推挽输出
  GPIO_InitStruct.Pins=row_pins[0]|row_pins[1]|row_pins[2]|row_pins[3];
  GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
  GPIO_Init(ROW_PORT, &GPIO_InitStruct);
  
  //cols-->检列
  GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLUP;   //上拉输入
  GPIO_InitStruct.Pins=col_pins[0]|col_pins[1]|col_pins[2]|col_pins[3];
  GPIO_Init(COL_PORT, &GPIO_InitStruct);
}


char Key_Scan(void)
{
  uint8_t i,j;
  char key = '.';  //默认值'.'
  
  for ( i = 0; i < ROW_NUM; i ++ )   //1-4行依次置低
  {
    GPIO_WritePin(ROW_PORT,row_pins[i],GPIO_Pin_RESET);
    for( j = 0; j < COL_NUM; j ++ )  //依次检测1~4列电平
    {
      if( GPIO_ReadPin(COL_PORT,col_pins[j])==RESET )  //如果检测到低电平,则代表有按键按下
      {
        key = key_value[i][j];    //获取键值
        break;            //跳出检列循环
      }
    }
    GPIO_WritePin(ROW_PORT,row_pins[i],GPIO_Pin_SET);  //本行恢复高电平,准备置低下一行
    if(key != '.') break; //若key不是默认值,则代表已检测到按键按下,退出置行循环,结束本次按键扫描
  }
  
  return key;  //返回键值
}






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620826
  • 工业控制
    +关注

    关注

    36

    文章

    1274

    浏览量

    85454
  • OLED显示屏
    +关注

    关注

    6

    文章

    202

    浏览量

    30321
  • CW32
    +关注

    关注

    1

    文章

    122

    浏览量

    225

原文标题:【CW32】基于CW32的薄膜式键盘的应用

文章出处:【微信号:CW32生态社区,微信公众号:CW32生态社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 5561次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 805次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    CW Programmer CW32系列芯片烧录工具配套软件

    CW Programmer CW32系列芯片的烧录工具配套软件
    发表于 09-15 07:44

    CW32电容触摸按键设计指南

    CW32 电容触摸按键设计指南向客户提供一种利用 CW32 内部资源结合软件编程实现电容触摸按键有效触摸检测的方法。本指南的内容重点在于工作原理、软件检测过程以及调试指引。利用芯源
    发表于 09-15 06:00

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 2248次阅读

    cw32和gd32的区别

    cw32和gd32的区别 CW32和GD32是两种不同的芯片系列,分别由WCH和GigaDevice公司推出,两者有很多不同之处,下面我们来详细介绍。 首先从CW32系列开始,CW32
    的头像 发表于 08-16 11:15 1117次阅读

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 443次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    基于CW32热敏电阻采集温度应用

    基于CW32热敏电阻采集温度应用
    的头像 发表于 10-25 16:45 245次阅读
    基于<b class='flag-5'>CW32</b>热敏电阻采集温度应用

    CW32 电容式触摸按键设计指南

    CW32 电容式触摸按键设计指南
    的头像 发表于 10-25 16:36 579次阅读
    <b class='flag-5'>CW32</b> 电容式触摸按键设计指南

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 411次阅读
    <b class='flag-5'>CW32</b> PWM输出功能介绍

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 521次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)介绍

    2023电赛A题国奖CW32 开源分享

    电赛A题开源分享,主控为CW32
    的头像 发表于 11-02 10:16 783次阅读
    2023电赛A题国奖<b class='flag-5'>CW32</b> 开源分享

    基于CW32的RC522刷卡模块的应用

    基于CW32的RC522刷卡模块的应用
    的头像 发表于 11-02 14:53 531次阅读
    基于<b class='flag-5'>CW32</b>的RC522刷卡模块的应用

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 335次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用