野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12438|回复: 6

矩形键盘输入一串数字

[复制链接]
发表于 2019-7-29 14:33:52 | 显示全部楼层 |阅读模式
有没有人弄过用4x4键盘做过0到999数字输入的吗,比如第一次输入1,第二次输入2,第三次输入3,用数组分别存放起来,最后经过运算输出123,我今天早上试了试我的有时候可以,很多时候乱码,我不知道这是什么原因导致的,我现在写的这个根本没有办法使用,不知道该怎么解决
回复

使用道具 举报

发表于 2019-7-29 20:51:34 | 显示全部楼层
帮顶
回复

使用道具 举报

 楼主| 发表于 2019-7-29 23:59:30 | 显示全部楼层
这是程序,改来改去还是一样,有时候对有时候乱码
#include "lcd12864.h"
#include "stm32f10x.h"
#include "fonts.h"
#include "key.h"
#include "Systick.h"
#include "bsp_usart.h"
#include  <stdio.h>
#include  <string.h>

extern  int   testCNT;       //多个按键组成的数字  0到999
extern  char  dispBuff[20];

extern  int   test;          //单个按键数字  0到9  
extern  char  disp[20];

uint8_t  shuru=0,queding=0,tuichu=0;          //功能切换  输入  确认   退出输入
uint8_t  Key_Number=0,column=0,shuchu=0,suoding=0, ESC=0;
uint8_t  ge=0,shi=0,bai=0;    //个十百
uint8_t  weishu;

uint8_t  number[3]={0,0,0};  //用来存放的数据的数组  number[0]第一个按下的数字,number[1]第二个按下的数字,number[2]第三按键按下的数字


//行做输出低电平,列读取电平
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;
    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(15);
                Array_assignment();
          column=0;           //列标记清零
  }

       
if(column==2)                  //如果第二列读到低电平
{
   KEY_R_Init();
         SysTick_Delay_ms(15);
         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);
         Array_assignment();
         column=0;        //列标记清零
}


if(column==3)                   //如果第三列读到低电平
{
   KEY_R_Init();
         SysTick_Delay_ms(15);
         H_KEY_L2;                    //第三列输出高电平
         Key_Number=0;
   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);
         Array_assignment();
         column=0;            //列标记清零
}


if(column==4)                  //如果第四列读到低电平
  {
   KEY_R_Init();
         SysTick_Delay_ms(15);
         H_KEY_L3;                     //第四列输出高电平
         Key_Number=0;
   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);               
         Array_assignment();
         column=0;        //列标记清零        
        }
       
        Analog_keyboard();
}



void Array_assignment(void )   //存放每次按下的数字
{   
          KEY_R_Init();
          H_KEY_L0;
          H_KEY_L1;
          H_KEY_L2;
          H_KEY_L3;
        SysTick_Delay_ms(50);
        if(((DUQU_GPIO1&0X1E0)==0X1A0)&&((DUQU_GPIO2&0X1C00)==0X400)
                &&((DUQU_GPIO3&0X4) == 0X0))              //等待按键弹起        C11,C12,D2,B6为低电平 C10,B5,B7,B8为高电平
        {
         if(shuru==1)                               //只有输入键按下才存放数字
                {
                 if(Key_Number<=9)                         //0到9时weishu递增
                   {
                                 number[weishu]=Key_Number;         //number[0]位开始存数据  最后一个是number[2]
               weishu=weishu+1;
                     SysTick_Delay_ms(10);
                   }
          if(weishu==3)          //即3个元素012只是用123位来存数据  012  
                 {
                         weishu=0;           //清零
                 }
         }         
  }
}


//输入函数
void Input_function(void)
{
  if(Key_Number==19)                    //输入按键按下开始输入
                {
                        memset(number,0,sizeof (number));  //数组清零函数
                        shuru=1;
                        tuichu=0;
                        queding=0;
                        clear_screen();
                        display_string_5x8_1(1,1,"Please_enter");
                }
        if(shuru==1)      //显示单个数字
         {
          if(Key_Number<=10)
                 {
                  test=Key_Number;
                  sprintf(disp,"number:%d",test);                //使用c标准库把变量转化成字符串
                  display_string_5x8_1(2,1,disp);         //dispBuff为转换后的字符串
                }       
        }
}


//退出函数
void Exit_function(void)       
{
        if(Key_Number==17)    //按下退出键
                {
                 shuru=0;
                 tuichu=1;
                 queding=0;
                 clear_screen();
                }
        if(tuichu==1)
                {                               
                  display_string_5x8_1(1,1, "ESC" );         //dispBuff为转换后的字符串
                }
}
       
//输入确认函数
void Deterministic_function(void )       
{
  if(Key_Number==15)   //确认按键按下
                 {
                         shuru=0;
                         tuichu=0;
                         queding=1;
                 }
                 
                if(queding==1)
                        {
                         if(weishu==1)  //输入一个数字
                                {
                                 ge=number[0];  //输入一个数字
                                 shi=0;
                                 bai =0;
                                 shuchu=(ge+shi+bai);
                                }
                        else if(weishu==2)      //输入两个数字
                          {
                                 ge=number[1];
                                 shi=number[0]*10;
                                 shuchu=(ge+shi+bai);
                          }
                        else if(weishu==0)     //输入三个数字
                          {
                                 ge=number[2];        //输入的第三位
                                 shi=number[1]*10;    //输入的第二位
                                 bai=number[0]*100;   //输入的第一位
                                 shuchu=(ge+shi+bai);
                          }
                           testCNT=shuchu;
                           sprintf(dispBuff,"number1:%d",testCNT);            //使用c标准库把变量转化成字符串
                           display_string_5x8_1(3,1,dispBuff);         //dispBuff为转换后的字符串
                         }
}


void Analog_keyboard(void)
{   
  Input_function();
  Deterministic_function();
        Exit_function();       
}       



#ifndef __KEY_H
#define __KEY_H

#define  RCC_APBxPeriphClockCmd   RCC_APB2PeriphClockCmd
#define  RCC_APB2Periph_GPIOx     (RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
               
#define KEY_L0_GPIO_PIN    GPIO_Pin_10                                                                                                                                         
#define KEY_L1_GPIO_PIN    GPIO_Pin_5                                                                                                                                         
#define KEY_L2_GPIO_PIN    GPIO_Pin_7                                                                                                                                         
#define KEY_L3_GPIO_PIN    GPIO_Pin_8
#define KEY_L0_PORN        GPIOC
#define KEY_L1_PORN        GPIOB  
#define KEY_L2_PORN        GPIOB  
#define KEY_L3_PORN        GPIOB  

#define KEY_R0_PIN         GPIO_Pin_11
#define KEY_R1_PIN         GPIO_Pin_12
#define KEY_R2_PIN         GPIO_Pin_2
#define KEY_R3_PIN         GPIO_Pin_6
#define KEY_R0_PORN        GPIOC
#define KEY_R1_PORN        GPIOC
#define KEY_R2_PORN        GPIOD
#define KEY_R3_PORN        GPIOB


#define  DUQU_GPIO1             GPIO_ReadInputData(GPIOB)
#define  DUQU_GPIO2             GPIO_ReadInputData(GPIOC)
#define  DUQU_GPIO3             GPIO_ReadInputData(GPIOD)


#define KEY_L0   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)
#define KEY_L1   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define KEY_L2   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
#define KEY_L3   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)



#define KEY_R0   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)
#define KEY_R1   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)
#define KEY_R2   GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2)
#define KEY_R3   GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)     

#define H_KEY_L0    GPIO_SetBits(GPIOC,GPIO_Pin_10)
#define H_KEY_L1    GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define H_KEY_L2    GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define H_KEY_L3    GPIO_SetBits(GPIOB,GPIO_Pin_8)

#define L_KEY_L0    GPIO_ResetBits(GPIOC,GPIO_Pin_10)
#define L_KEY_L1    GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define L_KEY_L2    GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define L_KEY_L3    GPIO_ResetBits(GPIOB,GPIO_Pin_8)



#define H_KEY_R0    GPIO_SetBits(GPIOC,GPIO_Pin_11)
#define H_KEY_R1    GPIO_SetBits(GPIOC,GPIO_Pin_12)
#define H_KEY_R2    GPIO_SetBits(GPIOD,GPIO_Pin_2)
#define H_KEY_R3    GPIO_SetBits(GPIOB,GPIO_Pin_6)

#define L_KEY_R0    GPIO_ResetBits(GPIOC,GPIO_Pin_11)
#define L_KEY_R1    GPIO_ResetBits(GPIOC,GPIO_Pin_12)
#define L_KEY_R2    GPIO_ResetBits(GPIOD,GPIO_Pin_2)
#define L_KEY_R3    GPIO_ResetBits(GPIOB,GPIO_Pin_6)


void Array_assignment(void );
void Input_function(void);
void Exit_function(void);
void Deterministic_function(void );

void Analog_keyboard(void);
void Keyboard_Scanning (void);
#endif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-30 23:03:42 | 显示全部楼层
为什么我把数据改成了16位的了,还是只能随机输入输出到299,后面的输入进去之后出来的是乱码的
回复 支持 反对

使用道具 举报

发表于 2019-7-31 00:19:37 | 显示全部楼层
加我给你解答吧,这个不难,前几天刚给群里的朋友说过
回复 支持 反对

使用道具 举报

发表于 2019-7-31 00:20:11 | 显示全部楼层
留你Q,我加你吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 11:03:43 | 显示全部楼层
Angle145 发表于 2019-7-31 00:20
留你Q,我加你吧

2587155696
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 03:46 , Processed in 0.032234 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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