標題: 求問?控制8255完成鍵盤掃描及數(shù)碼顯示 [打印本頁]

作者: 安迪    時間: 2016-12-1 14:40
標題: 求問?控制8255完成鍵盤掃描及數(shù)碼顯示
控制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)象出不來,求路過的各路大神幫我看一下程序和電路圖。。。

作者: gemxie    時間: 2018-3-16 22:24
我也需要這個。。!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1