在下面将列出部分初始化程序来说明指令的使用,但对于CSRDIR和CSRW指令,有必要详细解释一下。CSRDIR指令是用来设置光标移动方向的,有上,下,左,右四个移动方向(4EH,4FH,4DH,4CH),CSRW指令则是用来设置光标地址的。要特别注意这里的光标是对应显存里面的一个字节(byte),而不是对应字节里的一个位(bit),当设置光标向右移动时,每写完一个字节数据到显存,光标地址就会加一,此时对应显存的字节地址加一;同理,设置光标向左移动时,对应显存的字节地址减一。而当设置光标向下移动时,目标光标地址(字节地址)=当前光标地址(字节地址)+AP(液晶屏一行所对应显存的字节数),注:一般AP设置为完整显示液晶屏一行所用字节数加1,即40+1=41. 如下图所示,如果当前光标在字节地址Add1处,则写完一个字节数据后光标则移到了字节地址Add42处;同理,设置光标向上移动时,如果当前光标在Add81处,则写完一个字节数据后光标则移到了Add40处
5. 液晶显示的软件设计
5.1初始化LCD程序:
#define LCD_DAT (*((volatile unsigned int *)0x3800)) //定义数据寄存器
#define LCD_COM (*((volatile unsigned int *)0x3801))//定义指令寄存器
void Lcd_init(void)
{
LCD_COM = 0x40;//显示窗口设置指令,之后带8个参数
LCD_DAT = 0x30;//单屏LCD模式,内部字元发生器有效
LCD_DAT = 0x87;//显示字符宽度8
LCD_DAT = 0x07;//显示字符高度8
LCD_DAT = 0x27;//一行显示40个字节
LCD_DAT = 0x46;
LCD_DAT = 0xEF;//总共显示240行
LCD_DAT = 0x28;//AP=40+1
LCD_DAT = 0x00;
…………… //其他初始化指令
}
5.2 显示一个32x32字符程序:
void Disp16x32Char(void)
{
LCD_COM = 0x4E;//设置光标地址自动移动方向 向上
for(i=0;i<4;i++)//从左到右连续写入4列数据,每列32字节,共128字节
{ // x1取值范围1--40,y1取值范围1--240
Set_Graphic_Csr(x1,y1); //根据光标所在位置计算出对应的字节地址
p = CharTab[1]; //指针指向字模数组
LCD_COM = 0x42; //写显示数据指令
//自下而上写入32个字节
for(j=0;j<32;j++)
{
LCD_DAT = p[j+32*i+128*k];//从字模数组中取出一字节
}
x1++;//准备写右边一列数据
}
}