1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
把單片機4X4按鍵矩陣用出編碼鍵盤效果
[打印本頁]
作者:
zxwdown
時間:
2019-3-16 09:57
標題:
把單片機4X4按鍵矩陣用出編碼鍵盤效果
單片機的輸入設備都相對簡單,一般就幾個按鍵,頂多是
4X4的按鍵矩陣,即使是4X4按鍵矩陣,也只能得到16種不同的輸入選擇,比計算機的編碼鍵盤差得太遠,在有些場合,可能是有象編碼鍵盤這樣多選擇的需要的,但很顯然,不太可能為單片機配個編碼鍵盤,如何用按鍵矩陣達到編碼鍵盤的效果,在單片機開發中有很高的現實意義,本文對此進行初淺的研究。
方法是將
4X4按鍵矩陣的16個選擇分為兩類,一類為鍵值鍵,用于獲取鍵值,一類為功能鍵,用于調整按鍵獲取值。本文中將第0-12號共13個鍵作為鍵值鍵,將所有字符編為13頁,每頁13個字符,每個按鍵對應一個字符,通過不同的輸入頁選擇不同的輸入鍵,第15號鍵作為回車鍵,將14號鍵加法鍵,每按一次輸入頁加一,將13號鍵作為減法鍵,每按一次輸入頁減一。
本方法需要配合顯示設備,實時顯示當前所在輸入頁號及本輸入頁所能輸入的字符。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
askp6.JPG
(71.01 KB, 下載次數: 29)
下載附件
2019-3-16 09:54 上傳
下面是樣例單片機程序。
#include<reg51.h>
sbit kx0=P2^0;
sbit kx1=P2^1;
sbit kx2=P2^2;
sbit kx3=P2^3;
sbit ky0=P2^4;
sbit ky1=P2^5;
sbit ky2=P2^6;
sbit ky3=P2^7;
sbit rs=P3^5;
sbit rw=P3^6;
sbit E=P3^7;
char shifkey;
//==============================================================================
void delay(int ii){int i;for(i=0;i<ii;i++);}
void writeCmd(unsigned char c){E=0;rw=0;rs=0;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0; }
void writeDat(unsigned char c){E=0;rw=0;rs=1;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0;}
void Putxychar(char x,char y,char c){if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);writeDat(c);}
void Prtstr(char *cp){char i=0;while(cp[i]!=0){writeDat(cp[i]);i++;}}
//------------------------------------------------------------------------------
int KeyDown()
{char v,x,y;
x=4;y=4;
P2=0x0f;v=P2;
if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
P2=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
}
return x*4+y;
}
//---------------------------------------------------------------
NoteChar(int line)
{char i;
writeCmd(0x80+0x40);
Prtstr("Ch:");
for(i=0;i<13;i++)writeDat(line*10+i);
}
//----------------------------------------------------------------
int GetCH()
{char w,num,key;
NoteChar(shifkey);Putxychar(14,0,'P');if(shifkey<10)writeDat(shifkey+0x30);else writeDat(shifkey+0x37);
while(1)
{key=KeyDown();
if(key<16)
{key=KeyDown();while(key==KeyDown());
switch(key)
{case 0:w=shifkey*10+key;return w;
case 1:w=shifkey*10+key;return w;
case 2:w=shifkey*10+key;return w;
case 3:w=shifkey*10+key;return w;
case 4:w=shifkey*10+key;return w;
case 5:w=shifkey*10+key;return w;
case 6:w=shifkey*10+key;return w;
case 7:w=shifkey*10+key;return w;
case 8:w=shifkey*10+key;return w;
case 9:w=shifkey*10+key;return w;
case 10:w=shifkey*10+key;return w;
case 11:w=shifkey*10+key;return w;
case 12:w=shifkey*10+key;return w;
case 13:if(shifkey>0)shifkey--;Putxychar(14,0,'P');if(shifkey<10)writeDat(shifkey+0x30);else writeDat(shifkey+0x37);NoteChar(shifkey);break;
case 14:if(shifkey<12)shifkey++;Putxychar(14,0,'P');if(shifkey<10)writeDat(shifkey+0x30);else writeDat(shifkey+0x37);NoteChar(shifkey);break;
case 15:return 27;
}
}
};
return w;
}
//################################################################
void main()
{int n;shifkey=3;
writeCmd(0x38);writeCmd(0x0f);
while(1){n=GetCH();writeCmd(0x80);writeDat(n);};
}
復制代碼
0.png
(9.93 KB, 下載次數: 26)
下載附件
2019-3-16 17:36 上傳
全部資料51hei下載地址:
askp6.zip
(113.21 KB, 下載次數: 23)
2019-3-16 09:54 上傳
點擊文件名下載附件
proteus設計及程序
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1