/*
哈哈 好久没更新了 把这两天调好的4*4键盘程序和大家分享下
本程序是通过行扫描 列读取方式进行获取的
本程序是在F2812上实现的 通过逐行输出0 检测各列是否为0 各列应加上啦电阻
程序注释掉的部分由 通过各行输出1 检测各列是否1 此时各列最好加下拉电阻
对于延时的时间 大家可以根据MCU速度的不同调整一下
*/
/*====================================================================
名称: 4*4键盘驱动函数库
作者: Jeary SEU
日期: 2011-07-15
功能: 使用扫描法 实现4*4键盘值的读取
硬件: 考虑到 DSP F2812开发板接口有限
暂实现 4路扫描输出 4路扫描输入 检测16个键值
键盘硬件图如下:
A1 A2 A3 A4
| | | |
|1 |2 |3 |A
---------------------B1
|4 |5 |6 |B
---------------------B2
|7 |8 |9 |C
---------------------B3
|* |0 |# |D
---------------------B4
接线:B1-4 扫描输出 A1-4 扫描输入
B1->GPIOB4 B2->GPIOB5 B3->GPIOB6 B4->GPIOB7
A1->GPIOA8 A2->GPIOA9 A3->GPIOB8 A4->GPIOB9
====================================================================*/
#include "DSP28_Device.h"
//
#ifndef KeyBoard_H
#define KeyBoard_H
//控制信号命令
#define Setout1 {GpioDataRegs.GPBSET.bit.GPIOB4=1;} //B1 = 1
#define Clrout1 {GpioDataRegs.GPBCLEAR.bit.GPIOB4=1;} //B1 = 0
#define Setout2 {GpioDataRegs.GPBSET.bit.GPIOB5=1;} //B2 = 1
#define Clrout2 {GpioDataRegs.GPBCLEAR.bit.GPIOB5=1;} //B2 = 0
#define Setout3 {GpioDataRegs.GPBSET.bit.GPIOB6=1;} //B3 = 1
#define Clrout3 {GpioDataRegs.GPBCLEAR.bit.GPIOB6=1;} //B3 = 0
#define Setout4 {GpioDataRegs.GPBSET.bit.GPIOB7=1;} //B4 = 1
#define Clrout4 {GpioDataRegs.GPBCLEAR.bit.GPIOB7=1;} //B4 = 0
#define Kdelay 5000 //定义延时消抖所需的时间
//函数声明
void Init_KeyBoard(void); //键盘接口初始化
char Keyscan(void); //扫描键盘 获取按键值编码
char Keyread(void); //读取键盘 并将按键值转换为与实际对应的ASCII值
void Key_delay(int time); //键盘用延时函数
/*==============================================================================
管脚的初始化,主要定义复用管脚功能 方向等
==============================================================================*/
void Init_KeyBoard(void)
{
//4*4键盘初始化
EALLOW;
//B1-4设置为扫描输出
GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4=0; //IO功能
GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5=0; //
GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6=0; //
GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7=0; //
GpioMuxRegs.GPBDIR.bit.GPIOB4=1; //输出
GpioMuxRegs.GPBDIR.bit.GPIOB5=1;
GpioMuxRegs.GPBDIR.bit.GPIOB6=1;
GpioMuxRegs.GPBDIR.bit.GPIOB7=1;
//A1-4设置为扫描输入
GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=0; //IO功能
GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=0;
GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0;
GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0; //
GpioMuxRegs.GPADIR.bit.GPIOA8=0; //输入
GpioMuxRegs.GPADIR.bit.GPIOA9=0;
GpioMuxRegs.GPBDIR.bit.GPIOB8=0;
GpioMuxRegs.GPBDIR.bit.GPIOB9=0;
EDIS;
//置0
/*Clrout1; Clrout2; Clrout3; Clrout4;
GpioDataRegs.GPADAT.bit.GPIOA8=0;
GpioDataRegs.GPADAT.bit.GPIOA9=0;
GpioDataRegs.GPBDAT.bit.GPIOB8=0;
GpioDataRegs.GPBDAT.bit.GPIOB9=0;
*/
//置1
Setout1; Setout2; Setout3; Setout4;
GpioDataRegs.GPADAT.bit.GPIOA8=1;
GpioDataRegs.GPADAT.bit.GPIOA9=1;
GpioDataRegs.GPBDAT.bit.GPIOB8=1;
GpioDataRegs.GPBDAT.bit.GPIOB9=1;
}
/****************************************************************************
*
*名 称:char Keyscan(void)
*
*功 能:扫描键盘程序
*
*入口参数:无
*
*出口参数:扫描得到的编码 编码格式如下:
* A4 A3 A2 A1 , 低四位为 (输出行号-1)*2+1
*
****************************************************************************/
char Keyscan(void)
{
char temp1=0;
char temp2=0;
char Scan_res;
char i,j; //i 键盘扫描输出的行数 j 键盘扫描输入的列数
for(i=0;i<4;i++)
{
switch(i) //键盘扫描 逐行输出
{
case 0: //B1 = 0
//Clrout1; Clrout2; Clrout3; Clrout4;
//Setout1;
Setout1; Setout2; Setout3; Setout4;
Clrout1;
break;
case 1: //B2 = 0
//Clrout1; Clrout2; Clrout3; Clrout4;
//Setout2;
Setout1; Setout2; Setout3; Setout4;
Clrout2;
break;
case 2: //B3 = 0
//Clrout1; Clrout2; Clrout3; Clrout4;
//Setout3;
Setout1; Setout2; Setout3; Setout4;
Clrout3;
break;
case 3: //B4 = 0
//Clrout1; Clrout2; Clrout3; Clrout4;
//Setout4;
Setout1; Setout2; Setout3; Setout4;
Clrout4;
break;
default: //B1-4 = 1
//Clrout1; Clrout2; Clrout3; Clrout4;
Setout1; Setout2; Setout3; Setout4;
break;
}
Key_delay(100);
//初次读取键盘输入 逐列读取
for(j=0;j<4;j++)
{
switch(j)
{
case 0: //读取A4 这里由于没有连接实际硬件暂不读取
temp1=GpioDataRegs.GPBDAT.bit.GPIOB9;
//temp1=1; //强制产生1 即没检测到信号
temp1=(temp1<<1);
break;
case 1: //读取A3
temp1=(temp1 + GpioDataRegs.GPBDAT.bit.GPIOB8);
//temp1=temp1 + 1;//强制产生1 即没检测到信号
temp1=(temp1<<1);
break;
case 2: //读取A2
temp1=(temp1 + GpioDataRegs.GPADAT.bit.GPIOA9);
//temp1=temp1 + 1;//强制产生1 即没检测到信号
temp1=(temp1<<1);
break;
case 3: //读取A1
temp1=(temp1 + GpioDataRegs.GPADAT.bit.GPIOA8);
//temp1=temp1 + 1;//强制产生1 即没检测到信号
break;
default:
temp1=0;
break;
}
}
temp1=(temp1<<4); //将读取到得4列值移至高四位 从高到低为A4 A3 A2 A1
temp1=(temp1 & 0x00f0);
//if(temp1 != 0) //检测到按键按下则需延时消抖后重新确认
if(temp1 != 0xf0)
{
Key_delay(Kdelay);//软件延时消抖
//再次读取键盘输入 逐列读取
for(j=0;j<4;j++)
{
switch(j)
{
case 0: //读取A4 这里由于没有连接实际硬件暂不读取
temp2=GpioDataRegs.GPBDAT.bit.GPIOB9;
//temp2=1;//强制产生1 即没检测到信号
temp2=(temp2<<1);
break;
case 1: //读取A3
temp2=(temp2 + GpioDataRegs.GPBDAT.bit.GPIOB8);
//temp2=temp2 + 1;//强制产生1 即没检测到信号
temp2=(temp2<<1);
break;
case 2: //读取A2
temp2=(temp2 + GpioDataRegs.GPADAT.bit.GPIOA9);
//temp1=temp2 + 1;//强制产生1 即没检测到信号
temp2=(temp2<<1);
break;
case 3: //读取A1
temp2=(temp2 + GpioDataRegs.GPADAT.bit.GPIOA8);
//temp1=temp2 + 1;//强制产生1 即没检测到信号
break;
default:
temp2=0;
break;
}
}
temp2=(temp2<<4);//将读取到得4列值移至高四位 从高到低为A4 A3 A2 A1
temp2=(temp2 & 0x00f0);
//Clrout1; Clrout2; Clrout3; Clrout4;
Setout1; Setout2; Setout3; Setout4;
//对比两次检测的结果
//if(temp1 == temp2)
if(temp1 == temp2)
{
Scan_res=temp1+i*2+1;
//return Scan_res;
break;
}
else
{
Scan_res=0xF9;
}
}
else //未检测到按键按下则返回0
{
//Clrout1; Clrout2; Clrout3; Clrout4;
Setout1; Setout2; Setout3; Setout4;
Scan_res=0;
}
}
return Scan_res;
}
/****************************************************************************
*
*名 称:char Keyscan(void)
*
*功 能:读取键盘 并将按键值转换为与实际对应的ASCII值
*
*入口参数:无
*
*出口参数:扫描得到的按键值(ASCII字符) 无键按下返回为0
*
****************************************************************************/
char Keyread(void)
{
char Key_res;
char Key_val;
Key_res=Keyscan();
switch(Key_res)
{
//B1扫描输出 可能检测到得键值
//case 0x11: //A1
case 0xE1: //A1
Key_val='1';
break;
//case 0x21: //A2
case 0xD1: //A2
Key_val='2';
break;
//case 0x41: //A3
case 0xB1: //A3
Key_val='3';
break;
//case 0x81: //A4
case 0x71: //A4
Key_val='A';
break;
//B2扫描输出 可能检测到得键值
//case 0x13: //A1
case 0xE3: //A1
Key_val='4';
break;
//case 0x23: //A2
case 0xD3: //A2
Key_val='5';
break;
//case 0x43: //A3
case 0xB3: //A3
Key_val='6';
break;
//case 0x83: //A4
case 0x73: //A4
Key_val='B';
break;
//B3扫描输出 可能检测到得键值
//case 0x15: //A1
case 0xE5: //A1
Key_val='7';
break;
//case 0x25: //A2
case 0xD5: //A2
Key_val='8';
break;
//case 0x45: //A3
case 0xB5: //A3
Key_val='9';
break;
//case 0x85: //A4
case 0x75: //A4
Key_val='C';
break;
//B4扫描输出 可能检测到得键值
//case 0x17: //A1
case 0xE7: //A1
Key_val='*';
break;
//case 0x27: //A2
case 0xD7: //A2
Key_val='0';
break;
//case 0x47: //A3
case 0xB7: //A3
Key_val='#';
break;
//case 0x87: //A4
case 0x77: //A4
Key_val='D';
break;
//
case 0xF9: //出错标志
Key_val='e';
break;
default:
Key_val='n'; //未检测到按键值标志
break;
}
//Key_val=Key_res;
return Key_val; //返回
}
/****************************************************************************
*
*名 称:Key_delay(int time)
*
*功 能:扫描键盘用延时程序
*
*入口参数:time 延迟时间
*
*出口参数:无
*
****************************************************************************/
void Key_delay(int time)
{
int i;
for(i=0;i<time;i++);
}
#endif
//==============================================================================
// End of file.
//==============================================================================
评论