微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MCU SOURCE FILE_键盘

MCU SOURCE FILE_键盘

时间:11-24 来源:互联网 点击:
#includeatmel/AT89X52.H>

#include

#define uchar unsigned char
#define uint unsigned int
#define cmd P0 //定义LCM的数据接口,请根据实际情况修改
#define lcmbusy P0_7 //定义LCM数据接口的第8位所在的端口,请根据实际情况修改
#define RS P3_4//定义LCM的RS引脚所在的端口,请根据实际情况修改
#define RW P3_3//定义LCM的RW引脚所在的端口,请根据实际情况修改
#define EN P3_2 //定义LCM的EN引脚所在的端口,请根据实际情况修改

#define c_cls 0x01 //清屏命令
#define c_curret 0x02 //光标返回命令
#define c_setmode1 0x06//设置输入模式:字符码传送完成后DDRAM地址指针自动加1,显示不移位(一般使用此模式)
#define c_setmode2 0x07//设置输入模式:字符码传送完成后DDRAM地址指针自动加1,显示向右移位
#define c_setmode3 0x04//设置输入模式:字符码传送完成后DDRAM地址指针自动减1,显示不移位
#define c_setmode4 0x05//设置输入模式:字符码传送完成后DDRAM地址指针自动减1,显示向左移位
#define c_displayoff 0x08//关显示
#define c_displayon1 0x0c//开显示命令1,无光标
#define c_displayon2 0x0f//开显示命令2,有光标且光标闪烁
#define c_displayon3 0x0e//开显示命令3,有光标且光标不闪烁
#define c_displaymove1 0x10//光标向左移动,AC 自动减1
#define c_displaymove2 0x14//光标向右移动,AC 自动加1
#define c_displaymove3 0x18//光标和显示一起向左移动
#define c_displaymove4 0x1c//光标和显示一起向右移动
#define c_setfunc1 0x30//LCM功能设置:8位数据总线,单行显示,5X8点阵字体
#define c_setfunc2 0x34//LCM功能设置:8位数据总线,单行显示,5X10点阵字体
#define c_setfunc3 0x38//LCM功能设置:8位数据总线,双行显示,5X8点阵字体
#define c_setfunc4 0x20//LCM功能设置:4位数据总线,单行显示,5X8点阵字体
#define c_setfunc5 0x24//LCM功能设置:4位数据总线,单行显示,5X10点阵字体
#define c_setfunc6 0x28//LCM功能设置:4位数据总线,双行显示,5X8点阵字体

#define BL P3_5//定义LCM背光控制接口
uchar code hexcode[16]="0123456789ABCDEF";

void cmdexec(uchar scmd)
{
cmd=0xff;
RS=0;
RW=1;
_nop_();
EN=1;
_nop_();
_nop_();
while(lcmbusy);
EN=0;
RS=0;
RW=0;
cmd=scmd;
_nop_();
EN=1;
_nop_();
_nop_();
EN=0;
}

void show(uchar x,uchar y,uchar schar){
uchar temp;
temp=x&0x0f;
y&=0x3;
if(y==2)temp|=0x40;
temp|=0x80;
cmd=0xff;
RS=0;
RW=1;
_nop_();
EN=1;
_nop_();
_nop_();
while(lcmbusy);
EN=0;
RS=0;
RW=0;
cmd=temp;
_nop_();
EN=1;
_nop_();
_nop_();
EN=0;
RS=0;
RW=1;
_nop_();
EN=1;
_nop_();
_nop_();
while(lcmbusy);
EN=0;
RS=1;
RW=0;
cmd=schar;
_nop_();
EN=1;
_nop_();
_nop_();
EN=0;
}

void showstr(char x,y,char *string)
{while(*string!=)
{show(x,y,*string);
string++;
x++;
}
}

void initlcm(void)
{cmd=0x00;
cmdexec(c_setfunc3);//设置LCM为8位数据总线,5x8点阵双行显示
cmdexec(c_cls);//清屏
cmdexec(c_setmode1);//设置LCM显示模式设置1
cmdexec(c_displayon1);//开启显示,无光标
}

uchar keyscan(void)//键盘扫描过程实际上是先将键盘接口的所有行(列)线都输出0,列(行)线输出1,读取列(行)线的值
{uchar data k;//然后将所有列(行)线都输出0,行(列)线输出1,读取行(列)线的值,
P2=0xf0;//然后将得到的列线和行线值相加作为键值
k=P2;
P2=0x0f;
k=k+P2;
return ~k;
}

void delayms(unsigned int ms)//延时函数
{unsigned char data i;
while(ms--)
{for(i=0;i<123;i++);
}
}

void main(void)
{uchar data key;
BL=0;//开LCM背光
initlcm();
showstr(0,1," Welcom to PES ");
showstr(0,2,"Xian zai jian:");
while(1)
{key=keyscan();//调用键盘扫描子程序,得到当前键值
show(14,2,hexcode[key>>4]);//将得到的键值以十六进制形式显示在液晶显示屏上
show(15,2,hexcode[key&0x0f]);//将得到的键值以十六进制形式显示在液晶显示屏上

}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top