📄 1602driver.lst
字号:
C51 COMPILER V7.06 1602DRIVER 09/25/2008 20:34:56 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 1602DRIVER
OBJECT MODULE PLACED IN 1602driver.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602driver.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /****************************************/////////////////////////////
3 /*文件名称:1602driver
4 *文件标识:
5 *摘 要:LCD 1602 驱动程序,显示内容:数字,英文字符,ascii码符号,
6 * 内设有几个子函数 1.显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
7 2.显示字符子函数,调用函数,(“要显示的字符”)
8 3.显示数值子函数,调用该函数(整数部分的数值,小数部分的数值)
9 4.显示数值+字符的子函数 调用函数 ((“要显示的字符”,整数,小数,“单位”)
10 *作 者:陈军
11 *完成日期:20080923
12 *
13 *
14 *///////////////////////////////////////***************************************/
15
16 #include <reg52.h>
17
18 //各功能设定时候的指令码如下:
19 const unsigned char CLEAR_SCREEN = 0X01;
20 const unsigned char CURSOR_RETURN = 0X02;
21 const unsigned char MODE_SET = 0X06; // 完成一个字码传送后,AC自动加1,显示不发生位移
22 const unsigned char DISPLAY_ON = 0X0C; // 开显示,光标不显示,光标所在位置的字符不闪烁
23 const unsigned char CURSOR_DISPLAY_SHIFT = 0X14;//光标向右移,显示不动,AC自动加1
24 const unsigned char FUNCTION_SET = 0X38; //数据接口宽度为8位,两行显示,5*8点阵字符
25 const unsigned char CGRAM_ADD_INI = 0X40; //CGRAM 初始地址设为000000,
26 const unsigned char DDRAM_ADD_INI_1 = 0X80; //DDRAM 初始地址设为000000
27 const unsigned char DDRAM_ADD_INI_2 = 0XC0;
28
29 const bit E_READ = 1; // E=1,读
30
31 const bit RS_INST = 0; //RS=0,DB7~0,数据操作指向指令寄存器
32 const bit RS_DATA = 1; //RS=1,DB7~0,数据操作指向数据寄存器
33
34 const bit RW_READ = 1; //此时进行访问的为,读操作
35 const bit RW_WRITE = 0; //此时进行访问的为,写操作
36
37
38 //端口定义
39 // P07~P00 对应的为LCD数据窗口的DB7~DB0
40 sbit RS = P2^0; //指向指令、数据寄存器的mcu控制端口
41 sbit RW = P2^1; //读写操作控制由 mcu P2^1端口提供
42 sbit E = P2^2; //读写控制使能信号,由P2^3控制
43 sbit BF = P0^7;
44
45 unsigned char code num_dis_code[10]="0123456789";
46 unsigned char *p_number = &num_dis_code[0];
47
48 unsigned char code self_definition_char[] = {
49
50 0x06,0x02,0x0a,0x11,0x08,0x12,0x0d,0x00, //"公"代码
51 0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00, //"元"代码
52 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00, //"年"代码
53 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //"月"代码
54 0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //"日"代码
55 0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00, //"四"代码
C51 COMPILER V7.06 1602DRIVER 09/25/2008 20:34:56 PAGE 2
56 0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00, //"五"代码
57 0x08,0x04,0x1F,0x00,0x0A,0x11,0x00,0x00, //"六"代码
58 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //"\"代码
59
60 0x01,0x02,0x05,0x02,0x06,0x02,0x02,0x02, //自定义字符
61 0x04,0x0A,0x1F,0x04,0x1F,0x0E,0x15,0x0C, //自定义字符
62 0x01,0x0F,0x04,0x02,0x01,0x02,0x04,0x08, //自定义字符
63 0x00,0x1E,0x08,0x10,0x00,0x10,0x08,0x06, //自定义字符
64 0x0F,0x12,0x0F,0x04,0x0F,0x00,0x0F,0x00, //自定义字符
65 0x1F,0x12,0x1C,0x10,0x1E,0x10,0x1F,0x10, //自定义字符
66 };
67
68 //unsigned char *p_number = "0123456789";
69
70 unsigned char k;
71 //unsigned char start_positon;
72
73 unsigned char second=0; /*相应的位置上要显示的字符,时分秒,10*(时,分,秒)*/
74 unsigned char ten_second=0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
75 unsigned char miniute=0;
76 unsigned char ten_miniute=0;
77 unsigned char hour=0;
78 unsigned char ten_hour=0; //char code int2charLCD[]="0123456789";
79 ///////////////////////////////////////////////////////////////////////////////
80
81 void fun_wait_bf(void) ///读,等待,busy标志位,busy=0 方可进行操作
82 {
83 1 RS = RS_INST;
84 1 RW = RW_READ;
85 1 E = E_READ;
86 1 while (BF)
87 1 {
88 2 }
89 1 }
90
91 void fun_write_e(void) //制造一个E 的上升沿,能够为写数据服务
92 {
93 1 E=0;
94 1 E=0;
95 1 E=1;
96 1 E=1;
97 1 E=0;
98 1 E=0;
99 1 }
100
C51 COMPILER V7.06 1602DRIVER 09/25/2008 20:34:56 PAGE 3
101
102 void fun_write_instruction(unsigned char instruction_data)
103 {
104 1 fun_wait_bf(); //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
105 1 RS = RS_INST; //指向指令寄存器
106 1 RW = RW_WRITE; //写操作控制
107 1 P0 = instruction_data; //具体指令码送P0口,即DB7~DB0
108 1 fun_write_e(); // e制造一个上升沿,让指令写入,lcd模块的内部寄存器
109 1 }
110
111 void fun_write_data(unsigned char data_data)
112 {
113 1 fun_wait_bf(); //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
114 1 RS = RS_DATA; //指向数据寄存器
115 1 RW = RW_WRITE; //写操作控制
116 1 P0 = data_data; //具体数据送P0口,即DB7~DB0
117 1 fun_write_e(); // e制造一个上升沿,让数据写入,lcd模块的内部寄存器
118 1 }
119
120 /*
121 *函数介绍: .显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
122 *输入参数: line 行 =1,2 row =0~15.
123 *输出参数:
124 *返回值 :
125 */
126
127
128
129 void fun_display_position(unsigned char line,unsigned char row) //
130 {
131 1 unsigned char start_position = 0;
132 1
133 1 if (line == 1)
134 1 {
135 2 start_position = DDRAM_ADD_INI_1 + row; //开始位置设定在 第一行,根据row定第几列
136 2 }
137 1
138 1 if (line == 2 )
139 1 {
140 2 start_position = DDRAM_ADD_INI_2 + row; //开始位置设定在 第二行,根据row定第几列
141 2 }
142 1
143 1 fun_write_instruction(start_position);
144 1 }
145
146
147
148
149
150 void fun_display_char(unsigned char *p_char) //显示字符符子函数
151 {
152 1 while (*p_char) //指针指向要显示字符的首地址,只要字符就传送字符对应的字模
153 1 { //直到指针找不到字符为止,判断为要传送的字符结束。
154 2 fun_write_data(*p_char);
155 2 p_char++;
156 2 }
157 1
158 1
159 1 }
160
161
162
C51 COMPILER V7.06 1602DRIVER 09/25/2008 20:34:56 PAGE 4
163 void fun_display_num4(unsigned long int zhengshu)
164 {
165 1 unsigned char ge,shi,bai,qian;
166 1
167 1
168 1 if ((zhengshu>=1000) && (zhengshu<=9999)) //数值再10的3次方以上
169 1 {
170 2
171 2
172 2 qian = zhengshu/1000;
173 2 bai = (zhengshu%1000)/100;
174 2 shi = (zhengshu%100)/10;
175 2 ge = (zhengshu%10);
176 2
177 2 p_number = &num_dis_code[0]+qian;
178 2 fun_write_data(*p_number);
179 2 p_number = &num_dis_code[0]+bai;
180 2 fun_write_data(*p_number);
181 2 p_number = &num_dis_code[0]+shi;
182 2 fun_write_data(*p_number);
183 2 p_number = &num_dis_code[0]+ge;
184 2 fun_write_data(*p_number);
185 2 }
186 1
187 1 if ((zhengshu>=100) && (zhengshu<=999)) //数值再10的2次方以上
188 1 {
189 2
190 2
191 2 bai = zhengshu/100;
192 2 shi = (zhengshu%100)/10;
193 2 ge = (zhengshu%10);
194 2
195 2 p_number = &num_dis_code[0]+bai;
196 2 fun_write_data(*p_number);
197 2 p_number = &num_dis_code[0]+shi;
198 2 fun_write_data(*p_number);
199 2 p_number = &num_dis_code[0]+ge;
200 2 fun_write_data(*p_number);
201 2 }
202 1
203 1 if ((zhengshu>=10) && (zhengshu<=99)) //数值再10的1次方以上
204 1 {
205 2
206 2
207 2 shi = zhengshu/10;
208 2 ge = (zhengshu%10);
209 2
210 2 p_number = &num_dis_code[0]+shi;
211 2 fun_write_data(*p_number);
212 2 p_number = &num_dis_code[0]+ge;
213 2 fun_write_data(*p_number);
214 2 }
215 1
216 1 if ((zhengshu>=0) && (zhengshu<=9)) //只有个位
217 1 {
218 2
219 2 ge = (zhengshu%10);
220 2
221 2 p_number = &num_dis_code[0]+ge;
222 2 fun_write_data(*p_number);
223 2 }
224 1
C51 COMPILER V7.06 1602DRIVER 09/25/2008 20:34:56 PAGE 5
225 1
226 1 }
227
228 /*************************************************************************
229 *函数介绍:显示数值子函数,调用该函数(整数部分的数值,小数部分的数值),
230
231 *输入参数:整数部分的最大值,显示为10000000,小数部分显示3位,
232
233 *输出参数:小数部分,输入0,显示 。000, 输入123 显示 。123,以此类推
234 *返回值 :
235 */////////////////////////////////////////////////////////////////////
236
237
238 void fun_display_num_dot(unsigned long int zhengshu,unsigned int dot)
239 {
240 1 unsigned char ge,shi,bai,qian,wang,wang10,wang100,wang1000,dot1,dot01,dot001;
241 1
242 1 if ((zhengshu>=10000000) && (zhengshu<99999999)) //数值再10的7次方以上
243 1 {
244 2
245 2 wang1000 = zhengshu/10000000; //取各个数量级位,
246 2 wang100 = (zhengshu%10000000)/1000000;
247 2 wang10 = (zhengshu%1000000)/100000;
248 2 wang = (zhengshu%100000)/10000;
249 2 qian = (zhengshu%10000)/1000;
250 2 bai = (zhengshu%1000)/100;
251 2 shi = (zhengshu%100)/10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -