這是我上個月做的 陣列鍵盤輸入和LED動態顯示實驗
G`5DGPLWEE}UP1SLS4PMHX0.png (7.65 KB, 下載次數: 46)
下載附件
2019-6-22 22:10 上傳
里面有原理圖和代碼。- #include <reg51.h>
- #include <absacc.h> //定義絕對地址訪問
- #define uchar unsigned char
- #define uint unsigned int
- void delay(uint); //聲明延時函數
- void display(void); //聲明顯示函數
- uchar checkkey();
- uchar keyscan(void);
- uchar disbuffer[8]={0,1,2,3,4,5,6,7}; //定義顯示緩沖區
- void main(void)
- {
- uchar key;
- XBYTE[0x7f03]=0x81; //8255A初始化,輸入引腳被自動拉為高。
- while(1)
- {
- key=keyscan();
- if( key!=0xff)
- {disbuffer[0]=disbuffer[1];
- disbuffer[1]=disbuffer[2];
- disbuffer[2]=disbuffer[3];
- disbuffer[3]=disbuffer[4];
- disbuffer[4]=disbuffer[5];
- disbuffer[5]=disbuffer[6];
- disbuffer[6]=disbuffer[7];
- disbuffer[7]=key;
- }
- display(); //設顯示函數
- }
- }
- //************延時函數************
- void delay(uint i) //延時函數
- {uint j;
- for (j=0;j<i;j++){}
- }
- //***********顯示函數
- void display(void) //定義顯示函數
- {uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的字段碼表
- uchar chocode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位選碼表
- uchar i,p,temp;
- for (i=0;i<8;i++)
- {
- XBYTE[0x7f01]=0xff;
- p=disbuffer[i]; //取當前顯示的字符
- temp=codevalue[p]; //查得顯示字符的字段碼
- XBYTE[0x7f00]=temp; //送出字段碼
- temp=chocode[i]; //取當前的位選碼
- XBYTE[0x7f01]=temp; //送出位選碼
- delay(20); //延時1ms
- }
- }
- //************檢測有無鍵按下函數************
- uchar checkkey() //檢測有無鍵按下函數,有返回0,無返回0xff
- {
- uchar i;
- XBYTE[0x7f00]=0x00;
- i=XBYTE[0x7f02];
- i=i&0x0f;
- if (i==0x0f) return(0xff);
- else return(0);
- }
- //************鍵盤掃描函數************
- uchar keyscan() //鍵盤掃描函數,如果有鍵按下,則返回該鍵的編碼,如果無鍵按下,則返回0xff
- {uchar scancode; //定義列掃描碼變量
- uchar codevalue; //定義返回的編碼變量
- uchar m; //定義行首編碼變量
- uchar k; //定義行檢測碼
- uchar i,j;
- if (checkkey()==0xff) return(0xff); //檢測有無鍵按下,無返回0xff
- else
- {
- delay(20); //延時
- if(checkkey()==0xff) return(0xff); //檢測有無鍵按下,無返回0xff
- else
- {
- scancode=0xfe; //列掃描碼,行首碼賦初值
- for (i=0;i<8;i++)
- {
- k=0x01;
- XBYTE[0x7f00]=scancode; //送列掃描碼
- m=0x00;
- for (j=0;j<2;j++)
- {
- if ((XBYTE[0x7f02]&k)==0) //檢測當前行是否有鍵按下
- {
- codevalue=m+i; //按下,求編碼
- while (checkkey()!=0xff); //等待鍵位釋放
- }
- else
- {k=k<<1;m=m+8;} //行檢測碼左移一位,計算下一行的行首編碼
- }
- scancode=scancode<<1; //列掃描碼左移一位,掃描下一列
- }
- }
- return(codevalue); //返回編碼
- }
- }
復制代碼
全部資料51hei下載地址:
實驗五.rar
(127.13 KB, 下載次數: 17)
2019-6-22 22:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|