单片机按键矩阵识别(含程序、原理图)

更新时间:2024-01-31 23:43:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

按键矩阵识别技术实验说明

如图2所示,把P1端口的8条I/O口分成4条列线4条行线交叉但不接触构成4×4键盘阵列,16个按键放置交叉位置,这样在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。

1.结合给出的电路原理图试分析4*4键盘矩阵识别原理,及LED动态扫描原理。(6分)

2.根据分析的键盘矩阵识别原理设计程序实现一下功能:当按下某个按键时在2个七段数码管上显示该按键的编号(注意考虑同时按下多个按键时程序处理过程)、按下某个按键使其弹起时对于消抖情况程序的处理。(9分)

IC STC89C51CY 12MHz1918XTAL1XTAL2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C1 30PC2 30PR1 1KVCCR2~9 200SEVEN_SEG9RESETC3 10μ293031PSENALEEAP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7NOT1NOT2P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.712345678P1.4P1.5P1.6K0P1.0K1P1.1K2P1.2K3P1.3K4K5K6K7K8K9K10K11K12K13K14K15P1.7

2.0相关原理图如下:

3.0实验说明

本试验给了1-8键判断方法。按1-8键中任意键,则数码管显示该键编号。 想想怎样实现1-16个键的判断显示? 参考程序见程序范例。

/******************************************************************************************

*描述: 按键距阵识别技术 *编写: 秦立春

*版本信息: V1.0 2008年4月20日

*说明: sp1,sp2,SP3跳线向右;

******************************************************************************************/

#include

#define uchar unsigned char #define uint unsigned int #define ON 0 #define OFF 1

uchar bdata OUT; sbit JDQ=OUT^0; sbit HF =OUT^1; sbit BZ =OUT^2; sbit AA =OUT^3; sbit BB =OUT^4; sbit CC =OUT^5; sbit DD =OUT^6;

sbit X0=P2^0; sbit X1=P2^1; sbit X2=P2^2; sbit X3=P2^3; sbit Y0=P2^4; sbit Y1=P2^5; sbit Y2=P2^6; sbit Y3=P2^7;

sbit RS=P1^7; sbit RW=P3^4; sbit E =P3^5;

sbit HC574_LE=P3^3;

//----------------------------------------------------- void delay(unsigned int t) // 延时函数 {

for(;t!=0;t--) ; }

//------------------------------------------------------ void HC574(void) // 74HC574控制输出; {

P0=OUT; HC574_LE=1; delay(2); HC574_LE=0; }

//================================================== unsigned char Key_Scan(void) {

uchar a, key; P2=0xf0;

if(!(Y0&&Y1&&Y2&&Y3)) {

P2=0xf0; delay(200);

if(!(Y0&&Y1&&Y2&&Y3)) {

P2=0xff; X0=0;

if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0e);goto pp1;} P2=0xff; X1=0;

if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0d);goto pp1;} P2=0xff; X2=0;

if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0b);goto pp1;} P2=0xff; X3=0;

if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x07);goto pp1;} }

else a=0xff; }

else a=0xff;

pp1: key=a; return key; }

//----------------------------------------------------------- uchar key(void) {

uchar k, KEY; KEY=0xff; k=Key_Scan(); if(k!=0xff) {

while(k==Key_Scan());

switch(k) // 键码 {

case 0x7e: KEY=0x04;break; // 4 case 0x7d: KEY=0x08;break; // 8 case 0x7b: KEY=0x0b;break; // case 0x77: KEY=0x0f;break; // case 0xbe: KEY=0x03;break; // 3 case 0xbd: KEY=0x07;break; // 7 case 0xbb: KEY=0x0a;break; // case 0xb7: KEY=0x0e;break; // case 0xde: KEY=0x02;break; // 2 case 0xdd: KEY=0x06;break; // 6 case 0xdb: KEY=0x00;break; // 0 case 0xd7: KEY=0x0d;break; // case 0xee: KEY=0x01;break; // 1 case 0xed: KEY=0x05;break; // 5 case 0xeb: KEY=0x09;break; // 9 case 0xe7: KEY=0x0c;break; //

default: KEY=0xff;break; // 无键按下 } }

return KEY; }

main() {

uchar code shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4, 0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,

0x00,0xff}; //灭 共阳极数码管显示段码 uchar i,k;

uchar display[2]={0xff,0xff}; RS=0; RW=0; E=0;

OUT=0;HC574(); delay(60000); while(1) {

k=key(); if(k<=0x0f) {

display[0]=k/10; display[1]=k; }

for(i=0;i<2;i++) {

P1=(~(0X01<

OUT=0;HC574(); delay(60000); while(1) {

k=key(); if(k<=0x0f) {

display[0]=k/10; display[1]=k; }

for(i=0;i<2;i++) {

P1=(~(0X01<

本文来源:https://www.bwwdw.com/article/r1hw.html

Top