开场白:
前面章节讲的内容悉数都是用自构字库的,相当于运用液晶屏的图画形式。其实这个款12864液晶屏的驱动芯片是st7920,它内部是自带16×16字库的,能够显现16×16的汉字或许8×16的字符。这一节开端就跟咱们讲讲这方面的内容。要教会咱们四个知识点:
榜首个:内部字库的实在坐标系统的实质。当咱们用内部字库的时分,它的坐标系统跟前面讲的自造字库坐标不相同,不再是256×32的液晶屏。它还原成为128×64的液晶屏,横坐标x轴坐标没办法准确到每个点,只能以16个点(2个字节)为一个单位,因而128个点的x轴坐标规模是0至8。而y轴的坐标也是以16个点(2个字节)为一个单位,因而64个点的x轴坐标规模是0至3。把12864液晶屏分红4行8列,每个数代表一个坐标点。
第二个:在运用内部字库时,C51编译器暗地里干了啥?假如运用液晶屏内部自带字库,编程的时分只要在源代码里直接写入所需求的汉字或许字符,就能够主动调用相对应的字库了。可是仔细的网友一定会问,为什么在源代码上直接写入某个汉字就能够调用到这个汉字的字库?其实,表面上咱们写下详细的某个汉字或许字符,可是C51编译器会主动对数组内的汉字翻译成 机内码(2字节),会主动对数组内的字符翻译成 ASCII码(1字节)。
第三个:12864的操控芯片st7920内部有两套驱动显现指令方法,一种是前面章节讲的自构字库形式,也是图画形式。别的一种便是本节讲的用内部字库形式。在切换形式的时分,发送指令字0x0c表明用内部字库形式,发送指令字0x36表明用自构字库形式。
第四个:12864整屏有4行8列,总共32个坐标点,每个坐标点能够显现一个16×16的汉字,可是在显现8×16字符时分,有必要一次显现2个字符筹够16×16的点阵。例如,只想到达显现一个字符的时分,应该在别的一个空方位上显现空字符来填充。
详细内容,请看源代码解说。
(1)硬件渠道:根据朱兆祺51单片机学习板。
(2)完成功用:
开机上电后,液晶屏榜首行调用直接汉字书写方法的数组来显现(馒头V5)的内容。第四行调用机内码和ASCII码的数组来显现(馒头V5)的内容。
(3)源代码解说如下:
#include “REG52.H”
sbit LCDCS_dr = P1^6; //片选线
sbit LCDSID_dr = P1^7; //串行数据线
sbit LCDCLK_dr = P3^2; //串行时钟线
sbit LCDRST_dr = P3^4; //复位线
void SendByteToLcd(unsigned char ucData); //发送一个字节数据到液晶模块
void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模仿SPI发送一个字节的指令或许数据给液晶模块的底层驱动
void WriteCommand(unsigned char ucCommand); //发送一个字节的指令给液晶模块
void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块
void LCDInit(void); //初始化 函数内部包括液晶模块的复位
void display_clear(void); // 清屏。4行8列的坐标点悉数显现2个空字符相当于清屏了。
void display_hz1616(unsigned int x,unsigned int y,const unsigned char *ucArray);
void display_double_zf816(unsigned int x,unsigned int y,const unsigned char *ucArray1,const unsigned char *ucArray2);
void delay_short(unsigned int uiDelayshort); //延时
/* 注释一:内部字库的实在坐标系统的实质。
* 当咱们用内部字库的时分,它的坐标系统跟前面讲的自造字库坐标不相同,不再是256×32的液晶屏。
* 它还原成为128×64的液晶屏,横坐标x轴坐标没办法准确到每个点,只能以16个点(2个字节)为一个单位,
* 因而128个点的x轴坐标规模是0至8。而y轴的坐标也是以16个点(2个字节)为一个单位,因而64个点的x轴
* 坐标规模是0至3。以下是坐标地址的方位编码。把12864液晶屏分红4行8列,每个数代表一个坐标点,
* 用深究详细意义,液晶驱动芯片ST7920的手册上有说到。
*/
code unsigned char ucAddrTable[]= //调用内部字库时,液晶屏的坐标系统,方位编码,是驱动内容,读者能够不必深究它的意义。
{
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
/* 注释二:在运用内部字库时,C51编译器暗地里干了啥?
* 假如运用液晶屏内部自带字库,以下编程的时分只要在源代码里直接写入所需求的汉字或许字符,
* 就能够主动调用相对应的字库了。可是仔细的网友一定会问,为什么在源代码上直接写入某个汉字
* 就能够调用到这个汉字的字库?其实,表面上咱们写下详细的某个汉字或许字符,可是C51编译器
* 会主动对数组内的汉字翻译成 机内码(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个内部字库字符的函数
* 留意,因为一个坐标点是16×16点阵,而一个字符是8×16点阵的,所以务必要显现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 LCDWriteData(unsigned char ucData) //发送一个字节的数据给液晶模块
{
LCDCS_dr = 0;
LCDCS_dr = 1;
SPIWrite(ucData, 1);
}
void LCDInit(void) //初始化 函数内部包括液晶模块的复位
{
LCDRST_dr = 1; //复位
LCDRST_dr = 0;
LCDRST_dr = 1;
}
void delay_short(unsigned int uiDelayShort) //延时函数
{
unsigned int i;
for(i=0;i
{
;
}
}
总结陈词:
经过本节的试验,咱们发现汉字的辨认实质是机内码,字符的辨认实质是ASCII码。不管是机内码仍是ASCII码,这些都是16进制的数字,也便是咱们手机平常接纳和发送的信息实质都是这些数字编码,可是机内码是2个字节,ASCII码是1个字节,假如在一串随机的信息中,一起包括汉字和字符两种数字信息,咱们的程序又该如何能挑选和辨认它们,会不会把机内码和ASCII码搞紊乱了?不会的。其实这两种编码都是有规则能够挑选辨认的,欲知概况,请听下回分解—–液晶屏显现串口发送过来的恣意汉字和字符。