📄 lcm-1602a.lst
字号:
C51 COMPILER V8.08 LCM_1602A 11/24/2009 12:52:21 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE LCM_1602A
OBJECT MODULE PLACED IN LCM-1602A.OBJ
COMPILER INVOKED BY: f:\Keil3\C51\BIN\C51.EXE LCM-1602A.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /**********************************************************************************************
2 作者: 李雪川
3 时间: 2009-7-29
4 说明: YJD1602A-1液晶显示程序
5 地址设置:地址为后7位,第8位为1
6 N=0 一行显示 地址0x00-0x4f
7 N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
8 版本: V1
9 注意:u = LCM_BYTE; ***********特别注意:往往一时大意容易出小错,结果出不来*******
10 while (u & 0x80); BF=1:忙 BF = 0: 空闲
11 return(u);
12 **------------------------------------------------------------------------------------
13 ** 修改信息:
14 ** 修改 人: 李雪川
15 ** 修改日期: 2009-10-25
16 ** 修改内容: 添加液晶测试宏定义,方便测试
17 ***********************************************************************************************/
18
19 /* LCM-1602A.C */
20
21 #include "LCM-1602A.H"
22
23
24 /*******************************************************************************************
25 ** 函数名称:delay_ms
26 ** 函数功能:延时ms
27 *******************************************************************************************/
28
29
30 /*******************************************************************************************
31 ** 函数名称: uchar lcm_rdbyte(void)
32 ** 函数功能:向1602a-1读一个数据
33 *******************************************************************************************/
34 uchar lcm_rdbyte(void)
35 {
36 1 LCM_RS = 1; /* 读数据 */
37 1 LCM_R_W = 1;
38 1 LCM_E = 1; /* 高电平有效 */
39 1 return(LCM_BYTE);
40 1 }
41
42 /*******************************************************************************************
43 ** 函数名称: uchar lcm_rdint(void)
44 ** 函数功能:向1602a-1读BF , AC
45 *******************************************************************************************/
46 uchar lcm_rdint(void)
47 {
48 1 LCM_BYTE = 0xff;
49 1 LCM_RS = 0; /* 读寄存器 */
50 1 LCM_R_W = 1;
51 1 LCM_E = 1; /* 高电平有效 */
52 1 /***u = LCM_BYTE; //***********特别注意:往往一时大意容易出小错,结果出不来*************/
53 1 while (LCM_BYTE & 0x80); /* BF=1:忙 BF = 0: 空闲 */
54 1 return(LCM_BYTE);
55 1 }
C51 COMPILER V8.08 LCM_1602A 11/24/2009 12:52:21 PAGE 2
56
57
58 /*******************************************************************************************
59 ** 函数名称: void lcm_wrint(uchar byte, uchar busyc)
60 ** 函数功能:向1602a-1写寄存器. 包括些控制字和地址
61 ** 地址设置:地址为后7位,第8位为1
62 N=0 一行显示 地址0x00-0x4f
63 N= 1 两行显示 首行 0x00-0x2f, 次行0x40-0x67
64 *******************************************************************************************/
65 void lcm_wrint(uchar byte, uchar busyc)
66 {
67 1 if (busyc) lcm_rdint(); /* busyc 为0 忽略遇忙检测 */
68 1 // LCM_BYTE = byte;
69 1 LCM_RS = 0; /* 写寄存器 */
70 1 LCM_R_W = 0;
71 1 LCM_BYTE = byte;
72 1 LCM_E = 0; /*下降沿有效 */
73 1 _nop_();
74 1 LCM_E = 1;//////////////////////////////////////////////////////////////////
75 1 }
76
77
78 /*******************************************************************************************
79 ** 函数名称: void lcm_wrbyte(uchar byte)
80 ** 函数功能:向1602a-1写一个数据,(写完后ac可设置自动加一)
81 *******************************************************************************************/
82 void lcm_wrbyte(uchar byte)
83 {
84 1 lcm_rdint(); /* 遇忙检测 */
85 1 LCM_RS = 1; /* 写数据 */
86 1 LCM_R_W = 0;
87 1 LCM_BYTE = byte;
88 1 LCM_E = 0; /*下降沿有效 */
89 1 _nop_();
90 1 LCM_E = 1;
91 1 }
92
93
94 /*******************************************************************************************
95 ** 函数名称: void lcm_ac(uchar x, uchar y)
96 ** 函数功能: 将AC光标移动到指定位置
97 *******************************************************************************************/
98 void lcm_ac(uchar x, uchar y)
99 {
100 1 y &= 0x01; /* 算地址 */
101 1 x &= 0x0F; //限制X不能大于15,Y不能大于1
102 1 if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
103 1 x |= 0x80; // 算出指令码
104 1 lcm_wrint(x, 0); //这里不检测忙信号,发送地址码
105 1 }
106
107
108 /*******************************************************************************************
109 ** 函数名称: void lcm_displist(uchar x, uchar y, uchar *ddata)
110 ** 函数功能:向1602a-1任意地址显示一串字符
111 *******************************************************************************************/
112 void lcm_displist(uchar x, uchar y, uchar *ddata)
113 {
114 1 uchar line = x; /* 字符串首列地址 */
115 1 uchar listlength = 0;
116 1 y &= 0x01;
117 1 x &= 0x0F; //限制X不能大于15,Y不能大于1
C51 COMPILER V8.08 LCM_1602A 11/24/2009 12:52:21 PAGE 3
118 1
119 1 if (y) line |= 0x40; //当要显示第二行时地址码+0x40;
120 1 line |= 0x80; // 算出指令码
121 1 lcm_wrint(line, 1); //检测忙信号,发送地址码
122 1
123 1 while(ddata[listlength] != '\0') //若到达字串尾则退出
124 1 {
125 2 if (x <= 0x0F) //X坐标应小于0xF
126 2 {
127 3 // lcm_diapchar(x, y, ddata[listlength]);
128 3 lcm_wrbyte(ddata[listlength]);
129 3 x++;
130 3 listlength++;
131 3 }
132 2 else
133 2 {
134 3 break;
135 3 }
136 2 }
137 1 }
138
139 /*******************************************************************************************
140 ** 函数名称: void lcm_init()
141 ** 函数功能:1602a-1初始设置
142 *******************************************************************************************/
143 void lcm_init()
144 {
145 1
146 1 lcm_wrint(0x38,1); /* D4= 1:8位数据接口,0:4位数据接口,D3=1:两行显示 0:一行显示
147 1 D2 = 1: 5*10点阵 0 :5*7点阵*/
148 1 lcm_wrint(0x08,1); /* 显示开关控制D3=1, D2显示开关,D1光标开关,D0闪烁开关. 1:开,0:关 */
149 1
150 1 lcm_wrint(0x0e,1);
151 1 lcm_wrint(0x01,1); /* 清零 */
152 1 lcm_wrint(0x02,1); /* 光标归为到HOME */
153 1 lcm_wrint(0x06,1); /* 输入方式设置,D2=1, D1=1:AC自加,0:自减, D0=1:画面平移,0:不动\
154 1 这里画面设置为不动*/
155 1 //lcm_wrint(0x1c,1); /* 光标画面移位,D3=1:画面移 0:光标移动,D2=1:右移0:左移 */
156 1 }
157
158
159
160
161
162
163
164 /*--------------------------------宏编译---------------------------------------------------*/
165 #if LCM_1602A_TEST > 0
166
167
168 void main()
169 {
170 1 uint i = 500000;
171 1 uchar code tab1[] = {"zhu yao xing fu!!!!"};
172 1 uchar code tab2[] = {" yong yuan! "};
173 1 while(i--);
174 1 lcm_init();
175 1
176 1 lcm_wrbyte('a');
177 1 lcm_wrbyte('a');
178 1 lcm_wrbyte('a');
179 1 lcm_wrbyte('a');
C51 COMPILER V8.08 LCM_1602A 11/24/2009 12:52:21 PAGE 4
180 1
181 1
182 1 lcm_displist(0,1,tab2);
183 1 lcm_displist(0,0,tab1);
184 1 lcm_rdbyte(); //测试可不要
185 1 while(1);
186 1 }
187
188 #endif
189 /*----------------------------宏编译结束------------------------------------------------------*/
190
191
192
193
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 238 ----
CONSTANT SIZE = 37 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -