📄 lcd.c
字号:
/*********************************************************************************************************
* lcd drivers
* QZhao,2007
* All Rights Reserved
* File : lcd.c
* By : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/
/*★★★可调用函数: LCD_initial();->初始化 W_LCD(写入值,方式C1/D2) DIS_LCD(行,列,首址)->中/英文显示
GRAPH_BMP(图像首址)->绘图 LCDLineXy(原始XY,目标XY)->画线
备用: DIS_C_LCD(行,列,字符ASC)->将相应字符送入LCD显示 DIS_Z(x)->数值转换*/
/*********************************************************************************************************
*
* LCD初始化
*
*********************************************************************************************************/
bool LCD_initial(void)
{
W_LCD(0x30,1); //基本指令集操作
W_LCD(0x06,1); //移动方向,指定显示移位
W_LCD(0x0C,1); //整体显示ON
W_LCD(0x01,1); //清屏
delayms(10);
return TRUE;
}
/*********************************************************************************************************
*
* lcd端口写入子函数
* 人口参数:(写入值,写入类型1控制字 OR 2数据)
* 返回值:成功则TRUE
* 功能:写入相应lcd控制字或数据
*
*********************************************************************************************************/
bool W_LCD(uchar x,uchar y)
{
uchar i;
switch(y)
{
case 1: LCD_RS=0; break; //指令
case 2: LCD_RS=1; break; //数据
default: return FALSE;
}
W_8255(0x04,1); //RW拉低
W_8255(x,2);
_nop_();
_nop_();
LCD_E=1;
_nop_();
_nop_();
LCD_E=0;
for(i=200;i>0;i--);
return TRUE;
}
/*********************************************************************************************************
*
* 点阵液晶显示函数
* 入口参数:DIS_LCD(行,列,首址)
* 返回值:TRUE
* 功能:将相应内容送入LCD显示
*
*********************************************************************************************************/
bool DIS_LCD(uchar x,uchar y,char *str,uchar z)
{
uchar addr;
char temp;
W_LCD(0x30,1);
switch(x)
{
case 1:
addr=(0x7F+y);
break;
case 2:
addr=(0x8F+y);
break;
case 3:
addr=(0x87+y);
break;
case 4:
addr=(0x97+y);
break;
}
W_LCD(addr,1);
for(;z>0;z--)
{
temp=*str;
str++;
W_LCD(temp,2);
}
return TRUE;
}
/*********************************************************************************************************
*
* 点阵液晶画点函数
* 入口参数:GRAPH_POINT(0~127,0~63)
* 返回值:TRUE
* 功能:LCD任意位置画点
*
*********************************************************************************************************/
static bool Sendint(uint dd)
{
W_LCD(dd>>8,2);
W_LCD(dd,2);
return TRUE;
}
bool GRAPH_POINT(uchar x,uchar y)
{
uchar xx,yy;
W_LCD(0x34,1);
W_LCD(0x36,1);
xx=x/16;
yy=63-y;
if(yy>=32){xx=xx+8;yy-=32;}
W_LCD(0x80+yy,1);
W_LCD(0x80+xx,1);
Sendint(0x8000>>(x%16));
return TRUE;
}
/*********************************************************************************************************
*
* 点阵液晶绘图函数
* 入口参数:GRAPH_BMP(图像首址)
* 返回值:TRUE
* 功能:将相应图像送入LCD显示
*
*********************************************************************************************************/
bool GRAPH_BMP(uchar *str)
{
uint x=0;
uchar i,j;
W_LCD(0x34,1);
W_LCD(0x36,1);
for(i=0;i<32;i++)
{
W_LCD(0x80|i,1); //行
W_LCD(0x80,1); //列
for(j=0;j<32;j++)
{ //列位置每行++
W_LCD(str[x],2);
x++;
}
}
return TRUE;
}
/*********************************************************************************************************
*
* 点阵液晶画线函数
* 入口参数:LCDLineXy(原始XY,目标XY)
* 返回值:TRUE
* 功能:画一条任意两点间的直线
*
*********************************************************************************************************/
bool LCDLineXy(uchar x,uchar y,uchar x1,uchar y1)
{
uchar i;
uchar a;
uchar b;
uchar c; //中间值
uint a1;
uint b1;
char d=1; //标志位,1表示x大,-1表示x1大
char e=1; //标志位,1表示y大,-1表示y1大
bit f=0; //标志位,0表示a大,1表示b大
if (x1>x)
{a=(x1-x);d=-1;}
else
a=(x-x1);
if (y1>y)
{b=(y1-y);e=-1;}
else
b=(y-y1);
a1=a;
b1=b;
if (b>a)
{c=b;b=a;b=c;f=1;} //保证a>b容易对数进行操作
if(f==0)
{ //分为两种情况 a>b的时候
for (i=0;i<=a;i++)
{
x1=x;
y1=y;
x=x-d*i;
y=y-(b1*i/a1)*e;
GRAPH_POINT(x,y);
x=x1;
y=y1;
}
}
if(f==1)
{ //a<b的时候;以空间换时间算法
for (i=0;i<=b;i++)
{
x1=x;
y1=y;
y=y-e*i;
x=x-(a1*i/b1)*d;
GRAPH_POINT(x,y);
x=x1;
y=y1;
}
}
return TRUE;
}
/*********************************************************************************************************
*
* 左半屏CGRAM清除函数
* 入口参数:无
* 返回值:TRUE
* 功能:清除左半屏图形区内容
*
*********************************************************************************************************/
bool CLEAR_HALF(void)
{
uchar i,j;
W_LCD(0x34,1);
W_LCD(0x36,1);
for(i=0;i<32;i++)
{
W_LCD(0x80|i,1);
W_LCD(0x80,1);
for(j=0;j<8;j++)
{
W_LCD(0,2);
}
}
for(i=0;i<32;i++)
{
W_LCD(0x80|i,1);
W_LCD(0x80|0x08,1);
for(j=0;j<8;j++)
{
W_LCD(0,2);
}
}
return TRUE;
}
/*********************************************************************************************************
*
* 全屏CGRAM清除函数
* 入口参数:无
* 返回值:TRUE
* 功能:清除左全屏图形区内容
*
*********************************************************************************************************/
bool CLEAR_SCREEN(void)
{
uchar i,j,x,y;
W_LCD(0x34,1);
W_LCD(0x36,1);
x=0x80;
y=0x80;
for(j=0;j<64;j++)
{
y=0x80;
W_LCD(x,1);
W_LCD(y,1);
for(i=0;i<32;i++)
{
W_LCD(0,2);
}
x=x+1;
}
return TRUE;
}
/*************************************************以下备用***********************************************/
/*********************************************************************************************************
*
* 点阵液晶字符显示函数
* 入口参数:DIS_C_LCD(行,列,字符ASC)
* 返回值:无
* 功能:将相应字符送入LCD显示
*
*********************************************************************************************************
bool DIS_C_LCD(uchar x,uchar y,char z)
{
uchar addr;
switch(x)
{
case 1:
addr=(0x7F+y);
break;
case 2:
addr=(0x8F+y);
break;
case 3:
addr=(0x87+y);
break;
case 4:
addr=(0x97+y);
break;
}
W_LCD(addr,1);
W_LCD(z,2);
return TRUE;
}
/*********************************************************************************************************
*
* 字符转换函数
* 入口参数:DIS_Z(待转无符号数据)
* 返回值:送入DIS_BUF内,TRUE or FALSE
* 功能:将相应无符号数据转换成3位ASC码
*
*********************************************************************************************************
bool DIS_Z(uchar x)
{
uchar a,b,c;
a=x%10;
b=(x%100-a)/10;
c=(x-x%100)/100;
DIS_BUF[0]=toascii((char)c);
DIS_BUF[1]=toascii((char)b);
DIS_BUF[2]=toascii((char)a);
return TRUE;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -