论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-4-26 17:26:40
|
显示全部楼层
本帖最后由 likunxue 于 2016-4-26 20:07 编辑
代码每个人才都有自已的写法, 给你一个我自已用于工程上的代码,你看看能看明白不 可用于 OS多任务中调用
/********************************************************************************************
模块名称: 按键驱动代码
文件名称: key.h
版 本: V1.0
日 期: 2013年7月1日
作 者: 李坤学
C P U : STM32F103ZE 主频: 72MHz
版权所有,盗版必究。
Copyright (C), 2013-2020, 贵州惠水昶达数控有限公司
********************************************************************************************/
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
void KEY_Init(void); //IO初始化
u8 KEY_IO_OUT(void); //检测按键是否有键按下
int KEY_OUT(void); //读取键值
float OUT_KEY(u8 x,u8 y,u8 szie,u8 fs,u8 tem,u8 dts);//按键参数读取函数
#endif
/********************************************************************************************
DIY LIKUNXUE 坤学设备开发工作室
2013年7月03号
********************************************************************************************/
/********************************************************************************************
模块名称: 按键驱动代码
文件名称: key.c
版 本: V1.0
日 期: 2013年7月1日
作 者: 李坤学
C P U : STM32F103ZE 主频: 72MHz
版权所有,盗版必究。
Copyright (C), 2013-2020, 贵州惠水昶达数控有限公司
********************************************************************************************/
#include "key.h"
#include "delay.h"
#include "beep.h" //发音器驱动
#include "lcd.h" //LCD驱动
#if SYSTEM_SUPPORT_UCOS //如果使用ucos,则包括下面的头文件即可.
#include "includes.h" //ucos 使用
#include "APP_CFG.H" //工程项目文件
#endif
u8 KEY_Max=0; //输入参数总个数
u8 KEY_Dax=0; //小数输入的的字符个数
u8 KEY_DATA[10]; //按键输入字符串数组
/********************************************************************************************
函数名称: KEY_Init() 按键初始化函数
功 能: 初始化按键接口
修改日期: 2012.06.20
编 写 人: likunxue
硬件连接说明
********************************************************************************************/
void KEY_Init(void)
{
RCC->APB2ENR |= 1<<5; //使能外设PORTD时钟
GPIOD->CRL = 0x33388888; //PD0~PD4设置成输入,D5,D6,D7设置为推换输出
GPIOD->ODR |= 0x00FF; //自带上拉输入,初始化输出口为高电平
RCC->APB2ENR |= 1<<8; //使能PORTG时钟
GPIOG->CRH &= 0xfffff00f; //PG9,PG10设置成推换输出
GPIOG->CRH |= 0x00000330;
GPIOG->ODR |= 1<<10;
GPIOG->ODR |= 1<<9; //初始化全部输出高电平
}
/********************************************************************************************
函数名称: 检测按键是否有键按下
调 用: KEY_IO_OUT();
参 数: 无
反 回 值: 0x1f 无键按下,其它有键被按下了
********************************************************************************************/
u8 KEY_IO_OUT(void)
{
u16 Kel;
GPIOD->ODR |= 0x001f; //输入端口置高电平
GPIOD->BRR = 0x00e0; //全输出低位,检测键盘有无按下
GPIOG->BRR = 0x0600;
Kel = GPIOD->IDR;
return(Kel & 0x1f);
}
/********************************************************************************************
函数名:KEY 按键识别程序
调 用:KEY (ms)
参 数:按键延迟时间
返回值:键值
结 果:检查键盘的输出状态
备 注: //按键识别
********************************************************************************************/
int KEY_OUT(void)
{
const u8 s[]={0xff,1,4,7,10,0xff,2,5,8,0,0xff,3,6,9,11,0xff,12,13,14,15,20,19,18,17,16,0xff};
u8 j,k; //k =反回数据
k = KEY_IO_OUT();//断是否有键按下
if(k == 0x1f)return 0xff; //没有键被按下
else{
delay_ms(20); //消抖延迟
if(KEY_IO_OUT() != k)return 0xff; //是抖动
else{
for(j=0;j<5;j++) //列扫描
{
GPIOD->ODR |= 0x001f; //输入端口置高电平
GPIOD->BSRR = 0x00e0; //全输出高位,
GPIOG->BSRR = 0x0600;
switch(j)
{
case 0:GPIOD->BRR = 1<<5;break; //置低电平
case 1:GPIOD->BRR = 1<<6;break; //置高电平
case 2:GPIOD->BRR = 1<<7;break; //置高电平
case 3:GPIOG->BRR = 1<<9;break; //置高电平
case 4:GPIOG->BRR = 1<<10;break; //置高电平
}
k = GPIOD->IDR;//取当前列键值
k&=0x1f;
if(k==0x0f){k=j;break;}
if(k==0x17){k=j+5;break;}
if(k==0x1b){k=j+10;break;}
if(k==0x1d){k=j+15;break;}
if(k==0x1e){k=j+20;break;}
}
if(k<25)return s[k]; //反回键值
}
}
return 0xff;
}
/****************************************************************************************
函数名:按键参数读取函数
调 用:OUT_KEY(u8 *Br,u8 fs,u8 tem)
参 数:x,y 显示坐标初点
szie 字体
fs 参数类型
tem 参数个数
dts 第一个参数
返回值:输入的值
****************************************************************************************/
float OUT_KEY(u8 x,u8 y,u8 szie,u8 fs,u8 tem,u8 dts)
{
u8 FuDian,FuHao,k,i,e,f,Sm[15]; //字符串转换反回数组
switch(fs) //处理参数属性
{
case 0: {FuDian =0;FuHao=0;}break;//整数
case 1: {FuDian =1;FuHao=0;}break;//浮点数
case 2: {FuDian =0;FuHao=1;}break;//有符号整数
case 3: {FuDian =1;FuHao=1;}break;//有符号浮点数
default: return 0xffff;//直接退出
}
e = 1; //负数标志清零
f = 0; //小数点标志清零
for( i=0; i<tem+1;i++)Sm=0;
if(dts ==10)Sm[0]='-';
else{
Sm[0]=dts+0x30;
}
while(KEY_OUT() != 0xff);//等按键放开
while(1)
{
k= KEY_OUT(); //取键值
if(k != 0xff)
{
EPPK();
switch(k)
{
case 20:{ //取消输入反回出错关键值
while(KEY_OUT() != 0xff){delay_ms(5);}
return 0xffff; //反回结果并退出程序
}
case 12:{ //如果按了确定键则反回输入值
while(KEY_OUT() != 0xff){delay_ms(5);}
return CX_atof(Sm); //反回参数
}
case 11:{ //输入小数处理
if(FuDian !=0)
{
if(f==0)
{
if(e==0){Sm[0]=0x30,Sm[1] = 0x2e; e =2; f=1;}
else{
if(e < 6)
{
if((Sm[0]==0x2d)&&(e==1))
{
Sm[e++]=0x30;
Sm[e++]= 0x2e;
f=1;
}
else{f=1;Sm[e++]=0x2e;}
}
}
}
i=15;
}
}break;
case 13:{if(FuHao !=0){if(e ==0){Sm[e++]= 0x2d;}i=15;}}break;//输入负号
case 10:{//清输入参数,用于参数输入修改
if(e !=0)
{
if((Sm[e-1]==0x2e)||(Sm[e]==0x2e)) f=0;
Sm[--e] = 0;
if(e ==0){Sm[0]=0x30;f=0;}
if((e ==1)&&(Sm[0]==0x30)){e=0;f=0;}
}
else{
if((FuHao !=0)&&(e == 0)){Sm[e++]= '-'; i= 15;}
else{
Sm[0]=0x30;f =0;
}
}
i=15;
}break;
default:{
if(k<=9)
{
if(e < tem)
{
if(((e==1)&&(Sm[0]== 0x2d)) &&(k==0)){;}
else{
if((e==0)&& (k==0)){;}
else{
if(((Sm[0]==0x2d)&&(Sm[1]==0x30))&&(e==2))
{
Sm[1]= k+0x30;
e=2;
}
else{Sm[e++]= k + 0x30; }
}
}
}
i=15;
}
}
}
}
if(e!= i)
{
for(i=1; i < tem+1; i++)LCD_word(x-i*8,y," "); //清显示位置
i = CX_strlen(Sm)*8;//得到字符个数
LCD_word(x-i,y,(const char *)Sm); //显示字符
i = e; //存副本
while(KEY_OUT() != 0xff);//等按键放开
}
delay_ms(5);//延迟一段时间
}
}
/********************************************************************************************
DIY LIKUNXUE 坤学设备开发工作室
2013年7月03号
********************************************************************************************/
|
|