按键控制移位显示

来源:互联网 发布:linux怎么写shell脚本 编辑:程序博客网 时间:2024/05/22 17:43

应邀写个“按键移位”的程序。
要求使用4×4矩阵键盘,数码显示器。键盘接在P1,数码显示器接在P0、P2口。

电路、以及运行后的显示效果如下:按键控制移位显示 - 非著名博主 - 电子信息角落
插图链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/0827e94dde7e2ba3d62afcca.html#

插图链接:http://xiangce.baidu.com/picture/detail/f13851b8e95c7608774aa47fc8a754749636421f

C语言的控制程序如下:
//=======================================================
#include <AT89X51.H>
char disp_buff [] ={0, 0, 0, 0, 0, 0, 0, 0};//显示缓冲单元
//-------------------------------------------------------
delay1ms(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[] = {         //共阴数码管的段码
      0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
      0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
    char code wei[] = {128, 64, 32, 16, 8, 4, 2, 1};//位选代码
    char i;
    for (i = 0; i < 8; i++) {
      P2 = 0;                     //先消隐
      P0 = ~table[disp_buff [i]]; //取反,用于共阳数码管
      P2 = wei[i];
      delay1ms(2);
    }
}
//-------------------------------------------------------
unsigned char keyboard(void)      //扫描键盘函数
{
    char i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
    for(j = 0; j < 4; j++) {      //循环扫描四行
      P1 = Buffer[j];             //在高四位分别输出一个低电平
      temp = 0x01;                //计划先判断第0位
      for(i = 0; i < 4; i++) {    //循环扫描四列
        if(!(P1 & temp))          //从低四位,截取1位
          return (i + j * 4);     //如果为0就返回按键值
        temp <<= 1;               //判断的位,左移一位
    } }
    return 16;                //判断结束,没有键按下,返回16
}   //呵呵,实质性的语句不过8行,就是这么简练!
//-------------------------------------------------------
void  main(void)
{
    unsigned char i, key;
    while(1)  {                   //无限循环
      display();                  //显示一遍
      key = keyboard();           //读出一遍键盘
      if (key < 16) {             //如果有人按键
//--------------------进行按键处理
   
        disp_buff [7] = disp_buff [6];
        disp_buff [6] = disp_buff [5];
        disp_buff [5] = disp_buff [4];
        disp_buff [4] = disp_buff [3];
        disp_buff [3] = disp_buff [2];
        disp_buff [2] = disp_buff [1];
        disp_buff [1] = disp_buff [0];
        disp_buff [0] = key;

//--------------------处理结束,去等待按键释放
        for (i = 0; i < 20; i++)  display();//稍稍延时
        while(key < 16) {         //等待按键释放
          key = keyboard();       //再读
          display();              //别忘了显示
    } } }                         //无限循环
}
//=======================================================
题目来自《百度知道》,利用QQ进行的交流,最终,求知者得到了满意的结果。

0 0