📄 lcd1602.lst
字号:
C51 COMPILER V9.02 LCD1602 11/08/2012 21:34:06 PAGE 1
C51 COMPILER V9.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN ..\output\Lcd1602.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\Lcd1602.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\ou
-tput\Lcd1602.lst) OBJECT(..\output\Lcd1602.obj)
line level source
1 /*
2 **********************************************************************************************************
-***
3 * Kingst-51
4 * Development board samples
5 *
6 * (c) Copyright 2009-2012, Kingst Studio
7 * All Rights Reserved
8 *
9 * http://www.kingst.org
10 * 文件名:Lcd1602.c
11 * 描 述:1602液晶驱动文件
12 * 版本号:1.0.0
13 **********************************************************************************************************
-***
14 */
15
16 #define _LCD_1602_C
17 #include "config.h"
18 #include "Lcd1602.h"
19
20
21 /*
22 ********************************************************************************
23 * ----------------------- Local defines ---------------------------------------
24 ********************************************************************************
25 */
26 #define BusDelay() _nop_()
27
28
29
30 /*
31 ********************************************************************************
32 * ----------------------- Local variables -------------------------------------
33 ********************************************************************************
34 */
35 static uint8 tempDBUS;
36 static bit tempADDR0;
37 static bit tempADDR1;
38 static bit tempENLED;
39 static bit tempEA;
40
41
42 /*
43 ***************************************************************************************************
44 * ---------------------------------- Source codes ------------------------------------------------
45 ***************************************************************************************************
46 */
47 /*
48 * 函数名:LcdAccessStart
49 * 描 述:LCD访问启动函数,暂存需使用资源的当前状态
50 */
51 static void LcdAccessStart(void)
52 {
C51 COMPILER V9.02 LCD1602 11/08/2012 21:34:06 PAGE 2
53 1 tempEA = EA;
54 1 EA = 0;
55 1 tempDBUS = DBUS;
56 1 tempADDR0 = ADDR0;
57 1 tempADDR1 = ADDR1;
58 1 tempENLED = ENLED;
59 1 ENLED = 1;
60 1 }
61 /*
62 * 函数名:LcdAccessStop
63 * 描 述:LCD访问结束函数,回复所使用的资源状态
64 */
65 static void LcdAccessStop(void)
66 {
67 1 DBUS = tempDBUS;
68 1 ADDR0 = tempADDR0;
69 1 ADDR1 = tempADDR1;
70 1 ENLED = tempENLED;
71 1 EA = tempEA;
72 1 }
73
74 /*
75 * 函数名:Lcd1602WaitReady
76 * 描 述:检测并等待1602液晶空闲
77 */
78 static void Lcd1602WaitReady(void)
79 {
80 1 uint8 sta;
81 1
82 1 LCD1602_DB = 0xFF;
83 1 LCD1602_RS = 0;
84 1 LCD1602_RW = 1;
85 1 do {
86 2 LCD1602_E = 1;
87 2 BusDelay();
88 2 sta = LCD1602_DB;
89 2 LCD1602_E = 0;
90 2 } while ((sta&0x80) != 0); //BUSY标志位为bit7
91 1 }
92 /*
93 * 函数名:Lcd1602WriteCmd
94 * 描 述:1602液晶命令写入函数
95 * 输 入:cmd - 待写入命令
96 * 输 出:无
97 */
98 static void Lcd1602WriteCmd(uint8 cmd)
99 {
100 1 LcdAccessStart();
101 1 Lcd1602WaitReady();
102 1 LCD1602_RS = 0;
103 1 LCD1602_RW = 0;
104 1 LCD1602_E = 1;
105 1 LCD1602_DB = cmd;
106 1 BusDelay();
107 1 LCD1602_E = 0;
108 1 LcdAccessStop();
109 1 }
110 /*
111 * 函数名:Lcd1602WriteDat
112 * 描 述:1602液晶数据写入函数
113 * 输 入:dat - 待写入数据
114 * 输 出:无
C51 COMPILER V9.02 LCD1602 11/08/2012 21:34:06 PAGE 3
115 */
116 static void Lcd1602WriteDat(uint8 dat)
117 {
118 1 LcdAccessStart();
119 1 Lcd1602WaitReady();
120 1 LCD1602_RS = 1;
121 1 LCD1602_RW = 0;
122 1 LCD1602_E = 1;
123 1 LCD1602_DB = dat;
124 1 BusDelay();
125 1 LCD1602_E = 0;
126 1 LcdAccessStop();
127 1 }
128
129 /*
130 * 函数名:Lcd1602ShowStr
131 * 描 述:在1602液晶上显示字符串
132 * 输 入:str - 待显示字符串指针
133 * x - 屏幕显示横坐标
134 * y - 屏幕显示纵坐标
135 * 输 出:无
136 * 备 注:输入的字符串必须符合C语言规范,即以'\0'-NULL为结束标识符;
137 */
138 void Lcd1602ShowStr(const uint8 *str, uint8 x, uint8 y)
139 {
140 1 uint8 addr;
141 1
142 1 /* 由输入的显示坐标计算显示RAM的地址 */
143 1 if (y == 0) {
144 2 addr = 0x80;
145 2 }
146 1 else {
147 2 addr = 0xC0;
148 2 }
149 1 addr |= x;
150 1
151 1 /* 由起始显示RAM地址连续写入字符串 */
152 1 Lcd1602WriteCmd(addr);
153 1 while (*str != '\0') {
154 2 Lcd1602WriteDat(*str);
155 2 str++;
156 2 }
157 1 }
158 void Lcd1602Clear(uint8 x, uint8 y, uint8 len)
159 {
160 1 uint8 addr;
161 1
162 1 /* 由输入的显示坐标计算显示RAM的地址 */
163 1 if (y == 0) {
164 2 addr = 0x80;
165 2 }
166 1 else {
167 2 addr = 0xC0;
168 2 }
169 1 addr |= x;
170 1
171 1 /* 由起始显示RAM地址连续写入空格 */
172 1 Lcd1602WriteCmd(addr);
173 1 while (len > 0) {
174 2 Lcd1602WriteDat(' ');
175 2 len--;
176 2 }
C51 COMPILER V9.02 LCD1602 11/08/2012 21:34:06 PAGE 4
177 1 }
178
179 /*
180 * 函数名:Lcd1602Init
181 * 描 述:1602液晶初始化函数
182 */
183 void Lcd1602Init(void)
184 {
185 1 Lcd1602WriteCmd(0x38); //16*2显示,5*7点阵,8位数据接口
186 1 Lcd1602WriteCmd(0x0C); //显示器开、光标开、光标允许闪烁
187 1 Lcd1602WriteCmd(0x06); //文字不动,光标自动右移
188 1 Lcd1602WriteCmd(0x01); //清屏
189 1
190 1 Lcd1602ShowStr("* Hello World! *", 0, 0);
191 1 Lcd1602ShowStr("key 0x-- pressed", 0, 1);
192 1 }
193
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 223 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 5
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -