你的位置: 首页 > 家电弱电 > 单片机

8051单片机串行口扩展矩阵键盘接口与应用

2016-11-10 10:14:22 | 人围观 | 评论:

 由于8051的串行口在方式0工作状态下,可以方便地通过移位寄存器74LS164扩展并行输出口。因此,可以将这些并行口线作为列线,与P3口的行线构成行列式键盘。每占用一条P3口线可增加8个按键,用户根据需要可增减。
     在8051的串行口方式0工作状态下,结合P3.4和P3.5实现2*8键盘。如图所示。

 C51软件设计:
     #include<stdio.h> //预处理
     #include<reg51.h>
     #include<intrins.h>
     unsigned char getkey(void); //键盘扫描函数
     void proc1(void); //定义按键处理程序1
    void proc2(void); //定义按键处理程序2
    void proc3(void); //定义按键处理程序3
    void proc4(void); //定义按键处理程序4
    ……
    bit0=P3.4;
    bit1=P3.5;
    void delay(void); //定义延时函数
    void main(void) //主函数
    {
    unsigned char idata key;
    SCON=0x00; //串口初始化
    ES=0;
    EA=0; //关闭中断
    while(1)
    {
    key=getkey();
    if(key!=0xff)
    switch (key)
    {
    case 0x00:
    proc0();
    braek;
    case 0x01:
    proc1();
    braek;
    case 0x02:
    proc2();
    braek;
    case 0x03:
    proc3();
    braek;
    ……
    ……
    ……
    default:
    break;
    }
    }
    }
    unsigned char getkey(void) //键盘扫描函数
    {
    unsigned char idata key_code,col=0; mask=0x00;
    TI=0;
    SBUF=mask;
    while(TI==0);
    if((bit0&bit1)!= 0)
    return(0xff);
    delay();
    if((bit0&bit1)!= 0)
    return(0xff);
    mask=0xfe;
    while(col!=8)
    {
    TI=0;
    SBUF=mask;
    while(TI==0);
    if((bit0&bit1)!= 0)
    {
    mask=mask<<1;
    mask=mask|0x01;
    col=col+1;
    continue;
    }
    else break;
    }
    if(col==8)
    return(0xff);
    if(bit0==1) key_code=col;
    else key_code=8+col;
    while(bit0&bit1==0);
    return(key_code);
    }
    void delay(void) /*延时10毫秒*/
    {
    unsigned int i=10;
    while(i--);
    }




标签: