找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1631|回复: 5
收起左侧

STM32矩阵键盘数码显示仿真实现

[复制链接]
ID:908727 发表于 2022-6-4 16:31 | 显示全部楼层 |阅读模式
  1. 功能描述:按下对应按键时,则数码显示对应按键值。
复制代码
  1. key.c
  2. #include  "key.h"
  3. static u8 key_up=1;//2»Ö§3Öᬰ′
  4. int key=0;
  5. void delayms(unsigned int n)
  6. {
  7.         unsigned int i,j;
  8.         for(i=0;i<n;i++)
  9.         {
  10.                 for(j=0;j<123;j++);
  11.         }
  12. }
  13. void KEY_Init()
  14. {
  15.         GPIO_InitTypeDef  GPIO_InitStructer;
  16.        
  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  18.        
  19.         GPIO_InitStructer.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  20.         GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
  21.         GPIO_Init(GPIOB, &GPIO_InitStructer);
  22.   
  23.         GPIO_InitStructer.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  24.         GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
  25.         GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
  26.         GPIO_Init(GPIOB, &GPIO_InitStructer);
  27. }

  28. u8 keyscan(void)
  29. {
  30.         u16 temp,num;
  31.   GPIO_Write(GPIOB,0xf0);
  32.         while(1)
  33.         {
  34.                 if(P5==1&& P6==1 && P7==1&& P8==1)
  35.          {
  36.                 key=240;
  37.                 key_up=1;
  38.          }
  39.                 else if(key_up==1&&(P5==0||P6==0||P7==0||P8==0))
  40.    {
  41. //                GPIO_ResetBits(GPIOB, GPIO_Pin_0);
  42. //          GPIO_SetBits(GPIOB, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  43.                 GPIO_Write(GPIOB,0xfe);
  44.                 temp=GPIO_ReadInputData(GPIOB);
  45.                 temp&=0xf0;
  46.          if(temp!=0xf0)
  47.          {
  48.                 delayms(2);
  49.                 temp=GPIO_ReadInputData(GPIOB);
  50.                 temp&=0xf0;
  51.                 switch(temp)
  52.                 {
  53.                         case 0xe0:num=0x00;break;
  54.                         case 0xd0:num=0x01;break;
  55.                         case 0xb0:num=0x02;break;
  56.                         case 0x70:num=0x03;break;
  57.                         default:break;
  58.                 }
  59.          }
  60.   
  61. //        GPIO_ResetBits(GPIOB, GPIO_Pin_1);
  62. //        GPIO_SetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
  63.         GPIO_Write(GPIOB,0xfd);
  64.         temp=GPIO_ReadInputData(GPIOB);
  65.         temp&=0xf0;
  66.         if(temp!=0xf0)
  67.         {
  68.                 delayms(2);
  69.                 temp=GPIO_ReadInputData(GPIOB);
  70.                 temp&=0xf0;
  71.                 switch(temp)
  72.                 {
  73.                         case 0xe0:num=0x04;break;
  74.                         case 0xd0:num=0x05;break;
  75.                         case 0xb0:num=0x06;break;
  76.                         case 0x70:num=0x07;break;
  77.                         default:break;
  78.                 }
  79.         }

  80. //        GPIO_ResetBits(GPIOB, GPIO_Pin_2);
  81. //        GPIO_SetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
  82.         GPIO_Write(GPIOB,0xfb);
  83.         temp=GPIO_ReadInputData(GPIOB);
  84.         temp&=0xf0;
  85.         if(temp!=0xf0)
  86.         {
  87.                 delayms(2);
  88.                 temp=GPIO_ReadInputData(GPIOB);
  89.                 temp&=0xf0;
  90.                 switch(temp)
  91.                 {
  92.                         case 0xe0:num=0x08;break;
  93.                         case 0xd0:num=0x09;break;
  94.                         case 0xb0:num=0x0a;break;
  95.                         case 0x70:num=0x0b;break;
  96.                         default:break;
  97.                 }
  98.         }
  99.        
  100. //        GPIO_ResetBits(GPIOB, GPIO_Pin_3);
  101. //        GPIO_SetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
  102.         GPIO_Write(GPIOB,0xf7);
  103.         temp=GPIO_ReadInputData(GPIOB);
  104.         temp&=0xf0;
  105.         if(temp!=0xf0)
  106.         {
  107.                 delayms(2);
  108.                 temp=GPIO_ReadInputData(GPIOB);
  109.                 temp&=0xf0;
  110.                 switch(temp)
  111.                 {
  112.                         case 0xe0:num=0x0c;break;
  113.                         case 0xd0:num=0x0d;break;
  114.                         case 0xb0:num=0x0e;break;
  115.                         case 0x70:num=0x0f;break;
  116.                         default:break;
  117.                 }
  118.          }
  119.          return (num);
  120.   }
  121. }       
  122. }
复制代码


STM32矩阵数码显示

STM32矩阵数码显示
回复

使用道具 举报

ID:908727 发表于 2022-6-5 05:44 | 显示全部楼层
proteus仿真包忘了发了,按键无反应,求帮助: dsn目录是仿真.7z (260.64 KB, 下载次数: 103)
回复

使用道具 举报

ID:500202 发表于 2022-6-30 23:45 | 显示全部楼层
包括keil程序
回复

使用道具 举报

ID:1055598 发表于 2022-12-5 19:08 | 显示全部楼层
怎么按了没反应
回复

使用道具 举报

ID:685598 发表于 2022-12-6 11:11 | 显示全部楼层
没有注释的程序,真的是太难看懂了。
回复

使用道具 举报

ID:884711 发表于 2022-12-7 09:51 | 显示全部楼层
好就好在仿真包,果断试一把
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表