带中文字库的128X-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或个ASCII码字符的显示。带中文字库的128X-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示RAM地址与32个字符显示区域有着一一对应的关系。
设计内容:在128液晶上显示字符、动画
实验程序:
#include sbit RS = P2^0; //定义管脚 sbit RW = P2^1; sbit E = P2^2; sbit RES = P2^6; #define Lcd_Bus P1 //MCU P1<------> LCM #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 unsigned char code zk[]={ 0x08,0x20,0x1c,0x10,0x1c,0x1c,0xff,0x9e,0x7f,0x1e,0x1c,0x1f,0x3e,0x1f,0x3e,0x1f,0x77,0x1f,0x41,0x3f,0x00,0x7e,0x00,0xfe,0x83,0xfc,0x7f,0xf8,0x3f,0xf0,0x0f,0xc0 }; /*------------------检查忙位-----------------------------*/ void chk_busy() { RS=0; RW=1; E=1; Lcd_Bus=0xff; while((Lcd_Bus&0x80)==0x80); E=0; } /*------------------延时子程序-----------------------------*/ void delay(unsigned int t) { unsigned int i,j; for(i=0;i /*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata) { chk_busy(); } 2 RS=0; RW=0; E=1; Lcd_Bus=cmdcode; delay(5); //在数据写入的时候加入适当的延时 E=0; delay(5); RS=1; RW=0; E=1; Lcd_Bus=Dispdata; delay(5);///////////////////在数据写入的时候加入适当的延时 E=0; delay(5); /*------------------初始化LCD屏--------------------------*/ void lcdreset() { delay(2000); write_com(0x30); delay(10); //选择基本指令集 write_com(0x30); //选择8bit数据流 delay(5); write_com(0x0c); //开显示 delay(10); write_com(0x01); //清除显示,并且设定地址指针为00H delay(500); write_com(0x06); //读取及写入时,设定游标的移动方向及指定显示的移位 delay(0); } /*------------------自定义一个字符代码--------------------------*/ void CGRAM() { int i; write_com(0x30); write_com(0x40); for(i=0;i<16;i++) {write_data(zk[i*2]); write_data(zk[i*2+1]);} } /*------------------显示字符串--------------------------*/ void hzkdis(unsigned char code *s) { while(*s>0) { write_data(*s); s++; delay(50);} } 3 /*------------------首屏显示--------------------------*/ void ceshi() {write_com(0x01); //清除显示,并且设定地址指针为00H delay(5); write_com(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示) hzkdis(\" LCD液晶显示\"); delay(10000); write_com(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示) hzkdis(\" 测试程序 \"); delay(10000); write_com(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示) hzkdis(\" B09090315 \"); delay(10000); write_com(0x9A);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示) hzkdis(\" 高凡\"); } /*------------------显示图片------------------------*/ void Disp_Img(unsigned char code *img) { unsigned int j=0; unsigned char x,y,i; for(i=0;i<9;i+=8) for(y=0;y<32;y++)// for(x=0;x<8;x++) { write_com(0x36); //功能设置---8BIT控制界面,扩充指令集 write_com(y+0x80); //行地址 write_com(x+0x80+i); //列地址 write_com(0x30); write_data(img[j++]); write_data(img[j++]); } } 4 /*------------------清整个GDRAM空间----------------------------*/ void clrgdram() { unsigned char x,y; for(y=0;y<;y++) for(x=0;x<16;x++) { write_com(0x34); write_com(y+0x80); //行地址 write_com(x+0x80); //列地址 write_com(0x30); write_data(0x00); write_data(0x00); } } /*------------------清屏命令--------------------------*/ void clrscreen() { write_com(0x01); delay(10); } /*------------------古诗(宋)王观--------------------------*/ void gushi_display() { write_com(0x30); clrscreen(); write_com(0x80+FIRST_ADDR); hzkdis(\" 水是眼波横\");delay(10000); write_com(0x90+FIRST_ADDR); hzkdis(\" 山是眉峰聚\");delay(10000); write_com(0x88+FIRST_ADDR); hzkdis(\"欲问行人去那边\");delay(10000); write_com(0x98+FIRST_ADDR); hzkdis(\" 眉眼盈盈处\"); } 5 //主程序 main() { unsigned char i; while(1) { RW=0; lcdreset(); //初始化LCD屏 CGRAM(); ceshi(); delay(200); // clrgdram();clrscreen(); // Disp_Img(BMP); // gushi_display(); // clrgdram(); write_com(0x87); // write_data(0x00); write_data(0x00); gushi_display01(); delay(6000); for(i=0;i<8;i++) // {write_com(0x18); delay(2000);} write_com(0x03); // write_com(0x60); delay(6000); } } 实验结果: 显示测试字样 清屏 调入一幅图画 显示宋词 调用自定义的CGRAM的代码 字符循环左移 垂直滚动屏幕的内容 6 初始化测试程序 动画显示 逐行显示宋词 反白显示 实验小结: 这次课程设计根据课题要求,第一次学习单片机内容,通过查询相关的资料,简要的了解一下。上学期老师上课讲过危机原理相关内容,对这次实验有很大的帮助。根据课程设计的要求和自己通过参考有关资料拟的方案,写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序,达到能够实现所要求的功能的目的。这次的单片机课程设计重点是理论与实际的相结合,不单单只是一条条分离的指令。通过这次设计让我更系统的了解了各个指令以及单片机的扩展内容,。 学习任何知识,仅从理论上去求知,而不去实践、探索是不够的,所以在学期末单片机课程设计是很及时、很必要的。这样不仅能加深我们对单片机的更深理解,而且还及时、真正的做到了学以致用。通过实践,我领悟到了很多以前不知道的东西,可以说是受益匪浅。虽然时间不是很长,但是还是有不少长进,这不仅是局限在程序设计的功能实现上,更多的是对程序设计的技巧的追求上。 7 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务