硬件:74HC164驱动四个数码管,矩阵键盘。

设计要求:

第一次按按键1显示1- - -、按按键2显示2- - -,以此类推,按1~9都是这样显示。

第二次按按键(如果第一次按的是1)(第二次按的是2)显示12-- ;

第三次按按键(如果第一次是1第二次是2第三次试3)显示123-;

按键第四次(如果第一次是1第二次是2第三次是3第四次是4)显示1234。


题目链接:http://zhidao.baidu.com/question/584760327.html


做而论道用C语言编程如下:

//=======================================================

#include <AT89X51.H>

char disp_buff [4] = {0};         //显示缓冲单元.

//-------------------------------------------------------

delay(unsigned int t)             //1ms延时函数

{

    unsigned int i, j;

    for(i = 0; i < t; i++)  for(j = 0; j < 120; j++);

}

//-------------------------------------------------------

void display(void)                //显示函数

{

    char code table[] = {         //共阳段码 0 ~ 9

      0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

    char i;

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

      SBUF = table[disp_buff [i]];//输出段码

      while(!TI);

      TI = 0;

    }

}

//-------------------------------------------------------

unsigned char keyboard(void)      //扫描键盘函数

    unsigned  char i, tmp1, tmp2;

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

      P1 = ~(1 << i);       //i = 0 : P1 = 1111 1110

      tmp1 = P1 & 0xF0;

      if(tmp1 != 0xF0)  {   //有键按下

        delay(10);          //延时

        tmp2 = P1 & 0xF0;   //再读

        if(tmp1 == tmp2)  { //两次相等,即不是抖动

          if (tmp1 == 0x70) return i * 4 + 0; //键值

          if (tmp1 == 0xb0) return i * 4 + 1;

          if (tmp1 == 0xd0) return i * 4 + 2;

          if (tmp1 == 0xe0) return i * 4 + 3;

    } } }

    return 16;              //没有键按下

}

//-------------------------------------------------------

void  main(void)

{

    unsigned char  key;

    display();                    //初始显示.

    while(1)  {                   //无限循环.

      key = keyboard();           //读出一遍键盘.

      if (key < 10) {             //如果0~9

//--------------------进行按键处理.

        disp_buff [3] = disp_buff [2];

        disp_buff [2] = disp_buff [1];

        disp_buff [1] = disp_buff [0];

        disp_buff [0] = key;

        display();                //显示.

//--------------------处理结束,去等待按键释放.

        while(key < 16)  key = keyboard();//等待按键释放.

    } }                           //无限循环.

}

//=======================================================


仿真截图如下:

51 单片机使用串入并出芯片 164 以及矩阵键盘 - 非著名博主 - 电子信息角落


http://xiangce.baidu.com/picture/detail/79b1d41851d6450ee14774b848d2e519dc867a79



提问者评价:谢谢 !


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐