×
单片机 > 单片机程序设计 > 详情

单片机实验——4X4矩阵键盘识别技术

发布时间:2020-06-18 发布时间:
|

用AT89S51 的并行口P1 接4×4 矩阵键盘,以P3.0-P3.3
作输入线,以P3.4-P3.7 作输出线;在数码管上显示数字按键的“0-9”序号,其它按键显示0。

 

原理分析:4X4矩阵键盘每个按键都有它的行值和列值,当每个按键的行值为低电平,列值为高电平时,按键为未按下状态。判断是否有按钮按下时,先让这一行通低电平,再通过扫描每一列来判断是否被按下(逐列使列值通高电平),如果被按下,那么这一列的电平此时会成为低电平;如果这一列在扫描时为低电平,说明这一列有按键被按下,而行值是每次在判断列值前就确定的,这样就能知道到底是哪一个按键被按下了。

 

基本流程: 设置第一行为低电平——>扫描每一列(设置为高电平),判断是否为0——>确定是否有按键按下——>设置第二行为低电平——>扫描第二列......(如此循环到第四行,再从第一行重新开始)

 

编译环境:KEIL C51 V3
仿真软件:proteus 7.4
单片机类型:AT89C52

数码管类型:7seg-mpx1-cc (cc——共阴数码管)

键盘类型:keypad-samllcalc

 

单片机上的程序如下:

#include  

  

char code table[]={0x3f,0x06,0x5b,0x4f,0x66,  

                0x6d,0x7d,0x07,0x7f,0x6f};  

  

sbit row1=P3^4;  

sbit row2=P3^5;  

sbit row3=P3^6;  

sbit row4=P3^7;  

  

int temp;  

int key;  

  

//void delay500ms();  

void delay20ms();  

  

void main()                                                         

{  

    P1=table[0];  

  

    while(1)  

    {  

        P3=0xff;  

        row1=0;  

        temp=P3;  

  

        temp=temp&0x0f;  

  

        if(temp!=0x0f)  

        {  

            delay20ms();  

            temp=P3;  

            temp=temp&0x0f;  

            if(temp!=0x0f)  

            {  

                switch(temp)  

                {  

                    case 0x0e:  

                        key=7;  

                        break;  

                    case 0x0d:  

                        key=8;  

                        break;  

                    case 0x0b:  

                        key=9;  

                    case 0x07:  

                        key=0;    

                }  

  

                P1=table[key];  

              

            }  

        }  

  

        P3=0xff;  

        row2=0;  

  

        temp=P3;  

  

        temp=temp&0x0f;  

  

        if(temp!=0x0f)  

        {  

            delay20ms();  

            temp=P3;  

            temp=temp&0x0f;  

  

            if(temp!=0x0f)  

            {  

                switch(temp)  

                {  

                    case 0x0e:  

                        key=4;  

                        break;  

                    case 0x0d:  

                        key=5;  

                        break;  

                    case 0x0b:  

                        key=6;  

                        break;  

                    case 0x07:  

                        key=0;  

                }  

  

                P1=table[key];  

  

            }  

        }  

  

        P3=0xff;  

  

        row3=0;  

  

        temp=P3;  

        temp=temp&0x0f;  

  

        if(temp!=0x0f)  

        {  

            delay20ms();  

  

            temp=P3;  

            temp=temp&0x0f;  

  

            if(temp!=0x0f)  

            {  

                switch(temp)  

                {  

                    case 0x0e:  

                        key=1;  

                        break;  

                    case 0x0d:  

                        key=2;  

                        break;  

                    case 0x0b:  

                        key=3;  

                        break;  

                    case 0x07:  

                        key=0;  

                        break;  

                }  

            }  

  

            P1=table[key];  

        }  

  

        P3=0xff;  

        row4=0;  

  

        temp=P3;  

        temp=temp&0x0f;  

  

        if(temp!=0x0f)  

        {  

            delay20ms();  

            temp=P3;  

            temp=temp&0x0f;  

  

            if(temp!=0x0f)  

            {  

                switch(temp)  

                {  

                    case 0x0e:  

                        key=0;  

                        break;  

                    case 0x0d:  

                        key=0;  

                        break;  

                    case 0x0b:  

                        key=0;  

                        break;  

                    case 0x07:  

                        key=0;  

                        break;  

                }  

            }  

  

            P1=table[key];  

        }  

  

  

    }  

  

}  

 /* 

void delay500ms() 

    int i,j,k; 

 

    for( i=0;i<10/2;i++) 

    { 

        for(j=0;j<180;j++) 

        { 

           for(k=0;k<200;k++) 

           { 

              

           } 

        } 

    } 

 

}  */  

  

void delay20ms()  

{  

    int i,j;  

  

    for(i=0;i<36;i++)  

    {  

        for(j=0;j<200;j++)  

        {  

  

        }  

    }  

}

电路图核心部分如下:


关键字:单片机  4X4矩阵键盘  识别技术

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用Atmega 16单片机驱动字符型液晶显示芯片