您的位置 首页 产品

MCU SOURCE FILE_键盘

includeatmelAT89X52H>includeintrinsh>defineucharunsignedchardefineuintunsignedintdefinecmdP0定义

#include<atmel/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位数据总线,5×8点阵双行显现
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]);//将得到的键值以十六进制方式显现在液晶显现屏上

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/260243.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部