⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdandkey.c

📁 用4*4键盘模拟手机按键输入
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
#include <1602lcd.ini>
//按键说明:A,B:左右移,C:上/下移,D:切换输入,E:删除,F:确定

uchar key,x=0,keypre;
uchar instate=0; //instate为输入状态 0为大写字母,1为小写字母,2为数字,3为标点
uchar selectN,selectK;
unsigned  int   wait_count;
bit y=0;
bit affirm=0;
//------------------------------------------------------------------------------------

void delay(uchar ms){
uchar i;
while(ms--){
for(i=0;i<125;i++);
}
}

//------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------
int getkey(){
return ((~P1)&0xf0);
}
//-----------------------------------------------------------------------------------
//判断是否有键按下
void chkkey(){
if (getkey()) {
delay(0x2);          //延时,去抖
delay(0x02);
}
}

//-----------------------------------------------------------------------------------
void findkey(){ //扫描法得出键值
uchar i,k,j;
i=(~P1)&0xf0;
j=0x10;
for (k=0;k<4;k++) {
if (i&j) key=k;      //得出行号
j<<=1;
}
key=key*4;
P1=0xfe;
if ((~P1)&0xf0) key=key;    //得出行键值=行号+列号
P1=0xfd;
if ((~P1)&0xf0) key=key+1;
P1=0xfb;
if ((~P1)&0xf0) key=key+2;
P1=0xf7;
if ((~P1)&0xf0) key=key+3;
//}
P1=0xf0;
}
//------------------------------------------------------------------------------------
void addchar(){
if (!selectK) return;
			  Send_Data_LCM(selectK);
			  x++;
			  if (x==16) {x=0;y=!y;}
			  selectK=0;
			  selectN=0;
			  affirm=0;

}
//------------------------------------------------------------------------------------
void keyfun(){
uchar temp1;
bit temp2;
if (key<=9) { 
             if (key!=keypre) addchar();            
             selectN++;
			 wait_count=0;
			 if (selectN==4) selectN=1;
       		 if (instate==0) selectK=0x41+selectN+key*3-1;
			 if (instate==1) selectK=0x61+selectN+key*3-1;
			 if (instate==2) selectK=0x30+key;
			 if (instate==3) selectK=0x21+key;		 
             Send_Data_LCM(selectK);
			 affirm=1;
			 Set_LCM_XY(x,y);
			 keypre=key;
			 return;
			 }
if (key==10) {x--;
              if (x==255) x=0;
			  Set_LCM_XY(x,y);
			  selectN=0;
			  return;
			  }
if (key==11) {x++;
              if (x==16) x=0;
			  Set_LCM_XY(x,y);
			  selectN=0;
			  return;
			  }
if (key==12) {
              y=!y;
			  Set_LCM_XY(x,y);
			  selectN=0;
			  return;
			  }
if (key==13) {instate++;
			  if (instate==4) instate=0;
			  Set_LCM_XY(15,1);
			  if (instate==0) Send_Data_LCM(0x41);
			  if (instate==1) Send_Data_LCM(0x61);
			  if (instate==2) Send_Data_LCM(0x30);
			  if (instate==3) Send_Data_LCM(0x3b);
			  selectN=0;
			  Set_LCM_XY(x,y);
			  return;
			  }
if (key==14) {
              if (affirm) {	affirm=0;
			   				Send_Data_LCM(0x00);
							Set_LCM_XY(x,y);
							return;
							}
              temp1=x-1;
			  temp2=y;
			  if (temp1==255) if (y==1) {temp2=0;temp1=15;}
			                   else return;
			  Set_LCM_XY(temp1,temp2);
			  Send_Data_LCM(0x00);
			  Set_LCM_XY(temp1,temp2);
			  x=temp1;
			  y=temp2;
			  selectN=0;
			  return;				  
			 }
if (key==15) { 
              addchar();
			  return;


			  }
}
//------------------------------------------------------------------------------------
main(){
Init_LCM();
P1=0xf0;
Set_LCM_XY(15,1);
Send_Data_LCM(0x41);
Set_LCM_XY(0,0);
x=0;y=0;
while (1){
if (!getkey()) P1=0xf0;
chkkey();      //判断是否有键按下
if (getkey()) {    //若有键按下
              findkey();    //求键值
              keyfun();
               }
while (getkey()) {};	  //Wait for Key UP
if (affirm) {
			 wait_count++;
			 if (wait_count==0x2fff) {wait_count=0;addchar();	}


			 }

} //while(1)


} //main()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -