📄 lpc_lib_mylcd.c
字号:
/*
**********************************************************************************************
*
* Embest Info&Tech Co., Ltd. All rights reserved.
* www.embedinfo.com
*
*file: lpc_lib_LCD.c
*author: z.x.q. embest
*establish: 2006.xx.xx
*modify: xx
*notes: xx
**********************************************************************************************
*/
/*
**********************************************************************************************
* include files
**********************************************************************************************
*/
#include "..\..\com\lpc_lib_mylcd\lpc_lib_mylcd.h"
#include "..\..\com\lpc_lib_mylcd\image.h"
#include "..\..\com\lpc_lib_mylcd\han.h"
#include "..\..\com\lpc_lib_mylcd\ascii.h"
//#define COM_FTF (x/256)<<2
/*
**********************************************************************************************
* extern function/variable declare
**********************************************************************************************
*/
/*
**********************************************************************************************
* global variable define
**********************************************************************************************
*/
/*
**********************************************************************************************
函数声明
**********************************************************************************************
*/
/*
void myLCD_init(void);
void myLCD_wrcom(INT8U comd);
void myLCD_wrdata(INT8U data);
void Delayms(INT32U value);
void myLCD_Xaddr(INT16U xadd);
void myLCD_Yaddr(INT8U yadd);
void myLCD_fore_on(INT8U on_off);
void disp_line_byte(INT8U datain,INT8U front,INT8U back);
void disp_line_byte_fore(INT8U datain,INT8U front,INT8U x,INT8U y);
void myLCD_sendch_zc(INT8U data);
void myLCD_sendch(INT8U data);
void myLCD_sendstr(INT8U *str);
void myLCD_printf(INT8U *fmt,...);
void myLCD_send_han_data(INT8U data[]);
void myLCD_send_han(INT8U han_code);
void mycls_back();
void mycls(INT8U col);
void myposi_set(INT8U lineth,INT8U colth);
void myposi_piexl_start(INT16U x,INT8U y);
void myposi_piexl_end(INT16U x,INT8U y);
void myLCD_disp_picture_full(INT8U data[]);
void myLCD_disp_picture(INT8U data[]);
void myLCD_disp_picture_fore(INT8U data[]);
void myLCD_line(INT8U col);
void myLCD_line_xie(INT8U col);
void myLCD_line_0(INT8U col);
void myLCD_line_rectangle(INT8U col);
void color_set(INT16U fcolor,INT16U bcolor);
void clear_line(INT8U line_num);
*/
INT8U myglineth=0; //line number
INT8U mygcolth=0; //column number
INT8U mygfore_clr=0x0; //fore color
INT8U mygback_clr=0xe0; //back color
INT16U x_piexl_start=0; // x轴像素开始坐标
INT8U y_piexl_start=0; // y轴像素开始坐标
INT16U x_piexl_end=0; // x轴像素结束坐标
INT8U y_piexl_end=0; // y轴像素结束坐标
INT8U fore_on=0; //是否开只显示前景功能
/*
**********************************************************************************************
* name: myLCD_init
* func: initialize LCD screen
* para: none
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void myLCD_init(void)
{
}
/*
**********************************************************************************************
* name: myLCD_wrcom
* func: write command
* para: command data
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void delay_write(INT8U i)
{
INT8U j;
for(;i>0;i--)
for(j=0;j<1;j++);
}
/*
**********************************************************************************************
* name: myLCD_wrcom
* func: write command
* para: command data
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void myLCD_wrcom(INT8U comd)
{
ADDR_myCOM=comd;
// delay_write(1);
}
/*
**********************************************************************************************
* name: myLCD_wrdata
* func: effect
* para: form parameter
* ret: return value description
* modify:
* comment:
**********************************************************************************************
*/
void myLCD_wrdata(INT8U data)
{
ADDR_myDATA=data;
// delay_write(1);
}
/*
**********************************************************************************************
* name: myDelayms
* func: delay time in ms
* para: value: delayed value ,unit:ms
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void myDelayms(INT32U value)
{
INT32U i;
for(;value>0;value--)
for(i=0;i<500;i++);
}
//set x address
void myLCD_Xaddr(INT16U xadd)
{
ADDR_XADD=xadd%256; //因为x寄存器是8位的,而数据可以是大于256的。
// delay_write(1);
}
//set y address
void myLCD_Yaddr(INT8U yadd)
{
ADDR_YADD=yadd;
// delay_write(1);
}
//设只显示前景色功能
void myLCD_fore_on(INT8U on_off)
{
fore_on=on_off;
}
/*
****************************************************************************
* name: disp_line_byte
* func: 用于写一行8个像素的数据
* para: datain:所传的数据编码,front:显示的前景色,back:显示的背景色
* ret: none
* modify:
* comment: 当datain的某位为1时,那个像素显示前景色,为0时,显示背景色
*****************************************************************************
*/
void disp_line_byte(INT8U datain,INT8U front,INT8U back)
{
INT8U i,j,data;
for( i=0,j=0x80; i<8; i++,j=(j>>1))
{
data=datain&j ? front: back;
myLCD_wrdata(data);
}
}
/*
****************************************************************************
* name: disp_line_byte_fore
* func: 用于只显示前景色
* para: datain:所传的数据编码,front:显示的前景色,x:x轴像素位置,y:y轴像素位置
* ret: none
* modify:
* comment: 当datain的某位为1时,那个像素显示前景色,为0时,不变色
*****************************************************************************
*/
void disp_line_byte_fore(INT8U datain,INT8U front,INT8U x,INT8U y)
{
INT8U i,k,com;
for(k=0x80,i=0;i<8;i++,k=(k>>1),x++)
{
if(datain&k)
{
myLCD_Xaddr(x);
myLCD_Yaddr(y);
com=(x/256)<<2;
myLCD_wrcom(com);
myLCD_wrdata(front);
}
}
}
/*
****************************************************************************
* name: disp_line_sendch_zc
* func: 发送字母显示的一个子程,专用于显示的
* para: data:所传的数据编码
* ret: none
* modify:
* comment:
*****************************************************************************
*/
void myLCD_sendch_zc(INT8U data)
{
INT8U i;
INT32U k;
INT16U xaddr;
INT8U yaddr;
INT8U data1;
// xaddr=mygcolth*8+X_SPACE0;
// yaddr=myglineth*16+Y_SPACE0;
xaddr=x_piexl_start+mygcolth*8;
yaddr=y_piexl_start+7;
k=(data-0x20)*16; //存数据时,0x20的数据放在第一个,一个字母16个数据
for(i=0;i<16;i++,yaddr++)
{
data1=ascii8x16[k+i];
if(!fore_on) //关只显前景色功能
{
myLCD_Xaddr(xaddr);
myLCD_Yaddr(yaddr);
disp_line_byte(data1,mygfore_clr,mygback_clr);
}
else //开只显前景色功能
{
disp_line_byte_fore(data1,mygfore_clr,xaddr,yaddr);
}
}
mygcolth++; //写完一个字母,换行
if(!(mygcolth%z_column_num)) //如果写满一行,换行
{
myglineth++;
mygcolth=0;
}
}
/*
**********************************************************************************************
* name: myLCD_sendch
* func: display a char in LCD
* para: the displaying data
* ret: none
* modify:
* comment: there are 38 ascii chars in every line, 19 lines in all.
dscription about one ascii char:8*16 dots.
so LCD panel: x: 8*38+X_SPACE0+X_SPACE1=320
y: 16*14+Y_SPACE0+Y_SPACE1=240
**********************************************************************************************
*/
void myLCD_sendch(INT8U data)
{
if(data=='\n') //换行符号
{
myglineth++;
mygcolth=0;
}
else if(data=='\r') //回到行首
mygcolth=0;
//0x20~0x7f为键盘输入的ascii范围,也是常用数据,后面的判断是防止参数超出范围
else if((data>=0x20)&&(data<=0x7e)&&(mygcolth<z_column_num)&&(myglineth<z_line_num))
{
myLCD_sendch_zc(data);
}
}
/*
**********************************************************************************************
* name: myLCD_sendstr
* func: send string to LCD display
* para: string pointer
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void myLCD_sendstr(INT8U *str)
{
while(*str)
{
myLCD_sendch(*str++);
if(myglineth>z_line_num-1) //只有14行,从0~13
{
myglineth=0;
mygcolth=0;
mycls(0xe0); //写满屏幕后,没程序
}
}
}
/*
**********************************************************************************************
* name: myLCD_printf
* func: print string in LCD
* para: variable parameter pointer
* ret: none
* modify:
* comment: use function vsprintf,included in stdarg.h
**********************************************************************************************
*/
// 这是最后用来显示字符的
void myLCD_printf(INT8U *fmt,...)
{
va_list ap;
INT8U string[50];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
myLCD_sendstr(string);
va_end(ap);
}
/*
**********************************************************************************************
* name: myLCD_send_han_data
* func: 用于显示汉字
* para: data为这个汉字数组
* ret: none
* modify:
* comment: use function vsprintf,included in stdarg.h
一个汉字用32个数据,mygcolth,myglineth对于字母的位置来说的,不是汉字
一个字母对应于1个mygcolth,1个myglineth,而1个汉字对应于2个mycolth,1个myglineth
**********************************************************************************************
*/
void myLCD_send_han_data(INT8U data[])
{
INT8U i=0,y,com,data1;
INT16U x;
INT8U k=0;
y=myglineth*16+Y_SPACE0;
x=mygcolth*8+X_SPACE0;
if((mygcolth<z_column_num)&&(myglineth<z_line_num))
{
for(i=0;i<16;i++,y++)
{
if(!fore_on)
{
myLCD_Yaddr(y);
myLCD_Xaddr(x);
com = (x/256)<<2;//TFT板为CMD = ( x/256)<<2;,CSTN板为CMD = (( x/256)<<6)|0x04;
myLCD_wrcom(com);
disp_line_byte(data[k++],mygfore_clr,mygback_clr);//左边字节
disp_line_byte(data[k++],mygfore_clr,mygback_clr);//右边字节
}
else
{
disp_line_byte_fore(data[k++],mygfore_clr,x,y);
x=x+8;
disp_line_byte_fore(data[k++],mygfore_clr,x,y);
x=x-8;
}
}
mygcolth=mygcolth+2; //1个汉字对应于2个mygcolth
if(!(mygcolth%z_column_num)) //写满换行
{
myglineth++;
mygcolth=0;
}
}
}
/*
**********************************************************************************************
* name: myLCD_send_han
* func: 用于显示汉字
* para: han_code为这个汉字在字库中的位置
* ret: none
* modify:
* comment: use function vsprintf,included in stdarg.h
一个汉字用32个数据,mygcolth,myglineth对于字母的位置来说的,不是汉字
一个字母对应于1个mygcolth,1个myglineth,而1个汉字对应于2个mycolth,1个myglineth
**********************************************************************************************
*/
//最后用于汉字输出的
void myLCD_send_han(INT8U han_code)
{
INT8U i=0,y,com,data1;
INT16U x;
INT32U k;
y=myglineth*16+Y_SPACE0;
x=mygcolth*8+X_SPACE0;
k=han_code*32; //一个中文是32个数据
if((mygcolth<z_column_num)&&(myglineth<z_line_num))
{
for(i=0;i<16;i++,y++)
{
if(!fore_on)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -