LCD显示的步骤(默认已经完成片选):
一、LCD每画一个点,实际上就是写寄存器:
每个寄存器有相应的地址,写寄存器之前,要用A0A1A2这三个bit的地址选择你要改写的寄存(如:状态字寄
存器PSW:地址A2A1A0=111)。寄存器的地址如下,分别控制着:行(Y坐标)、列(X坐标)、前景色、背景色、数据、状态控制寄存器
所以,步骤就是:
1、写前景色、背景色寄存器
2、写状态控制寄存器(亮度控制、坐标自动+1、单点/多点写入方式)
3、写X,Y坐标寄存器。(用前两步设置的属性,在(x,y)处画点。
上面每一步又可分为两步:1、通过地址A0A1A2选择寄存器,2、写入值。
“WLAT80控制板中有8个寄存器,它们是行(Y坐标)、列(X坐标)、前景色、背景色、数据、状态控制寄存器,通过对相关寄存器操作,可实现单点读屏,单点、多点、8点写屏。”
寄存器:
X坐标寄存器:存即将显示的点的X坐标值,地址:A2A1A0=000,001,低字节在前,高字节在后
Y坐标寄存器:地址:A2A1A0=010,011,低字节在前,高字节在后
状态控制寄存器:
Bri1,bri0为亮度控制:=11,最亮;=10,较亮;=01,较暗;=00,黑屏。
D3和D2位根据用户需要可设置成以下两种功能:
Xinc为列(X坐标)号自动增加控制位,=1时允许X自动增加,写满一行后自动换行,=0时则禁止增加。单点写屏时,X自动加1,多点(或8点)写屏时自动加8;
YINC为行(Y坐标)自动加1控制位,=1时允许自动加1,=0时则禁止加1;
WRCON1,WRCON0为写入方式:
WRCON1,WRCON0=00时为单点写入方式,直接将颜色值写入数据寄存器,而与前景色、背景色寄存器内容无关;
WRCON1,WRCON0=01时为多点写入方式,将点位信息写入数据寄存器,如写入数据寄存器为‘01010101b’则显示‘原色、前景色、原色、前景色、原色、前景色、原色、前景色’。
WRCON1,WRCON0=10时为8点写入方式,将点位信息写入数据寄存器,如写入数据寄存器为‘01010101b’则显示‘背景色、前景色、背景色、前景色、背景色、前景色、背景色、前景色’。
**原色:显示屏原有颜色,前景色、背景色是事先存入前景、背景寄存器中的颜色值。
‘01010101b’
set_lcd_status(0xC0); 11000000 直接将颜色值写入数据寄存器
set_lcd_status(0xC1); 11000001 原色、前景色
set_lcd_status(0xC2); 11000010 背景色、前景色
如下图,显示屏原有颜色是一幅照片,“多点”两个字是用多点写入方式写入的,只写前景色蓝色,不写背景色;而“8点” 两字是用8点写入方式写入的,前景色为绿色,背景色为白色,前景和背景同时写入。
更多寄存器的功能和用法看PDF。
二、实例:
写寄存器:
void write_reg(uchar Addr,uchar Data)
{
P5OUT|=BIT4; //RD=1
P5OUT&=~BIT1; //片选有效
P10DIR|=BIT0+BIT1+BIT2; //P10口的0、1、2脚设为输入,为向LCD模块写寄存器地址:A0A1A2 做准备
Addr=Addr&0x07+(P10OUT&BIT3);//保持P10.3原来的电平状态(我们的P10.3口有其他用途,不能改变它)
P10OUT=Addr; //写寄存器地址:A0A1A2 选择要操作的寄存器
P4OUT=Data; //数据挂在P4口上准备好
P5OUT&=~BIT5; //写有效,将数据数据写入寄存器。
P5OUT|=BIT5; //写撤销
P5OUT|=BIT1; //片选无效
}
void set_status(uchar status)
{
write_reg(0x0F,status);
}
void set_front_color(uchar status)
{
write_reg(0x0C,status);
}
void set_background_color(uchar status)
{
write_reg(0x0D,status);
}
写汉字的函数:
void draw_hz(uint16 x,uint16 y,uint8 hz_height,uint8 hz_width, const uint8 *data)
{
uint16 p = 0;
set_lcd_status(0xC6); // X自增8点写入
for(uint8 i=0;i<hz_height;i++)
{
set_xcoord(x); // 写X坐标数据
set_ycoord(y+i); // 写Y坐标数据
for(uint8 j = 0; j < hz_width; j ++)
{
write_lcdreg(0x06,data[p]); //0x06写显示数据寄存器
p++;
}
}
}
汉字的高度和宽度,由取模取出来的字体的宽度高度决定:如:
const uint8 num[11][144]@0x010000={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x70,
0x07,0xFF,0xFF,0xF0,0x06,0x0C,0x30,0x70,0x06,0x0C,0x30,0x70,0x06,0x0C,0x30,0x70,
0x07,0xFF,0xFF,0xF0,0x06,0x01,0x00,0x70,0x04,0x01,0xC0,0x50,0x00,0x03,0x80,0x38,
0x3F,0xFF,0xFF,0xFC,0x10,0x03,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0xFF,0xFF,0x00,
0x00,0xC0,0x07,0x00,0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xFF,0xFE,0x00,
0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xC0,0x06,0x00,
0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x18,
0x00,0xC0,0x06,0x3C,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00}
……
}
高度为:33 宽度为:32/8= 4; 所填入的参数应为: 33 4 hz_height=33 hz_width=4
取字模,字模数组加括号和不加花括号的区别:
加花括号的时候,num[11][144] 数组的单元个数可以不精确,调用的时候num[x],以花括号为结束,
不加花括号的时候,数组的单元个数必须精确,调用时候会按定义的个数调用,如果里面的字模点阵数不一致,就会出现错误。