




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 风骚的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库LCD1602写字库在文档后面。LCD1602演示程序(很多函数哦)控制芯片为HD44780 函数都是经过测试的,实物显示都通过了,呵呵,请大家放心使用_呵呵,支持四线数据接口模式,可以任意切换编程,只须改模式选择Port_Type_Select就可以咯!很方便的。 并且我说一下我的个人体会,希望大家在写程序的时候,最好考虑一下程序的可移植性,而且要方便更改参数和硬件资源的选择,最好使用条件编译,任意切换硬件资源,可以方便以后更改参数,就会省去以后不少的不必要的麻烦和错
2、误以及宝贵的时间!里面有标准测试,如果您觉得好的话,请您帮忙顶一下,希望有更多的朋友能知道的更多,更好,学习得更快_一起努力加油,写出更好的功能函数。先简单介绍一下功能函数吧:/*-*/ /模式选择(条件编译)#define Port_Type_Select 1 /=1, 选择八位数据模式 /=0, 选择四位数据模式, LCD高四位接MCU端口高四位/*-*/ /函数声明void LCD_busy (void);
3、; /检测LCD是否忙void LCD_init (void); /LCD初始化void LCD_cmd (unsigned char cmd); /写入指令void LCD_dat
4、160; (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(unsigne
5、d 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(voi
6、d); /读出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_LE
7、FT_MOVE LCD_cmd(0x18); /LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); /LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); /光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); /光标右移一位/*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON
8、; LCD_cmd(0x0c); /LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); /LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); /光标显示#define LCD_CURSOR_OFF LCD_cmd(0x0c); /光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); /光标闪烁#define L
9、CD_CURSOR_BLINK_OFF LCD_cmd(0x0e); /光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); /AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); /LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0
10、x38); /两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); /单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); /两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); /单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); /数据读、
11、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); /数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE LCD_cmd(0x07); /数据读、写操作,画面平移#define LCD_MOVE_DISENABLE LCD_cmd(0x06); /数据读、写操作,画面不动 以下是液晶驱动头文件:/*-*/File: LCD1602_8A.H/Time: 20:10/Modi:
12、0;09-5-17/*-*/ /防止被重复定义#ifndef _LCD1602_8A_H_ #define _LCD1602_8A_H_/*-*/ /模式选择(条件编译)#define Port_Type_Select 1 /=1, 选择八位数据模式 /=0, 选择四位数据模式, LCD高四位接MCU端口高四位#define Int_Transfer 1 /=1, 允许中断服务函数调用
13、0; /=0, 不允许中断服务函数调用/*-*/ /LCD1602与单片机接口定义sfr LCD_IO = 0x80; /P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;sbit LCD_RS = P20; /LCD数据/命令选择端(H/L)sbit LCD_RW = P21; /LCD 读/写 选择端(H/L)sbit
14、LCD_EN = P22; /LCD使能控制端 /*-*/工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); /两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); /单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); /两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE
15、0;LCD_cmd(0x20); /单行显示4-bits/*-*/输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); /数据读、写操作后,AC自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); /数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE LCD_cmd(0x07); /数据读、写操作,画面平移#define LCD_MOVE_DISENABLE L
16、CD_cmd(0x06); /数据读、写操作,画面不动 /*-*/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c); /LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); /LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); /光标显示#define LCD_CURSOR_OFF LCD_cmd(0
17、x0c); /光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); /光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); /光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); /AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); /LC
18、D清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位? /*-*/光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE LCD_cmd(0x18); /LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); /LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); /光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cm
19、d(0x14); /光标右移一位 /*-*/LCD1602地址相关/*#define LINE1_HEAD 0x80 /第一行DDRAM起始地址#define LINE2_HEAD 0xc0 /第二行DDRAM起始地址#define LINE1 0 /第一行#define LINE2 1 /第二行#define LINE_LENGTH
20、0;16 /每行的最大字符长度(40-DDRAM) /*-*/ /函数声明void LCD_busy (void); /检测LCD是否忙void LCD_init (void); /LCD初始化void LCD_cmd
21、60; (unsigned char cmd); /写入指令void LCD_dat (unsigned char dat); /写入数据void LCD_pos (unsigned char x, unsigned char y);
22、;/显示定位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);
23、160; /读出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
24、, 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;
25、/读出 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;
26、/指令 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);#en
27、dif/*-*/ /检测LCD忙状态#if Int_Transfer /允许中断服务函数调用 void LCD_busy(void) unsigned char ac_dat; unsigned char busy_flag; do ac_dat = LCD_current_addr(); busy_flag = ac_dat & 0x80; while(busy_flag); /=1表示忙, =0表示空闲#els
28、e /不允许中断服务函数调用void LCD_busy(void) unsigned char ac_dat; bit busy_flag; do ac_dat = LCD_current_addr(); busy_flag = (bit)(ac_dat & 0x80); while(busy_flag); /=1表示忙, =0表示空闲#endif/*-*/ /读出AC当前地址的数据#if Port_
29、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; /数据
30、0; 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) unsigne
31、d char addr_dat;/ unsigned char i; LCD_busy(); /或者检查忙最可靠/ for(i = 0; i < 3; i+) /要连续读出三次才会有效 LCD_EN = 0; LCD_RS = 1; /数据 LCD_RW = 1;
32、/读出 LCD_IO |= 0xf0; /端口置为输入方式(P0) LCD_EN = 1; addr_dat = LCD_IO & 0xf0; /高四位 LCD_EN = 0; LCD_EN = 1; addr_dat |= LCD_IO >> 4; /低四位 LCD_EN = 0; return (addr_dat);#endif/*
33、-*/ /写入指令#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;
34、; /下降沿有效#else /选择四位数据模式void LCD_cmd(unsigned char cmd) LCD_busy(); /检测忙 LCD_IO &= 0x0f; /清高四位 LCD_RS = 0; /指令 LCD_RW = 0; /写入 LCD_EN = 1;
35、160;LCD_IO |= cmd & 0xf0; /写高四位 LCD_EN = 0; /下降沿有效 cmd <<= 4; /低四位移到高四位 LCD_IO &= 0x0f; /清高四位 LCD_EN = 1; LCD_IO |= cmd & 0xf0; /写高四位 LCD_EN = 0; /下降沿有效#end
36、if/*-*/ /写入数据#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; &
37、#160; /下降沿有效#else /选择四位数据模式void LCD_dat(unsigned char dat) LCD_busy(); /检测忙 LCD_IO &= 0x0f; /清高四位 LCD_RS = 1; /数据 LCD_RW = 0; /写入 LCD_EN =
38、1; LCD_IO |= dat & 0xf0; /写高四位 LCD_EN = 0; /下降沿有效 dat <<= 4; /低四位移到高四位 LCD_IO &= 0x0f; /清高四位 LCD_EN = 1; LCD_IO |= dat & 0xf0; /写高四位 LCD_EN = 0; /下降沿有效
39、#endif/*-*/ /显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y) if(y) LCD_cmd(x|0xc0);/y=1第二行显示,y=0第一行显示 0<=x<16(40-DDRAM) else LCD_cmd(x|0x80);/数据指针=80+地址码(00H27H,40H67H)/*-*/ /指定地址(x: 0-7)写入8bytes数据CGRAMvoid LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat)&
40、#160;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
41、 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);/*-*/ /
42、定位输出字符串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
43、 ii; unsigned char dat6; for(i = 0; i < 6; i+) dati = 0; i = 0; /初始化数据 while(num / 10) /拆位 dati = num % 10; /最低位 num /= 10; i+; dati = num;
44、; /最高位 ii = i; /保存dat的位数 for(; i >= 0; i-) dati += 48; /转化成ASCII LCD_prints(x, y, " "); /清显示区域
45、60;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点阵,八位数据接口#else LCD_DISPLAY4_DOUBLE_LINE /设置LCD为16X2显示,5X7点阵,四位数据接口#endif LCD
46、_AC_AUTO_INCREMENT /LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) LCD_DISPLAY_ON /LCD开显示及光标设置(光标不闪烁,不显示"_") LCD_CLR /清屏/*-*/ 原创 液晶1602 显示汉字研究液晶, 汉字, 研究1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。1602可以显示内部常用字符(包括阿拉伯数字,英文字母
47、大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。一、显示常用字符。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”十进制 十六进制 ASCII字符
48、 十进制 十六进制 ASCII字符 十进制 十六进制 ASCII字符 00 00 自定义字符1 56 38 8 96
49、160; 60 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 &
50、#160;58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63
51、; c 04 04 自定义字符5 60 3C < 100 64 d 05 05 自定义字符6 61
52、 3D = 101 65 e 06 06 自定义字符7 62 3E > 102 66 f
53、 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40
54、60; 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A&
55、#160; 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C
56、160; 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定
57、义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F
58、0; 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格
59、160; 72 48 H 112 70 p 33 21 !
60、 73 49 I 113 71 q 34 22 "
61、; 74 4A J 114 72 r 35 23 # 75 &
62、#160; 4B K 115 73 s 36 24 $ 76 4C L
63、160; 116 74 t 37 25 % 77 4D M 117
64、; 75 u 38 26 & 78 4E N 118 76 v
65、160; 39 27 ' 79 4F O 119 77 w 40 28
66、60; ( 80 50 P 120 78 x 41 29 )
67、 81 51 Q 121 79 y 42 2A *
68、 82 52 R 122 7A z 43 2B +
69、 83 53 S 123 7B 44 2C , 8
70、4 54 T 124 7C | 45 2D - 85 55 U
71、 125 7D 46 2E . 86 56 V &
72、#160;126 7E 47 2F / 87 57 W &
73、#160; 48 30 0 88 58 X 49
74、160; 31 1 89 59 Y 50 32
75、2 90 5A Z 51 33 3 &
76、#160; 91 5B 52 34 4
77、0; 92 5C 53 35 5
78、 93 5D 54 36 6
79、0;94 5E 55 37 7 95 5F
80、160; _ 显示操作的过程:首先确认显示的位置,即在第几行,第几个字符开始显示。也就是要显示的地址,如下表所示的显示地址。第一行的显示地址是0x800x8F,第二行的显示地址是0xC00xCF。例如想要在第2行,第3个位置显示一个字符,那么地址码就是 0xC2。在编程过程中,通常编写一个函数确定在某行某个位置显示数据。函数需要 行参数(y),和 列参数(x)来确定显示位置。程序参考如下/*设置显示位置*/ void
81、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 以上地址码,在显示过程中,可以直接应用,至于地址码的计算原理,如果想要研究,请参考其它资料,这里不做描述。其次设置要显示
82、的内容,即上面提到的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); /发送地址码 &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年可持续发展的项目管理证书考试卷及答案
- 2025年金融市场与投资分析考试试题及答案
- 民事仲裁协议书范文模板
- 模特道具采购合同协议
- 商场游乐场合同协议
- 售房部物业服务合同协议
- 和香港公司合同协议
- 售卖猫猫合同协议
- 咖啡馆合作协议合同协议
- 商家账号孵化合同协议
- 2024年私人房屋装修合同电子版(2篇)
- JT-T-808-2019道路运输车辆卫星定位系统终端通信协议及数据格式
- 《征兵入伍应征公民体格检查标准条文释义》
- 珠宝鉴赏智慧树知到期末考试答案2024年
- 电梯维护保养规则(TSG T5002-2017)
- 广西贵港市小升初数学试卷
- 《蜘蛛开店》评课
- 智慧建筑评价标准
- 《老年护理》-课程思政课程标准
- 中心静脉深静脉导管维护操作评分标准
- FANUC机器人培训教程
评论
0/150
提交评论