第80节:调液晶屏内部字库显示汉字或字符的坐标体系和本质
译成 机内码(2字节),会自动对数组内的字符翻译成 ASCII码(1字节)。
* 本节程序会做这个实验来验证它。以下两种书写方式不一样,但本质是一样的。
*/
code unsigned char Hz1616_man[]="馒"; //对于数组内的汉字,编译会自动翻译成 机内码(2字节)
code unsigned char JN1616_man[]= //机内码 馒 网上有很多把汉字或者字符转换成相关编码的工具软件
{
0xC2,
0xF8,
};
code unsigned char Hz1616_tou[]="头"; //对于数组内的汉字,编译会自动翻译成 机内码(2字节)
code unsigned char JN1616_tou[]= //机内码 头 网上有很多把汉字或者字符转换成相关编码的工具软件
{
0xCD,
0xB7,
};
code unsigned char Zf816_V[]="V"; //对于数组内的字符,编译会自动翻译成 ASCII码(1字节)
code unsigned char ASCII816_V[]= //ASCII码 V 网上有很多把汉字或者字符转换成相关编码的工具软件
{
0x56,
};
code unsigned char Zf816_5[]="5"; //对于数组内的字符,编译会自动翻译成 ASCII码(1字节)
code unsigned char ASCII816_5[]= //ASCII码 5 网上有很多把汉字或者字符转换成相关编码的工具软件
{
0x35,
};
code unsigned char Zf816_nc[]=" "; //对于数组内的字符,编译会自动翻译成 ASCII码(1字节)
code unsigned char ASCII816_nc[]= //ASCII码 空字符 网上有很多把汉字或者字符转换成相关编码的工具软件
{
0x20,
};
void main()
{
LCDInit(); //初始化12864 内部包含液晶模块的复位
/* 注释三:
* 12864的控制芯片st7920内部有两套驱动显示指令方式,一种是前面章节讲的自构字库模式,也是图像模式。
* 另外一种就是本节讲的用内部字库模式。以下是切换模式的命令,命令字0x0c表示用内部字库模式。
* 命令字0x36表示用自构字库模式。
*/
WriteCommand(0x0C); //命令字0x0c表示用内部字库模式。命令字0x36表示用自构字库模式。
display_clear(); // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。
display_hz1616(0,0,Hz1616_man); //第一行,调用直接汉字书写方式的数组来显示(馒头V5),
display_hz1616(1,0,Hz1616_tou);
display_double_zf816(2,0,Zf816_V,Zf816_5);
display_hz1616(0,3,JN1616_man); //第四行,调用机内码和ASCII码的数组来显示(馒头V5),
display_hz1616(1,3,JN1616_tou);
display_double_zf816(2,3,ASCII816_V,Zf816_5);
while(1)
{
;
}
}
/* 注释四:在一个坐标点显示1个内部字库汉字的函数
* 第1,2个参数x,y是坐标体系。x的范围是0至8,y的范围是0至3.
* 第3个参数*ucArray是汉字机内码,是有2个字节的数组。
*/
void display_hz1616(unsigned int x,unsigned int y,const unsigned char *ucArray)
{
WriteCommand(0x30); //基本指令集
WriteCommand(ucAddrTable[8*y+x]); //起始位置
LCDWriteData(ucArray[0]);
LCDWriteData(ucArray[1]);
}
/* 注释五:在一个坐标点显示2个内部字库字符的函数
* 注意,由于一个坐标点是16x16点阵,而一个字符是8x16点阵的,所以务必要显示2个字符筹够1个坐标点。
* 第1,2个参数x,y是坐标体系。x的范围是0至8,y的范围是0至3.
* 第3个参数*ucArray1是左边第1个字符ASCII码,是有1个字节的数组。
* 第4个参数*ucArray2是右边第2个字符ASCII码,是有1个字节的数组。
*/
void display_double_zf816(unsigned int x,unsigned int y,const unsigned char *ucArray1,const unsigned char *ucArray2)
{
WriteCommand(0x30); //基本指令集
WriteCommand(ucAddrTable[8*y+x]); //起始位置
LCDWriteData(ucArray1[0]);
LCDWriteData(ucArray2[0]);
}
void display_clear(void) // 清屏。4行8列的坐标点全部显示2个空字符相当于清屏了。
{
unsigned int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
display_double_zf816(j,i,Zf816_nc,ASCII816_nc); //Zf816_nc与ASCII816_nc本质是一样的,只是书写方式不一样。
}
}
}
void SendByteToLcd(unsigned char ucData) //发送一个字节数据到液晶模块
{
unsigned char i;
for ( i = 0; i < 8; i++ )
{
if ( (ucData < i) & 0x80 )
{
LCDSID_dr = 1;
}
else
{
LCDSID_dr = 0;
}
LCDCLK_dr = 0;
LCDCLK_dr = 1;
}
}
void SPIWrite(unsigned char ucWData, unsigned char ucWRS) //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
{
SendByteToLcd( 0xf8 + (ucWRS < 1) );
SendByteToLcd( ucWData & 0xf0 );
SendByteToLcd( (ucWData < 4) & 0xf0);
}
void WriteCommand(unsigned char ucCommand) //发送一个字节的命令给液晶模块
{
LCDCS_dr = 0;
LCDCS_dr = 1;
SPIWrite(ucCommand, 0);
delay_short(90);
}
void
液晶屏内部字库坐标体 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)