📄 lcd1602.lst
字号:
1: /*********************************************************************
2: *
3: * LCD1602.C
4: *
5: *********************************************************************
6: * 文件名: LCD1602.C
7: * 描述: 2*16液晶模块驱动程序,应用时只需要根据硬件连接方式作适当修改,在主程序中包含其头文件即可以用几个简单的函数实现功能,实现了简化编程
8: * 公司: 爱晶电子
9: *
10: * 作者 日期 注释
11: *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12: * 王伟民 08/04/01 原始文件
13: ********************************************************************/
14:
15: /*函数实现*/
16: #include <pic16f877A.h>
17: #include <pic.h>
18: #include "lcd1602.h"
19: const rom char cgtab[64]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
20: 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,
21: 0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,
22: 0x11,0x0a,0x04,0x1f,0x04,0x1f,0x04,0x00,
23: 0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,
24: 0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,
25: 0x04,0x0a,0x15,0x04,0x04,0x04,0x04,0x00,
26: 0x01,0x03,0x1d,0x15,0x1d,0x03,0x01,0x00}; /*年、月、日、¥、元、℃、↑、小喇叭图标*/
27:
28:
29:
30: /*产生一个LCD模块的使能脉冲*/
31: /*该函数只在本文件内使用,不会被其他文件调用,因此放在本文件的最前面,不在H文件中声明了*/
32: void LCD_E_toggle(void)
33: {
34: LCD_EN=0;
35: Nop();
36: LCD_EN=1;
37: Nop();
38: }
39:
40: void LCD_init(void)
41: {
42: ADCON1=0x0F;/*所有引脚均设置为数字IO脚*/
43: Delay10Ms(10);/*延时100ms*/
44: TRIS_LCD_RW=0;/*设置单片机LCD控制引脚全为输出*/
45: TRIS_LCD_RS=0;
46: TRIS_LCD_EN=0;
47: LCD_wrcmd(LCD_MODE_STD);/*LCD标准工作模式:8位数据传送,2行显示,字符点阵5*7*/
48: LCD_wrcmd(DISP_OFF);/*显示关闭*/
49: LCD_wrcmd(DISP_CLR);/*清屏*/
50: /*清屏和光标归位需要较长的时间*/
51: LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/
52: LCD_wrcmd(DISP_ON & CUR_OFF & BLINK_OFF);/*显示开,无光标, 光标不闪烁*/
53: //LCD_wrcmd(DISP_ON & CUR_ON & BLINK_ON);/*显示开,光标, 光标闪烁*/
54: CG_Write();/*建立自定义字符块*/
55: }
56:
57: //void LCD_wrcmd(Uchar cmd)/*写入控制命令*/
58: void LCD_wrcmd(Uchar cmd)/*写入控制命令*/
59: {
60: Nop();/****/
61: wait_until_LCDready();
62: Nop();/****/
63: TRIS_LCD_DATA=0x00; /*单片机的LCD数据口设置为全输出*/
64: Nop();/****/
65: LCD_EN=0;
66: Nop();/****/
67: LCD_RS=0;
68: Nop();/****/
69: LCD_RW=0;
70: Nop();/****/
71: LCD_DATA=cmd;
72: Nop();/****/
73: LCD_EN=1;
74: Nop();/****/
75: Nop();
76: LCD_EN=0;
77: Nop();/****/
78: }
79:
80: void LCD_wrchar(char str)/*写入要显示的字符*/
81: {
82: Nop();/****/
83: wait_until_LCDready();
84: Nop();/****/
85: TRIS_LCD_DATA=0x00; /*单片机的LCD数据口设置为全输出*/
86: Nop();/****/
87: LCD_EN=0;
88: Nop();/****/
89: LCD_RS=1;
90: Nop();/****/
91: LCD_RW=0;
92: Nop();/****/
93: LCD_DATA=str;
94: Nop();/****/
95: LCD_EN=1;
96: Nop();/****/
97: Nop();
98: LCD_EN=0;
99: Nop();/****/
100: }
101:
102: void LCD_setxy(char x,char y) /*设定显示位置,行x=1/2,列y=1~16的任意整数*/
103: {
104: char temp;
105: if(x==1)
106: {
107: temp=0x80+y-1;
108: LCD_wrcmd(temp);
109: }
110: else
111: {
112: temp=0xC0+y-1;
113: LCD_wrcmd(temp);
114: }
115: }
116:
117:
118: void LCD_wrstr(const rom char *s)/*写入要显示的字符串*/
119: {
120: for(;*s!='\0';s++)LCD_wrchar(*s);
121: }
122:
123:
124: void LCD_wrul(unsigned long num)/*写入要显示的无符号长整型数*/
125: {
126: char str[11];/*无符号长整型数转换为字符串是10个,所以需要11个单元存储*/
127: int i=0;
128: int j=0;
129: ultoa(num,str);/*将无符号长整型数转换为字符串*/
130: LCD_wrcmd(CUR_AUTO_L);/*设置光标在文字插入后自动左移*/
131: while(str[i]!='\0')/*搜索字符串结束符*/
132: {
133: i++;
134: }
135: while(i>0)/*显示前面的有效数字*/
136: {
137: i--;
138: LCD_wrchar(str[i]);
139: j++;
140: }
141: while(j<10)/*往前写满10位,也就是前面都写空格*/
142: {
143: LCD_wrchar(0x20);
144: j++;
145: }
146: LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/
147: }
148:
149:
150: void LCD_wrlval(unsigned long num,unsigned char bits,unsigned char dp)/*写入要显示的长变量*/
151: {
152: char str[11];/*无符号长整型数转换为字符串是10个,所以需要11个单元存储*/
153: int i=0;
154: int j=0;
155: ultoa(num,str);/*将无符号长整型数转换为字符串*/
156: LCD_wrcmd(CUR_AUTO_L);/*设置光标在文字插入后自动左移*/
157: while(str[i]!='\0')/*搜索字符串结束符*/
158: {
159: i++;
160: }
161: if (i>bits)/*要显示的数据比规定的显示位数多,数据显示溢出*/
162: {
163: while(j<bits)/*往前写满规定的位数,也就是前面都写空格,直到规定的位数*/
164: {
165: LCD_wrchar('-'); /*规定的位全部写-,表示数据溢出*/
166: j++;
167: if (j==dp) LCD_wrchar('.');/*插入小数点*/
168: }
169: }
170: else
171: {
172: while(i>0)/*显示前面的有效数字*/
173: {
174: i--;
175: LCD_wrchar(str[i]);
176: j++;
177: if (j==dp) LCD_wrchar('.');/*插入小数点*/
178: }
179: while(j<bits)/*往前写满规定的位数,也就是前面都写空格,直到规定的位数*/
180: {
181: if (j==dp) LCD_wrchar('.');/*插入小数点*/
182: if (j<=dp) LCD_wrchar('0');/*小数点前后补0字符*/
183: else LCD_wrchar(0x20); /*小数点前后补空字符*/
184: j++;
185: }
186: }
187: LCD_wrcmd(CUR_AUTO_R);/*设置光标在文字插入后自动右移*/
188: }
189:
190:
191: void wait_until_LCDready(void) /*检测忙标志,忙则等待*/
192: {
193: LCD_EN=0;/*此句必须加,否则后面RS RW输出电平后,液晶屏出现光标复位的现象*/
194: LCD_RS=0;
195: TRIS_LCD_DATA=0x0ff;/*设置单片机LCD数据引脚全为输入*/
196: LCD_RW=1;
197: LCD_EN=1;/*读状态的时候,E始终保持高电平即可*/
198: Nop();
199: while(LCD_BUSY==1);/*LCD忙,则原地等待*/
200: LCD_EN=0;
201: }
202:
203:
204:
205: void CG_Write(void)/*建立自定义字符块*/
206: {
207: int i;
208: LCD_wrcmd(SET_ADDR_CGRAM);/*字符发生器CGRAM地址设置*/
209: for(i=0;i<64;i++)
210: {
211: LCD_wrchar(cgtab[i]);
212: };
213: }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -