欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

 实验板首页
 安装QuartusII软件
 安装USB-Blaster驱动
 安装CH340C驱动
 安装Keil uVision软件
 运行Hello World例程
 新建Keil uVision工程
 在Flash中运行程序
 恢复CPLD中的出厂逻辑
 安装调试代理程序
 硬件架构分析
 实现LCD驱动接口
 实现数码管驱动接口
 实现4x2键盘接口
 使用ADC采集拟量
 使用EEPROM保存数据
 使用UART通信
 红外遥控信号解码
 用作USB转232/485
 相关软件与文档


实现键盘扫描接口


实验板上集成了4x2小键盘,共8个按键,如图(1)所示。键盘与LED数码管共享位选信号,进行同步扫描。

图(1)

按键状态与输出的关系如下表所示。由表可见,8个铵键可以实现任意组合。

S2S1KEYIN4KEYIN3KEYIN2KEYIN1K7K6K5K4K3K2K1K0
010000----
010001----
010010----
010011----
010100----
010101----
010110----
010111----
011000----
011001----
011010----
011011----
011100----
011101----
011110----
011111----
100000----
100001----
100010----
100011----
100100----
100101----
100110----
100111----
101000----
101001----
101010----
101011----
101100----
101101----
101110----
101111----

在EPM7128S的出厂逻辑设计中,键盘的输入数据是由CS3片选信号控制的,所以它的读取地址是0x8060。键盘共有4个输入端子,分别接于INPUT[0]-INPUT[3]。因此,采样值位于读回数据的低4位中。

图(2)

对应的按键扫描示例代码如下:

#define   DigAddr        0x8061
#define   SecAddr        0x8060
#define   KeyAddr        0x8060

// 数码管、按键扫描服务程序,在定时器中断内调用
void LEDScan(void)
{
  unsigned char RdKey;
  
  XBYTE[SecAddr] = 0x00;
  XBYTE[DigAddr] = ScanPos+1;
  XBYTE[SecAddr] = LEDSecCode[LEDBuffer[ScanPos]];
  
  RdKey = XBYTE[KeyAddr];               // 读回键盘的扫描值
  if((ScanPos&0x01) != 0)               // 判断当前的位选信号
  {
    RdKey <<= 4;                        // 读回的扫描值是高4位
    KeyValue = (KeyValue&0x0f)|RdKey;   // 更新按键扫描码
  }
  else
  {
    RdKey &= 0x0f;                      // 读回的扫描值是低4位
    KeyValue = (KeyValue&0xf0)|RdKey;   // 更新按键扫描码
  }
  
  ScanPos = (ScanPos+1)&0x01;
} 
          

由于是按固定周期对键盘的进行采样,只要采周期足够大就会自然的形成消抖效应,所以软件中不必做显式的消抖处理。

完整的范例程序,可参见:Hello World 程序




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号