51单片机(AT89C52)矩阵键盘检测程序
2012-07-22 12:32
429 查看
矩阵键盘检测思路:行线设为输出、列线设为输入获得列码,行线设为输入、列线设为输出获得行码,由行列码确定键值。
本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。
本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P3^0; sbit wela=P3^1; #define keyport (P1) #define keystate0 0 //按键确认状态 #define keystate1 1 //按键无动作状态 char keystate=1; //按键状态初始化为按键无动作状态 uchar keynum=0; void delayms(uint x) //1ms { uint y,z; for(y=x;y>0;y--) for(z=111;z>0;z--); } uchar code table[]={ //共阳数码管 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; void smg() { dula=0; wela=0; P2=0x01; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x02; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x04; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x08; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x10; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x20; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x40; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); P2=0x80; wela=1; wela=0; P2=table[keynum]; dula=1; dula=0; delayms(1); } void keyscan() { uchar temp1,temp2,column,row; switch(keystate) { case keystate0: //keystate0,按键按下确认状态,下一状态为keystate1(按键无动作状态) keyport=0x0f; temp1=keyport; keyport=0xf0; temp2=keyport; if((temp1|temp2)!=0xff) { temp1|=temp2; if(!(temp1&0x80)) row=3; else if(!(temp1&0x40)) row=2; else if(!(temp1&0x20)) row=1; else if(!(temp1&0x10)) row=0; if(!(temp1&0x08)) column=3; else if(!(temp1&0x04)) column=2; else if(!(temp1&0x02)) column=1; else if(!(temp1&0x01)) column=0; keynum=column*4+row; while(!(keyport==0x0f|keyport==0xf0)); keystate=keystate1; break; } else keystate=keystate1; break; case keystate1: //keystate1,按键无动作状态,下一状态为keystate0(按键无动作状态) keyport=0x0f; temp1=keyport; keyport=0xf0; temp2=keyport; if((temp1|temp2)!=0xff) { keystate=keystate0; } else keystate=keystate1; break; } } void main() { while(1) { keyscan(); smg(); } }
相关文章推荐
- 51单片机矩阵扫描键盘程序(源代码)
- 51单片机(AT89C52)DS1302时钟芯片程序
- PIC单片机(PIC16F877A)基于状态机思想的矩阵键盘检测
- 51单片机STC89C52 矩阵键盘数码管显示
- 树莓派的矩阵键盘扫描程序,python开发
- 51单片机状态机键盘检测
- 关于独立按键与矩阵按键的程序(51单片机)
- 51 线反转法 实现矩阵键盘检测 [李园7舍_404]
- 矩阵键盘扫描程序实例
- 51单片机扫描键盘程序
- 基于黑金开发板的键盘边沿检测程序
- 51单片机模拟PS2协议制作5X5矩阵工业键盘
- linux下4x4矩阵 键盘驱动,用了定时器控制扫描程序来抗抖。
- Robert边缘检测算子的程序。换做其他算子,只要该其中的一个矩阵就行了
- VHDL实现矩阵键盘检测
- 按键及矩阵键盘程序------/* 自己实验确认并总结 */
- 4X4矩阵键盘扫描程序
- 51单片机(AT89C52)串口收发程序
- AVR单片机(ATMEGA16)矩阵键盘扫描程序
- 自定义4*4矩阵键盘在Qt4程序中的使用方法