单片机的输入设备都相对简单,一般就几个按键,顶多是4X4的按键矩阵,即使是4X4按键矩阵,也只能得到16种不同的输入选择,比计算机的编码键盘差得太远,在有些场合,可能是有象编码键盘这样多选择的需要的,但很显然,不太可能为单片机配个编码键盘,如何用按键矩阵达到编码键盘的效果,在单片机开发中有很高的现实意义,本文对此进行初浅的研究。 方法是将4X4按键矩阵的16个选择分为两类,一类为键值键,用于获取键值,一类为功能键,用于调整按键获取值。本文中将第0-12号共13个键作为键值键,将所有字符编为13页,每页13个字符,每个按键对应一个字符,通过不同的输入页选择不同的输入键,第15号键作为回车键,将14号键加法键,每按一次输入页加一,将13号键作为减法键,每按一次输入页减一。 本方法需要配合显示设备,实时显示当前所在输入页号及本输入页所能输入的字符。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
下面是样例单片机程序。
- #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);};
- }
复制代码
全部资料51hei下载地址:
askp6.zip
(113.21 KB, 下载次数: 23)
|