OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2651|回复: 3

STM32通过按键键盘输入一串数字

[复制链接]

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2019-4-1
在线时间
40 小时
发表于 2019-7-27 19:49:20 | 显示全部楼层 |阅读模式
请问一下有没有人做过用矩阵键盘输入一串任意的字符的啊,比如分别输入1,2,3三个数字,然后输出123这样的,不知道为什么我写的那个有时候可以,有时候出现一堆乱码,有人写过这个吗、有的话可以分享讲解一下吗,谢谢了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2019-4-1
在线时间
40 小时
 楼主| 发表于 2019-7-27 23:42:41 | 显示全部楼层
我现在已经完成4*4矩阵键盘的扫描程序。根据不同的按键可以返回0-15这些数字。我现在需要通过三次按键设置一个0-999的数值。请问主函数应该怎样编写?希望大神可以提供下相关的程序参考一下
我写的有时候可以有时候出现乱码,还是经常会这样的,根本就用不了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-28 08:56:36 | 显示全部楼层
lhm 发表于 2019-7-27 23:42
我现在已经完成4*4矩阵键盘的扫描程序。根据不同的按键可以返回0-15这些数字。我现在需要通过三次按键设置 ...

你这么问问的太大,基本没人会回复你,情况太多,谁知道啥问题
至于怎么组成3位数,123=1*10+2   =12*10+3
贴出你实现的代码吧
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2019-4-1
在线时间
40 小时
 楼主| 发表于 2019-7-28 10:14:22 | 显示全部楼层
这是我修改过的,还是不行,出来的值不对

#include "lcd12864.h"
#include "stm32f10x.h"
#include "fonts.h"
#include "key.h"
#include "Systick.h"
#include  <stdio.h>
#include  <string.h>

extern  int   testCNT;
extern  char  dispBuff[20];

extern  int   test;
extern  char  disp[20];
uint8_t  shuru=0,queding=0,tuichu=0;          //功能切换
uint8_t  Key_Number=0,column=0,shuchu=0,suoding=0;
uint8_t  ge=0,shi=0,bai=0;    //个十百
uint8_t  beilv,weishu;
uint8_t  ESC=0,ENTERN=0,F1=0,F2=0,F3=0,F4=0;
char     number[]={0,0,0,0};  //用来存放的数据的数组

//行做输出低电平,列读取电平
void KEY_L_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
       
   RCC_APBxPeriphClockCmd (RCC_APB2Periph_GPIOx,ENABLE);
        //列
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //浮空输入
   GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN;
   GPIO_Init(KEY_L0_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_L1_GPIO_PIN;
   GPIO_Init(KEY_L1_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_L2_GPIO_PIN;
   GPIO_Init(KEY_L2_PORN,&GPIO_InitStructure);  
         GPIO_InitStructure.GPIO_Pin=KEY_L3_GPIO_PIN;
   GPIO_Init(KEY_L3_PORN,&GPIO_InitStructure);
       
       
        //行
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      
         GPIO_InitStructure.GPIO_Pin=KEY_R0_PIN;
   GPIO_Init(KEY_R0_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R1_PIN;
   GPIO_Init(KEY_R1_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R2_PIN;
   GPIO_Init(KEY_R2_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R3_PIN;
   GPIO_Init(KEY_R3_PORN,&GPIO_InitStructure);
         
}


//列做输出高电平,行读取电平
void KEY_R_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

         RCC_APBxPeriphClockCmd (RCC_APB2Periph_GPIOx,ENABLE);
        //列
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN;
   GPIO_Init(KEY_L0_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_L1_GPIO_PIN;
   GPIO_Init(KEY_L1_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_L2_GPIO_PIN;
   GPIO_Init(KEY_L2_PORN,&GPIO_InitStructure);  
         GPIO_InitStructure.GPIO_Pin=KEY_L3_GPIO_PIN;
   GPIO_Init(KEY_L3_PORN,&GPIO_InitStructure);
       
        //行
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //浮空输入
         GPIO_InitStructure.GPIO_Pin=KEY_R0_PIN;
   GPIO_Init(KEY_R0_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R1_PIN;
   GPIO_Init(KEY_R1_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R2_PIN;
   GPIO_Init(KEY_R2_PORN,&GPIO_InitStructure);
         GPIO_InitStructure.GPIO_Pin=KEY_R3_PIN;
   GPIO_Init(KEY_R3_PORN,&GPIO_InitStructure);
}

void Keyboard_Scanning (void)
{
   KEY_L_Init();                //行做输出低电平,列读取电平
         L_KEY_R0;                    //各行输出低电平
         L_KEY_R1;
         L_KEY_R2;
         L_KEY_R3;
       
        if(KEY_L0==0)column=1;        //如果第一列读到低电平
        if(KEY_L1==0)column=2;        //如果第二列读到低电平
        if(KEY_L2==0)column=3;        //如果第三列读到低电平
        if(KEY_L3==0)column=4;        //如果第四列读到低电平
        SysTick_Delay_ms(10);
if(column==1)                  //如果第一列读到低电平
  {
    KEY_R_Init();                //列做输出高电平,行读取电平  
          H_KEY_L0;                    //第一列输出高电平
                Key_Number=0;
                SysTick_Delay_us(5);
    if(KEY_R0==1)Key_Number=0;
          if(KEY_R1==1)Key_Number=4;
    if(KEY_R2==1)Key_Number=8;
    if(KEY_R3==1)Key_Number=15;   //第四行  F1
                SysTick_Delay_ms(10);
  }

if(column==2)                  //如果第二列读到低电平
{
   KEY_R_Init();
         H_KEY_L1;                    //第二列输出高电平
         Key_Number=0;
         SysTick_Delay_us(5);
   if(KEY_R0==1)Key_Number=1;
         if(KEY_R1==1)Key_Number=5;
   if(KEY_R2==1)Key_Number=9;
   if(KEY_R3==1)Key_Number=16;   //F2
         SysTick_Delay_ms(10);

}

if(column==3)                   //如果第三列读到低电平
{
   KEY_R_Init();
         H_KEY_L2;                    //第三列输出高电平
         Key_Number=0;
         SysTick_Delay_us(5);
   if(KEY_R0==1)Key_Number=2;
         if(KEY_R1==1)Key_Number=6;
   if(KEY_R2==1)Key_Number=17;  //退出ESC
   if(KEY_R3==1)Key_Number=18;  //F3
         SysTick_Delay_ms(10);
}

if(column==4)                  //如果第四列读到低电平
  {
   KEY_R_Init();
         H_KEY_L3;                     //第四列输出高电平
         Key_Number=0;
         SysTick_Delay_us(5);
   if(KEY_R0==1)Key_Number=3;
         if(KEY_R1==1)Key_Number=7;
   if(KEY_R2==1)Key_Number=19;   //ENTERN 输入
   if(KEY_R3==1)Key_Number=20;   //F4
          SysTick_Delay_ms(10);
        }
     column=0;   //列标记清零
         if(shuru==1)
         {
          if(Key_Number<=10)
                 {
                  test=Key_Number;
                  sprintf(disp,"number:%d",test);                //使用c标准库把变量转化成字符串
                  display_string_5x8_1(2,1,disp);         //dispBuff为转换后的字符串
                 }       
         }
     Analog_keyboard();                  
}


void Analog_keyboard(void)
{
  SysTick_Delay_ms(10);
        if((KEY_R0==1)||(KEY_R1==1)||(KEY_R2==1)||(KEY_R3==1))   //有按键按下
        {
         if(shuru==1)                //只有输入键按下才存放数字
                {
                 if(Key_Number<=9)           //0到9时weishu递增
                   {
              weishu=weishu+1;
              number[weishu]=Key_Number;         //number[1]位开始存数据
                    SysTick_Delay_ms(10);
                   }
          if(weishu>=4)      //0123   只是用123位来存数据   
                 {
                         weishu=0;       //清零
             memset(number,0,sizeof (number));  //数组清零函数
                 }
         }
               
                if(Key_Number==19)          //输入按键按下开始输入
                {
                        memset(number,0,sizeof (number));  //数组清零函数
                        shuru=1;
                        tuichu=0;
                        queding=0;
                        ENTERN=1;
                        clear_screen();
                        display_string_5x8_1(1,1,"Please_enter");
                }
       
               
                 if(Key_Number==15)   //确认按键按下
                        {
                                 shuru=0;
                           tuichu=0;
                           queding=1;
                          if(weishu==1)
                                 {
                                        ge=number[1];  //输入一个数字
                                        shuchu=(ge+shi+bai);
                                 }
                                 
                                 if(weishu==2)      //输入两个数字
                                 {
                                         ge=number[2];
                                         shi=number[1]*10;
                                         shuchu=(ge+shi+bai);
                                 }
                                 
                                 if(weishu==3)     //输入三个数字
                                 {
                                         ge=number[3];        //输入的第三位
                                         shi=number[2]*10;    //输入的第二位
                                         bai=number[1]*100;   //输入的第一位
                                         shuchu=(ge+shi+bai);
                                 }
                                 if(queding==1)
                                 {
                            testCNT=shuchu;
                            sprintf(dispBuff,"number1:%d",testCNT);            //使用c标准库把变量转化成字符串
                            display_string_5x8_1(3,1,dispBuff);         //dispBuff为转换后的字符串
                           }
                    }       
        if(Key_Number==17)    //按下退出键
                {
                        shuru=0;
                        tuichu=1;
                        queding=0;
                        ENTERN=0;
                  memset(number,0,sizeof (number));  //数组清零函数
      clear_screen();       
      if(tuichu==1)
                        {                               
                  display_string_5x8_1(1,1, "ESC" );         //dispBuff为转换后的字符串
                        }
          }
        }               
}       
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 14:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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