LCD1602显示中文C程序_第1页
LCD1602显示中文C程序_第2页
LCD1602显示中文C程序_第3页
LCD1602显示中文C程序_第4页
LCD1602显示中文C程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LCD1602显示汉字2009-08-21 11:09LCD1602显示汉字利用 1602 显示汉字也不是新鲜的内容,今天不想颓废了。只是需要自己事先定义一下 汉字的字模,就是显示出来的汉子字体结构。要定义字模就需要知道 1602 的 CG RAM 地址和显示字符的地址 DD RAM 图 1:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1600 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F第一行第一个字符的地址是 ( 0x80)

2、,后面的字符地址以此类推 第二行第一个字符的地址为 ( 0x80 + 0x40) ,需要在第一行的基地址后面加上一个偏移 量 0x40 ,后面的地址在此基址上再依次加一。void delay(unsigned int time_i) int i;for (;tim0;tim-)for (i=0;i10;i+);void command_out (char out_data)RW=0;RS=0;EN=1;DB=out_data;EN=0;delay(10);void OUTD(char out_data)RS=1;RW=0;EN=1;DB= out_data;EN=0;delay(10);OUT

3、I() 是写入指令的函数, OUTD() 是写入数据的函数。如:左上角第一个 5*7 的显示数据为:0x00,0x01,0x81,0x12,0x24,0x41,0x81,0x10蓝色区域的相应位为 1这样就可以写出全部 4个5*7 点阵的显示数据了,把它封装在一个数组中,如数组, hanzi=0x00,0x01,0x81,0x12,0x24,0x41,0x81,0x10,之后利用命令:OUTI(0X40);for (i=0;i64;i+) OUTD(neui);将这个数组中的数据赋值到 1602内部 CGRAM 中。完成后,再设置数据在 1602 上的 显示地址,根据图 1的结构,设置好位置,

4、如在第一行第一个字符和第二个字符以及第二行 第一个字符和第二个字符处显示:Command_out (0x80+0x00); for (i=0;i4;i+) data_out (i); Command_out(0x80+0x40);for (i=4;i=1 吕吕 1=1 鼻 4 1=./硬件连接:1602VDD接5V, VO接地,BL1接5V, BL2接地,8根数据线接 P0 口,RS RW E分别接P2.0、P2.1、P2.4#in elude #i nclude #defi ne Busy 0x80 / #defi ne LCM_Data P0 sbit LCM_RS=P2A0;/sbit

5、LCM_RW=P2A1;/sbit LCM_E=P2A4;/用于检测LCMl犬态字中的Busy标识寄存器选择读/写控制读/写使能int i,j;/ 自定义字符列表/= unsigned char character08 = 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, / 年character18 = 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11, /月character28 = 0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f, /日characterN8 = 0x00,0x00,0x00,0

6、x00,0x00,0x00,0x00,0x00; / 日/= /= / 延时程序/= void Delay5Ms(void)unsigned long int TempCyc = 5552;while(TempCyc-);void Delay400Ms(void)unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA-)TempCycB=7269;while(TempCycB-);/= / 读写子程序/=/ 读数据unsigned char ReadDataLCM(void)LCM_RS = 1;LCM_RW = 1;LC

7、M_E = 1;LCM_E = 0;for(i=0;i100;i+);LCM_E = 1;return(LCM_Data);/ 读状态unsigned char ReadStatusLCM(void)LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 1;LCM_E = 0;for(i=0;i100;i+);LCM_E = 1;/while (LCM_Data & Busy); /检测忙信号return(LCM_Data);/ 写数据void WriteDataLCM(unsigned char WDLCM)ReadStatusLCM(); / 检测忙L

8、CM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 1;LCM_E = 0; / 若晶振速度太高可以在这后加小的延时for(i=0;i100;i+);/ 延时LCM_E = 1;/ 写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) /BuysC 为 0 时忽略忙检测if (BuysC) ReadStatusLCM(); /根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 1;LCM_E = 0;for(i=0;i100;i+);LCM_E = 1

9、;/= / 初始化子程序/=void LCMInit(void) /LCM初始化LCM_Data = 0;WriteCommandLCM(0x38,0); /Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); /Delay5Ms();WriteCommandLCM(0x08,1); /Delay5Ms();WriteCommandLCM(0x01,1); /Delay5Ms();WriteCommandLCM(0x06,1); /Del

10、ay5Ms();WriteCommandLCM(0x0c,1); /Delay5Ms();三次显示模式设置,不检测忙信号显示模式设置 , 开始要求每次检测忙信号 关闭显示清屏显示光标移动设置显示开及光标设置/= / 按指定位置显示一个字符/=void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y &= 0x1;X &= OxF; /限制X不能大于15, 丫不能大于1if (Y) X |= 0x40; / 当要显示第二行时地址码 +0x40;X |= Ox8O; / 算出指令码WriteCommand

11、LCM(X, O); / 这里不检测忙信号,发送地址码WriteDataLCM(DData);/=/ 按指定位置显示一串字符/void DisplayListChar(unsigned char X, unsigned char 丫, unsigned char code *DData)/ 说明: x(O-15):x 参数 y(O-1):y 参数 DData( 字符串): 要显示的内容 (英文、数字、符号 )/= void DisplayListChar(unsigned char X, unsigned char 丫, unsigned char code *DData) unsigned

12、char ListLength,j;ListLength = strlen(DData);Y &= 0x1;X &= OxF; /限制X不能大于15, 丫不能大于1 if (X = 0xF) /X坐标应小于 0xFfor(j=O;jListLength;j+)显示单个字符DisplayOneChar(X, 丫, DDataj); /X+;/=/ 显示自定义字符/void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)/说明:xx(0-15):为x参数.yy(O-1):y 参数.character:要显示

13、的字符的列表地址,在程序前面有定义 saveto(1-7)为字符保存的RAM每屏最多显示7个自定义字符/(0x00-0x0h 是自定义字符 )/= void mychar(char xx,char yy,unsigned char *character,unsigned char saveto) unsigned char add = (saveto3) | 0x40;unsigned char t; /临时变量,每一行的值/*t=*(character+0);WriteCommandLCM(add, 0);/第1行WriteDataLCM(t);t=*(character+1);WriteC

14、ommandLCM(add+1, 0);/第2行WriteDataLCM(t);t=*(character+2);WriteCommandLCM(add+2, 0);/第3行WriteDataLCM(t);t=*(character+3);WriteCommandLCM(add+3, 0);/第4行WriteDataLCM(t);t=*(character+4);WriteCommandLCM(add+4, 0);/第5行WriteDataLCM(t);t=*(character+5);WriteCommandLCM(add+5, 0);/第6行WriteDataLCM(t);t=*(char

15、acter+6);WriteCommandLCM(add+6, 0); / 第 7 行WriteDataLCM(t);t=*(character+7);WriteCommandLCM(add+7, 0); / 第 8 行WriteDataLCM(t);*/for(i = 0;i8;i+)WriteCommandLCM(add+i, 0);WriteDataLCM(*(character+i);DisplayOneChar(xx,yy,saveto); / 显示字符/= / 主函数/=main()Delay400Ms();LCMInit();Delay400Ms(); /1602 初始化while(1)DisplayListChar(0,0,This is ListChar);DisplayListChar(0,1,!);for(j=0;j30;j+)for(i=0;i30000;i+);WriteCommandLCM(0x01,1); / 清屏Delay5Ms();DisplayListChar(0,0,This is OneChar:);DisplayOneChar(0,1,0x4f);DisplayOneChar(1,1,0x6e);DisplayOneChar(2,1,0x65);DisplayOneChar(3,1,0x21);for(j=0;j30;j+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论