超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库.doc_第1页
超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库.doc_第2页
超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库.doc_第3页
超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库.doc_第4页
超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

风骚的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库LCD1602写字库在文档后面。LCD1602演示程序(很多函数哦)控制芯片为HD44780 函数都是经过测试的,实物显示都通过了,呵呵,请大家放心使用_呵呵,支持四线数据接口模式,可以任意切换编程,只须改模式选择Port_Type_Select就可以咯!很方便的。 并且我说一下我的个人体会,希望大家在写程序的时候,最好考虑一下程序的可移植性,而且要方便更改参数和硬件资源的选择,最好使用条件编译,任意切换硬件资源,可以方便以后更改参数,就会省去以后不少的不必要的麻烦和错误以及宝贵的时间!里面有标准测试,如果您觉得好的话,请您帮忙顶一下,希望有更多的朋友能知道的更多,更好,学习得更快_一起努力加油,写出更好的功能函数。先简单介绍一下功能函数吧:/*-*/ /模式选择(条件编译)#define Port_Type_Select1/=1, 选择八位数据模式/=0, 选择四位数据模式, LCD高四位接MCU端口高四位/*-*/ /函数声明void LCD_busy (void);/检测LCD是否忙void LCD_init (void);/LCD初始化void LCD_cmd (unsigned char cmd);/写入指令void LCD_dat (unsigned char dat);/写入数据void LCD_pos (unsigned char x, unsigned char y);/显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c);/定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s);/定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num);/定位输出16位二进制数字unsigned char LCD_current_addr(void);/读出AC当前地址(DB6DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void);/读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y);/读出AC指定地址的数据void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat);/指定地址(x: 0-7)写入8bytes数据CGRAM/*-*/光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVELCD_cmd(0x18);/LCD显示左移一位#define LCD_RIGHT_MOVELCD_cmd(0x1c);/LCD显示右移一位#define LCD_CURSOR_LEFT_MOVELCD_cmd(0x10);/光标左移一位#define LCD_CURSOR_RIGHT_MOVELCD_cmd(0x14);/光标右移一位/*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c);/LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08);/LCD关显示#define LCD_CURSOR_ONLCD_cmd(0x0e);/光标显示#define LCD_CURSOR_OFFLCD_cmd(0x0c);/光标不显示#define LCD_CURSOR_BLINK_ONLCD_cmd(0x0f);/光标闪烁#define LCD_CURSOR_BLINK_OFFLCD_cmd(0x0e);/光标不闪烁#define LCD_GO_HOMELCD_cmd(0x02);/AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLRLCD_cmd(0x01);/LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINELCD_cmd(0x38);/两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINELCD_cmd(0x30);/单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINELCD_cmd(0x28);/两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINELCD_cmd(0x20);/单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENTLCD_cmd(0x06);/数据读、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASELCD_cmd(0x04);/数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLELCD_cmd(0x07);/数据读、写操作,画面平移#define LCD_MOVE_DISENABLELCD_cmd(0x06);/数据读、写操作,画面不动以下是液晶驱动头文件:/*-*/File:LCD1602_8A.H/Time:20:10/Modi:09-5-17/*-*/ /防止被重复定义#ifndef _LCD1602_8A_H_#define _LCD1602_8A_H_/*-*/ /模式选择(条件编译)#define Port_Type_Select1/=1, 选择八位数据模式/=0, 选择四位数据模式, LCD高四位接MCU端口高四位#define Int_Transfer1/=1, 允许中断服务函数调用/=0, 不允许中断服务函数调用/*-*/ /LCD1602与单片机接口定义sfrLCD_IO = 0x80;/P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;sbitLCD_RS = P20;/LCD数据/命令选择端(H/L)sbitLCD_RW = P21;/LCD 读/写 选择端(H/L)sbitLCD_EN = P22;/LCD使能控制端/*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINELCD_cmd(0x38);/两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINELCD_cmd(0x30);/单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINELCD_cmd(0x28);/两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINELCD_cmd(0x20);/单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENTLCD_cmd(0x06);/数据读、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASELCD_cmd(0x04);/数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLELCD_cmd(0x07);/数据读、写操作,画面平移#define LCD_MOVE_DISENABLELCD_cmd(0x06);/数据读、写操作,画面不动/*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c);/LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08);/LCD关显示#define LCD_CURSOR_ONLCD_cmd(0x0e);/光标显示#define LCD_CURSOR_OFFLCD_cmd(0x0c);/光标不显示#define LCD_CURSOR_BLINK_ONLCD_cmd(0x0f);/光标闪烁#define LCD_CURSOR_BLINK_OFFLCD_cmd(0x0e);/光标不闪烁#define LCD_GO_HOMELCD_cmd(0x02);/AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLRLCD_cmd(0x01);/LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*-*/光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVELCD_cmd(0x18);/LCD显示左移一位#define LCD_RIGHT_MOVELCD_cmd(0x1c);/LCD显示右移一位#define LCD_CURSOR_LEFT_MOVELCD_cmd(0x10);/光标左移一位#define LCD_CURSOR_RIGHT_MOVELCD_cmd(0x14);/光标右移一位/*-*/LCD1602地址相关/*#define LINE1_HEAD0x80/第一行DDRAM起始地址#define LINE2_HEAD0xc0/第二行DDRAM起始地址#define LINE10/第一行#define LINE21/第二行#define LINE_LENGTH16/每行的最大字符长度(40-DDRAM)/*-*/ /函数声明void LCD_busy (void);/检测LCD是否忙void LCD_init (void);/LCD初始化void LCD_cmd (unsigned char cmd);/写入指令void LCD_dat (unsigned char dat);/写入数据void LCD_pos (unsigned char x, unsigned char y);/显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c);/定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s);/定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num);/定位输出16位二进制数字unsigned char LCD_current_addr(void);/读出AC当前地址(DB6DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void);/读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y);/读出AC指定地址的数据void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat);/指定地址(x: 0-7)写入8bytes数据CGRAM/*-*/ /读出AC当前地址(DB6DB0)或忙标志位DB7#if Port_Type_Select/选择八位数据模式unsigned char LCD_current_addr(void)unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0;/指令LCD_RW = 1;/读出LCD_IO = 0xff;/端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO;LCD_EN = 0;return (ac_addr);#else/选择四位数据模式unsigned char LCD_current_addr(void)unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0;/指令LCD_RW = 1;/读出LCD_IO |= 0xf0;/端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO & 0xf0;/高四位LCD_EN = 0;LCD_EN = 1;ac_addr |= LCD_IO 4;/低四位LCD_EN = 0;return (ac_addr);#endif/*-*/ /检测LCD忙状态#if Int_Transfer/允许中断服务函数调用void LCD_busy(void)unsigned char ac_dat;unsigned char busy_flag;doac_dat = LCD_current_addr();busy_flag = ac_dat & 0x80;while(busy_flag);/=1表示忙, =0表示空闲#else/不允许中断服务函数调用void LCD_busy(void)unsigned char ac_dat;bit busy_flag;doac_dat = LCD_current_addr();busy_flag = (bit)(ac_dat & 0x80);while(busy_flag);/=1表示忙, =0表示空闲#endif/*-*/ /读出AC当前地址的数据#if Port_Type_Select/选择八位数据模式unsigned char LCD_current_addr_dat(void)unsigned char addr_dat;/unsigned char i;LCD_busy();/或者检查忙最可靠/for(i = 0; i 3; i+)/要连续读出三次才会有效LCD_EN = 0;LCD_RS = 1;/数据LCD_RW = 1;/读出LCD_IO = 0xff;/端口置为输入方式(P0)LCD_EN = 1;addr_dat = LCD_IO;LCD_EN = 0;return (addr_dat);#else/选择四位数据模式unsigned char LCD_current_addr_dat(void)unsigned char addr_dat;/unsigned char i;LCD_busy();/或者检查忙最可靠/for(i = 0; i 4;/低四位LCD_EN = 0;return (addr_dat);#endif/*-*/ /写入指令#if Port_Type_Select/选择八位数据模式void LCD_cmd(unsigned char cmd)LCD_busy();/检测忙LCD_RS = 0;/指令LCD_RW = 0;/写入LCD_EN = 1;LCD_IO = cmd;/传指令LCD_EN = 0;/下降沿有效#else/选择四位数据模式void LCD_cmd(unsigned char cmd)LCD_busy();/检测忙LCD_IO &= 0x0f;/清高四位LCD_RS = 0;/指令LCD_RW = 0;/写入LCD_EN = 1;LCD_IO |= cmd & 0xf0;/写高四位LCD_EN = 0;/下降沿有效cmd = 4;/低四位移到高四位LCD_IO &= 0x0f;/清高四位LCD_EN = 1;LCD_IO |= cmd & 0xf0;/写高四位LCD_EN = 0;/下降沿有效#endif/*-*/ /写入数据#if Port_Type_Select/选择八位数据模式void LCD_dat(unsigned char dat)LCD_busy();/检测忙LCD_RS = 1;/数据LCD_RW = 0;/写入LCD_EN = 1;LCD_IO = dat;/传数据LCD_EN = 0;/下降沿有效#else/选择四位数据模式void LCD_dat(unsigned char dat)LCD_busy();/检测忙LCD_IO &= 0x0f;/清高四位LCD_RS = 1;/数据LCD_RW = 0;/写入LCD_EN = 1;LCD_IO |= dat & 0xf0;/写高四位LCD_EN = 0;/下降沿有效dat = 4;/低四位移到高四位LCD_IO &= 0x0f;/清高四位LCD_EN = 1;LCD_IO |= dat & 0xf0;/写高四位LCD_EN = 0;/下降沿有效#endif/*-*/ /显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y)if(y)LCD_cmd(x|0xc0);/y=1第二行显示,y=0第一行显示0=x16(40-DDRAM)elseLCD_cmd(x|0x80);/数据指针=80+地址码(00H27H,40H67H)/*-*/ /指定地址(x: 0-7)写入8bytes数据CGRAMvoid LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat)unsigned char i;x = 3;/转化为6位数据的高三位x |= 0x40;LCD_cmd(x);/写入地址for(i = 0; i 8; i+)LCD_dat(CGRAM_dati);/写入数据/*-*/ /读出AC指定地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y)unsigned char addr_dat;LCD_pos(x, y);/定位addr_dat = LCD_current_addr_dat();/读出数据return (addr_dat);/*-*/ /定位输出字符void LCD_printc(unsigned char x, unsigned char y, unsigned char c)LCD_pos(x, y);LCD_dat(c);/*-*/ /定位输出字符串void LCD_prints(unsigned char x, unsigned char y, unsigned char *s)LCD_pos(x, y);while(*s)LCD_dat(*s);s+;/*-*/ /定位输出16位二进制数字/ 0= num 65536void LCD_printn(unsigned char x, unsigned char y, unsigned int num)char i;unsigned char ii;unsigned char dat6;for(i = 0; i = 0; i-)dati += 48;/转化成ASCIILCD_prints(x, y, );/清显示区域LCD_pos(x, y);for(i = ii; i = 0; i-) LCD_dat(dati);/输出数字字符/*-*/ /LCD初始化void LCD_init(void)#if Port_Type_Select/选择八位数据模式LCD_DISPLAY8_DOUBLE_LINE/设置LCD为16X2显示,5X7点阵,八位数据接口#elseLCD_DISPLAY4_DOUBLE_LINE/设置LCD为16X2显示,5X7点阵,四位数据接口#endifLCD_AC_AUTO_INCREMENT/LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)LCD_DISPLAY_ON/LCD开显示及光标设置(光标不闪烁,不显示_)LCD_CLR/清屏/*-*/ 原创 液晶1602 显示汉字研究液晶, 汉字, 研究1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。1602可以显示内部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。一、显示常用字符。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”十进制 十六进制 ASCII字符 十进制 十六进制 ASCII字符 十进制 十六进制 ASCII字符 00 00 自定义字符1 56 38 8 96 60 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63 c 04 04 自定义字符5 60 3C 102 66 f 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格 72 48 H 112 70 p 33 21 ! 73 49 I 113 71 q 34 22 74 4A J 114 72 r 35 23 # 75 4B K 115 73 s 36 24 $ 76 4C L 116 74 t 37 25 % 77 4D M 117 75 u 38 26 & 78 4E N 118 76 v 39 27 79 4F O 119 77 w 40 28 ( 80 50 P 120 78 x 41 29 ) 81 51 Q 121 79 y 42 2A * 82 52 R 122 7A z 43 2B + 83 53 S 123 7B 44 2C , 84 54 T 124 7C | 45 2D - 85 55 U 125 7D 46 2E . 86 56 V 126 7E 47 2F / 87 57 W 48 30 0 88 58 X 49 31 1 89 59 Y 50 32 2 90 5A Z 51 33 3 91 5B 52 34 4 92 5C 53 35 5 93 5D 54 36 6 94 5E 55 37 7 95 5F _ 显示操作的过程:首先确认显示的位置,即在第几行,第几个字符开始显示。也就是要显示的地址,如下表所示的显示地址。第一行的显示地址是0x800x8F,第二行的显示地址是0xC00xCF。例如想要在第2行,第3个位置显示一个字符,那么地址码就是 0xC2。在编程过程中,通常编写一个函数确定在某行某个位置显示数据。函数需要 行参数(y),和 列参数(x)来确定显示位置。程序参考如下/*设置显示位置*/ void LCD_set_xy( unsigned char x, unsigned char y ) unsigned char address; if (0 = y) x |= 0x80; /当要显示第一行时地址码+0x80; else x |= 0xC0; /在第二行显示是地址码+0xC0; Write_com(x); /发送地址码 0x80-0x8F 或者0xC00xCF 以上地址码,在显示过程中,可以直接应用,至于地址码的计算原理,如果想要研究,请参考其它资料,这里不做描述。其次设置要显示的内容,即上面提到的CGROM内的字符编码。如显示“A”,将编码41H写入到液晶屏显示即可。通常设置地址和显示内容用一个函数来完成。代码参考如下:/功能:按指定位置显示一个字符/输入:列显示地址x(取值范围0-15) 行显示地址y(取值范围0-1), 指定字符void DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data) if (0 = y) x |= 0x80; /当要显示第一行时地址码+0x80; else x |= 0xC0; /在第二行显示是地址码+0xC0; Write_com(x); /发送地址码 Write_dat(Data); /发送要显示的字符编码显示字符“A”调用过程如下代码:DisplayOneChar(0,0,0x41);/功能:在第1行 第1个字符 显示一个大写字母A在C语言操作时,还可以显示整个字符串。定义一个字符串显示函数,可以通过直接输入字符方式进行显示/功能:按指定位置显示一串字符/输入:列显示地址x(取值范围0-15) 行显示地址y(取值范围0-1), 指定字符串指针*p,要显示的字符个数count (取值范围1-16)void Disp_1602(unsigned char x,unsigned char y,unsigned char *p,unsigned char count)unsigned char i; for(i=0;icount;i+) if (0 = y) x |= 0x80; /当要显示第一行时地址码+0x80; else x |= 0xC0; /在第二行显示是地址码+0xC0; Write_com(x); /发送地址码 Write_dat(*p); /发送要显示的字符编码 x+; p+; 调用方法如下:DisplayListChar(0,0,hello world,11);/液晶1602第一行显示 DisplayListChar(0,1,,12); /液晶1602第二行显示二、显示自定义字符。 1、首先取得想要的中文或者图形的字模数组。通过字模软件不能直接提取5*8点阵的字模数据,可以通过手动提取的方法。如下图所示,对应一个字符显示区域。每8个字节

温馨提示

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

评论

0/150

提交评论