找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3271|回复: 1
打印 上一主题 下一主题
收起左侧

求问?控制8255完成键盘扫描及数码显示

[复制链接]
跳转到指定楼层
楼主
控制8255完成键盘扫描及数码显示
键盘采用4×4键盘,每个数码管显示值可为0~F16个数。键盘编号为0~F,当按下其中一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近6次按下的按键编号。                                    
参考程序
#include "Absacc.h"
#define C8255_A     XBYTE[0x7F00]     //8255端口地址定义
#define C8255_B     XBYTE[0x7F01]
#define C8255_C     XBYTE[0x7F02]
#define C8255_CON   XBYTE[0x7F03]
//共阴极七段码
unsigned char a[] = {0x3f, 0x06, 0x5b,0x4f, 0x66, 0x6d, 0x7d, 0x07,
                                    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79,0x71};
unsigned char b[] = {0x00, 0x00, 0x00,0x00};

unsigned char key_down;
unsigned char key_value;
unsigned char key_count;

void delay(unsigned int time)
{
       unsignedint i;
       for(i=0;i<time; i++);
}

void keyscan()                                   //按键扫描函数
{
       unsignedchar cc;
       C8255_A= 0x00;                        //X1X40
       cc= C8255_C;                            //得到Y1Y4的值
       key_down= (~cc) & 0x0f;
}

void display()                             //显示函数
{
       unsignedchar i, j = 0xF7;
       for(i=0;i<4; i++)
       {
              C8255_A= j;
              C8255_B= a[b];        //查表输出显示
              delay(0x100);
              j>>= 1;
       }
}
void clear()
{
       C8255_B= 0x00;
}

void writebuffer()
{
       b[key_count]= key_value;
       key_count--;
       if(key_count== -1)
              key_count= 3;
       display();
       clear();
       keyscan();
       while(key_down)                        //键盘消抖
       {
              display();
              clear();
              keyscan();
       }
}

void getkey()                              //得到按键值
{
       unsignedchar value;
       unsignedchar i, j = 0xFE;

       for(i=0;i<4; i++)
       {
              C8255_A= j;
              value= C8255_C;

              if(!(value& 0x01))
              {
                     key_value= i + 0;
                     writebuffer();
                     return;
              }

              if(!(value& 0x02))
              {
                     key_value= i + 4;
                     writebuffer();
                     return;
              }

              if(!(value& 0x04))
              {
                     key_value= i + 8;
                     writebuffer();
                     return;
              }

              if(!(value& 0x08))
              {
                     key_value= i + 12;
                     writebuffer();
                     return;
              }

              j<<= 1;
       }
}

void main()
{
       C8255_CON= 0x81;                   //8255初始化

       key_count= 3;

       while(1)
       {
              display();                      //显示
              clear();                         //清屏
              keyscan();                            //按键扫描
              if(key_down)                //判是否有键按下
              {
                     display();
                     delay(0x100);
                     clear();
                     keyscan();
                     if(key_down)
                     {
                            getkey();        //得到按键值
                     }
              }
       }
}
这是我根据程序画的仿真图,但是现象出不来,求路过的各路大神帮我看一下程序和电路图啊!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:92810 发表于 2018-3-16 22:24 | 只看该作者
我也需要这个啊!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表