键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。
/*
功能:矩阵键盘扫面,按键显示键值程序
作者:siriuszxn
*/
#include "reg51.h"
#define KEYPORT = P1
unsigned char i;
unsigned char Keynum;
unsigned char Line; //行
unsigned char Mask;
unsigned char Col; //列
unsigned char ScanCode;
unsigned char code psegs_table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F
void delay_ms(unsigned int t) //ms延时程序
{
unsigned char i;
unsigned int x;
x=t;
while(x--)
{
for(i=0;i<113;i++);
}
}
/* 键盘扫描程序 */
void keyscan()
{
while (1) //循环扫描键盘
{
P1 = 0xff; //开始
Line = 1;
Mask = 0x01;
上一篇:单片机读入4*4矩阵键盘
下一篇:51单片机之串口通讯应用实例(逻辑分析仪调试)
推荐阅读最新更新时间:2024-11-08 18:11
设计资源 培训 开发板 精华推荐
- NCP5500 500 mA LDO 稳压器的典型应用
- 使用 Analog Devices 的 LT1317IS8 的参考设计
- L78L06AB正压稳压器的电流调节器典型应用
- 使用 Semtech 的 SC4509 的参考设计
- GS7660 并联以降低输出电阻的典型应用
- STEVAL-POE006V1、3.3V/20A 有源钳位正向转换器、以太网供电 (PoE) - 符合 IEEE 802.3bt 的参考设计
- LTC4096EDD 演示板,双输入独立锂离子充电器
- LT3756EMSE-2 90% 效率、20W SEPIC LED 驱动器的典型应用电路
- LTC2328-18、18 位、1Msps、伪差分输入 ADC 的典型应用
- 驱动 2 个 LED 串的典型应用,每串 LED 串的电压高达 35V,电流为 200 mA,A8511 2 MHz、4 通道 x 150 mA WLED/RGB 驱动器的热降额,输出断开