📄 lcdkey.c
字号:
/********************************************/
/* LJD-IV 液晶、键盘驱动
/* 作者:刘延军
/* 2007年10月2日
/********************************************/
#include <lcdkey.h>
#include <reg52.h>
/***********LCD******************************/
/*LCD显示初始化*/
void LcdInitialize(void)
{
LCD8255CONTROL=0x88;
LCD8255C=0x84;
LCD8255C=0x82;
LCD8255B=0;
}
/*查询ASK状态*/
bit QueryAsk()
{
if(LCD8255C&0x80)
return 1;
else
return 0;
}
/*延时*/
void LcdDelay()
{
unsigned char t1,t2;
for(t1=0;t1<0x0a;t1++)
for(t2=0;t2<0xff;t2++)
{
}
}
/*向LCD发送数据ch,握手协议ASK/ANSWER*/
void SendDataToLcd(unsigned char ch)
{
LCD8255A=ch; //命令ch送数据口
LcdDelay(); //延时
LCD8255B=0xff; //置ANSWER为高电平,锁存数据到LCD
LcdDelay(); //延时
while(QueryAsk==0)
{
//判断LCD模块是否忙于内部处理数据(ASK=1?)
}
LCD8255B=0; //ASK=1后,拉低ANSWER
while(QueryAsk==1)
{
//等待ASK=0,准备发送下一个数据
}
}
/*显示ASCII字符*/
void LcdDisplayAsc(unsigned char xx,unsigned char yy,unsigned char asc)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF1); //显示ASCII字符,操作码F1
SendDataToLcd(xx);
SendDataToLcd(yy);
SendDataToLcd(asc);
}
/*显示区位码汉字*/
void LcdDisplayWord(unsigned char xx,unsigned char yy,
unsigned char qq,unsigned char ww)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF0); //显示区位码汉字,操作码F0
SendDataToLcd(xx);
SendDataToLcd(yy);
SendDataToLcd(qq);
SendDataToLcd(ww);
}
/*显示浮点型数据*/
void LcdDisplayFloat(unsigned char xx,unsigned char yy,float fdata)
{
unsigned char ascArr[17],*p,x,y;
x=xx;y=yy;
p=ascArr;
sprintf(p,"%f",fdata);
for(;*p;p++)
{
LcdDisplayAsc(x++,y,*p);
}
}
/*显示位点阵*/
void LcdDisplayDotBit(unsigned char xx,unsigned char yy)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF2); //显示位点阵,操作码F2
SendDataToLcd(xx);
SendDataToLcd(yy);
}
/*显示字节点阵*/
void LcdDisplayDotByte(unsigned char xx,unsigned char yy,unsigned char bt)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF3); //显示字节点阵,操作码F3
SendDataToLcd(xx);
SendDataToLcd(yy);
SendDataToLcd(bt);
}
/*清屏*/
void LcdClear(void)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF4);
}
/*局部清屏*/
void LcdClearSection(unsigned char xx,unsigned char yy)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF0);
SendDataToLcd(xx);
SendDataToLcd(yy);
SendDataToLcd(55);
SendDataToLcd(90);
}
/*上移*/
void LcdShiftUp(void)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF5);
}
/*下移*/
void LcdShiftDown(void)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF6);
}
/*左移*/
void LcdShiftLeft(void)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF7);
}
/*右移*/
void LcdShiftRight(void)
{
while(QueryAsk==1) ; //ASK为0后方可发送数据
SendDataToLcd(0xF8);
}
/*************LCD END****************/
/*************KEY********************/
void KeyInitialize(void)
{
KEY8279COM=0xDF; //总清除命令
do
{
ACC=KEY8279COM; //读取8279状态
}while(ACC^7==1); //等待清除命令结束
KEY8279COM=0x01; //译码扫描键盘
KEY8279COM=0x32; //18分频,8279CLK接ALE(主频/6)
}
bit KeyPressed(void) /*判断FIFO有键按下*/
{
if( KEY8279COM&0x0f)
return 1;
else
return 0;
}
unsigned char ReadKey(void) //读取键盘码
{
unsigned char ScanCode,Key;
while(KeyPressed()==0) ; //无键按下等待
KEY8279COM=0x40; //读FIFO RAM的命令
ScanCode=KEY8279DATA; //取键盘数据
//ScanCode=ScanCode&0x3f; //取低六位为键盘值
switch(ScanCode)
{
case 0xd8:{Key=1;break;}
case 0xd9:{Key=2;break;}
case 0xda:{Key=3;break;}
case 0xdb:{Key=4;break;}
case 0xdc:{Key=5;break;}
case 0xd0:{Key=6;break;}
case 0xd1:{Key=7;break;}
case 0xd2:{Key=8;break;}
case 0xd3:{Key=9;break;}
case 0xd4:{Key=0;break;} //数字键
case 0xc8:{Key=0x0a;break;} //Next
case 0xc9:{Key=0x0b;break;} //Pre
case 0xca:{Key=0x0c;break;} //OK
case 0xcb:{Key=0x0d;break;} //Cancel
case 0xcc:{Key=0x0e;break;} //STOP
default : Key=0xff;
}
return Key;
}
/*************KEY END****************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -