找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3752|回復: 1
打印 上一主題 下一主題
收起左側(cè)

求問?控制8255完成鍵盤掃描及數(shù)碼顯示

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:149974 發(fā)表于 2016-12-1 14:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
控制8255完成鍵盤掃描及數(shù)碼顯示
鍵盤采用4×4鍵盤,每個數(shù)碼管顯示值可為0~F16個數(shù)。鍵盤編號為0~F,當按下其中一個按鍵時,將該按鍵對應的編號在一個數(shù)碼管上顯示出來,當再按下一個按鍵時,便將這個按鍵的編號在下一個數(shù)碼管上顯示出來,數(shù)碼管上可以顯示最近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()                                   //按鍵掃描函數(shù)
{
       unsignedchar cc;
       C8255_A= 0x00;                        //X1X40
       cc= C8255_C;                            //得到Y1Y4的值
       key_down= (~cc) & 0x0f;
}

void display()                             //顯示函數(shù)
{
       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();        //得到按鍵值
                     }
              }
       }
}
這是我根據(jù)程序畫的仿真圖,但是現(xiàn)象出不來,求路過的各路大神幫我看一下程序和電路圖。。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:92810 發(fā)表于 2018-3-16 22:24 | 只看該作者
我也需要這個。。!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表