标题:
单片机矩阵键盘模拟手机键盘输入西文字符和数字源程序分享
[打印本页]
作者:
lyqhlly
时间:
2018-4-20 17:31
标题:
单片机矩阵键盘模拟手机键盘输入西文字符和数字源程序分享
大三的时候做的单片机课程设计源代码
STC89C52单片机,用的LCD1602液晶显示屏和4*4的矩阵键盘
功能大致就是选定9个按键进行a~z 0~9的输入,并能通过两个按键移动光标选择输入的位置。
本贴分享的是源代码
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DB P0
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^5;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
uchar code table[]={'A','B','C'};
uchar code table1[]={'D','E','F'}; //
uchar code table2[]={'G','H','I'};
uchar code table3[]={'J','K','L'};
uchar code table4[]={'M','N','O'}; //
uchar code table5[]={'P','Q','R'};
uchar code table6[]={'S','T','U'};
uchar code table7[]={'V','W','X'};
uchar code table8[]={'Y','Z','!'};//
unsigned char code KeyCode[] = { //4*4矩阵键盘按键编码
0xE7, 0xD7, 0xB7, 0x77, 0xEB, 0xDB, 0xBB, 0x7B,
0xED, 0xDD, 0xBD, 0x7D, 0xEE, 0xDE, 0xBE, 0x7E,
};
uchar num1,num2,num3,num4,num5,num6,num7,num8,num9,key=15;\
char j,k;
void light(uchar x,uchar y);
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void LCD_Write_Com(uchar com)
{
delayms(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
void LCD_Write_Data(uchar Data)
{
delayms(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delayms(5);
}
void light(uchar x,uchar y) //光标位置
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
}
void LCD_Write_Char(uchar x,uchar y,uchar Data) //LCD 写
{
light( x,y);
LCD_Write_Data( Data);
light(x, y);
}
void LCD_Init(void) //lcd初始化
{
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
delayms(5);
LCD_Write_Com(0x0C);
LCD_Write_Com(0x0F); //显示光标以及光标闪烁
}
void ScanKeyboard() //键盘扫描程序
{
unsigned char scan1,scan2,keyboard;
unsigned char i;
P2 = 0xf0; //4条行线输出低电平,4条列线作为输出
scan1 = P2; //读取列线状态
if((scan1&0xf0)!=0xf0) //判断是否有键按下
{
delayms(10); //延时去抖
scan1 = P2; //再次读取列线状态
if((scan1&0xf0)!=0xf0) //再次判断是否有键按下
{
P2 = 0x0f; //4条列线输出低电平,4条行线作为输出
scan2 = P2; //读取行线状态
keyboard = scan1 | scan2; //组合键值
while((P2&0x0f)!=0x0f); //等待按键释放
for(i=0;i<=15;i++) //根据按键编码得出按键编号
{
if(keyboard == KeyCode[i])//判断对应的键值 以及按下次数
{
key = i;
switch(key)
{
case 0:num1++;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 1:num2++;num1=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 2:num3++;num1=0;num2=0;num4=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 4:num4++;num1=0;num2=0;num3=0;num5=0;num6=0;num7=0;num8=0;num9=0;break;
case 5:num5++;num1=0;num2=0;num3=0;num4=0;num6=0;num7=0;num8=0;num9=0;break;
case 6:num6++;num1=0;num2=0;num3=0;num4=0;num5=0;num7=0;num8=0;num9=0;break;
case 8:num7++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num8=0;num9=0;break;
case 9:num8++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num9=0;break;
case 10:num9++;num1=0;num2=0;num3=0;num4=0;num5=0;num6=0;num7=0;num8=0;break;
case 15:k++;
if(k==16)
{
k=0;j++;
if(j==2)
{
j=0;
}
}
light( k,j);break;
case 7:k--;
if(k==-1)
{
k=15;j++;
if(j==2)
{
j=0;
}
}
light( k,j);break;
default:break;
}
}
}
}
}
}
uchar jianzhi() //按下次数所显示的字母
{
switch(key)
{
case 0:return table[(num1-1)%3];break;
case 1:return table1[(num2-1)%3];break;
case 2:return table2[(num3-1)%3];break;
case 4:return table3[(num4-1)%3];break;
case 5:return table4[(num5-1)%3];break;
case 6:return table5[(num6-1)%3];break;
case 8:return table6[(num7-1)%3];break;
case 9:return table7[(num8-1)%3];break;
case 10:return table8[(num9-1)%3];break;
default:return 0xff;break;
}
if(key==0||key==1||key==2||key==4||key==5||key==6||key==8||key==9||key==10) return table[key];
else return 0xff;
}
void xianshi()
{
static uchar str;
str=jianzhi();
if(str!=0xff)
{
if((k==0)&&(j==0))
LCD_Clear();
LCD_Write_Char(0+k,0+j,str);
key=15;
}
}
void main()
{
LCD_Init(); //LCD1602初始化
while(1)
{
ScanKeyboard(); //键盘扫描
xianshi(); //显示所按下字母以及光标的移动
}
}
复制代码
所有资料51hei提供下载:
矩阵键盘模拟手机键盘.rar
(1.73 KB, 下载次数: 29)
2018-4-20 17:30 上传
点击文件名下载附件
C 文件 源代码
下载积分: 黑币 -5
作者:
caifei9280
时间:
2020-7-14 08:59
这为我的设计提供了参考,感谢。
作者:
caifei9280
时间:
2020-7-14 10:12
void LCD_Init(void) //lcd初始化?
{
RW=0;
EN=0;
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
LCD_Write_Com(0x0C);
LCD_Write_Com(0x0F); //显示光标以及光标闪烁
}
缺少1602打开使能,引用的注意。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1