研究生
最后登录1970-1-1
在线时间 小时
注册时间2019-5-23
|
楼主 |
发表于 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
|
|