C51键盘接口技术

1. 实验仪器

计算机、keil c51软件、单片机开发板、下载线

2.实验项目

利用开发板的4×4键盘和数码管显示器,识别键盘按键,将键值在数码管上显示。

键盘接口电路如图所示。

 

设计c源码:

#include<reg51.h>

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char KeyValue;                //存放键值

unsigned char KeyState;                //记录键盘有无键按下

unsigned char DisplayData[8];         //显示缓冲数组

void Delay10ms();  

void KeyDown();     

void DigDisplay(); //动态显示函数

void main(void)

{

    KeyState=0;

    while(1)

    {

       KeyDown();

        if(KeyState==1)

       {

           DisplayData[7]=DisplayData[6];

           DisplayData[6]=DisplayData[5];

           DisplayData[5]=DisplayData[4];

           DisplayData[4]=DisplayData[3];

           DisplayData[3]=DisplayData[2];

           DisplayData[2]=DisplayData[1];

           DisplayData[1]=DisplayData[0];

           DisplayData[0]=DIG_CODE[KeyValue];       

           KeyState=0;

       }

       DigDisplay();

    }            

}

void DigDisplay()

{

    unsigned char m,i;

    unsigned int j;

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

    {

       switch(i)            //由低到高位依次选通

       {

           case(0):LSA=0;LSB=0;LSC=0; break;

           case(1):LSA=1;LSB=0;LSC=0; break;

           case(2):LSA=0;LSB=1;LSC=0; break;

           case(3):LSA=1;LSB=1;LSC=0; break;

           case(4):LSA=0;LSB=0;LSC=1; break;

           case(5):LSA=1;LSB=0;LSC=1; break;

           case(6):LSA=0;LSB=1;LSC=1; break;

           case(7):LSA=1;LSB=1;LSC=1; break; 

       }

        m= DisplayData[i];             //从显示缓冲数组依次读取显示数

GPIO_DIG= DIG_CODE[m];         //发送段码

        j=10;                  

while(j--); 

        GPIO_DIG=0x00;                 //消隐

    }

}

void KeyDown(void)                     //键盘扫描函数

{

unsigned int a=0;                    

     GPIO_KEY=0x0f;                    //低位列线送1(高电平)

     if(GPIO_KEY!=0x0f)                //检测有无键按下

    {

       Delay10ms();                    //有键按下,延时消抖

       if(GPIO_KEY!=0x0f)              //消抖后,再检测键盘

       {

           KeyState=1;                 //置有按键按下状态

           GPIO_KEY=0X0F;              //行线置零,测试列

           Delay10ms();

           switch(GPIO_KEY)             //读取列线,判哪一列有键按下

           {

              case(0X07):KeyValue=0;break;       //键值变量列号

              case(0X0b):KeyValue=1;break;

              case(0X0d):KeyValue=2;break;

              case(0X0e):KeyValue=3;break;

              default:   KeyValue=17;  //17是把数码管全灭掉。

           }

           GPIO_KEY=0XF0;              //列线置零,检测行

           Delay10ms();

           switch(GPIO_KEY)         //读取行线,判哪一行有键按下

           {

              case(0X70):KeyValue=KeyValue;break;//行首键值加列号

              case(0Xb0):KeyValue=KeyValue+4;break;

              case(0Xd0):KeyValue=KeyValue+8;break;

              case(0Xe0):KeyValue=KeyValue+12;break;

              default:KeyValue=17;

           }

           while((a<500)&&(GPIO_KEY!=0xf0))   //延时等待键释放

           {

              Delay10ms();

              a++;

           }

           a=0;

       }

    }

}

void Delay10ms(void)   //延时函数

{

    unsigned char a,b,c;

    for(c=1;c>0;c--)

        for(b=38;b>0;b--)

            for(a=130;a>0;a--);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值