📄 text1.lst
字号:
C51 COMPILER V6.12 TEXT1 04/12/2006 16:30:19 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN .\Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\Text1.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /*============================================================
3 使用1602液晶显示的实验例子
4 ==============================================================
5 RT1602C(16*2)模拟口线接线方式
6 连接线图:
7 ---------------------------------------------------
8 │LCM-----51 │ LCM-----51 │ LCM------51 │
9 ---------------------------------------------│
10 │DB0-----P1.0 │ DB4-----P1.4 │ RW-------P2.0 │
11 │DB1-----P1.1 │ DB5-----P1.5 │ RS-------P2.1 │
12 │DB2-----P1.2 │ DB6-----P1.6 │ E--------P2.2 │
13 │DB3-----P1.3 │ DB7-----P1.7 │ VLCD接1K电阻到GND│
14 ---------------------------------------------------
15
16
17 =============================================================*/
18
19 #include<Reg52.h>
20 #include<stdio.h>
21 #include<absacc.h>
22
23 /*
24 #define LCM_RW P2_0 //读写信号线,高电平时进行读操作,低电平时进行写操作
25 #define LCM_RS P2_1 //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
26 #define LCM_E P2_2 //使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
27 */
28
29 sbit LCM_RW=P2^0; //读写信号线,高电平时进行读操作,低电平时进行写操作
30 sbit LCM_RS=P2^1; //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
31 sbit LCM_E=P2^2; //使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
32 #define LCM_Data P1 //P1为数据口
33 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
34
35
36
37 void WriteDataLCM(unsigned char WDLCM); //写数据到液晶
38 void WriteCommandLCM(unsigned char WCLCM,BuysC); //写命令到液晶
39 unsigned char ReadDataLCM(void); //从液晶读数据
40 unsigned char ReadStatusLCM(void); //液晶忙检测
41 void LCMInit(void); //液晶初始化
42 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); //显示一个数据
43 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //显示字符列表
44 void Delay5Ms(void); //5ms延时
45 void Delay400Ms(void); //400ms延时
46
47 unsigned char code cdle_net[] = {"hello,tjpu"};
48 unsigned char code email[] = {"ni hao a!"};
49
50 void main(void)
51 {
52 1 Delay400Ms(); //启动等待,等LCM进入工作状态
53 1 LCMInit(); //LCM初始化
54 1 Delay5Ms(); //延时片刻(可不要)
55 1
C51 COMPILER V6.12 TEXT1 04/12/2006 16:30:19 PAGE 2
56 1 DisplayListChar(0, 0, cdle_net);
57 1 DisplayListChar(0, 1, email);
58 1 ReadDataLCM();//测试用句无意义
59 1 while(1);
60 1 }
61
62 //写数据
63 void WriteDataLCM(unsigned char WDLCM)
64 {
65 1 ReadStatusLCM(); //检测忙
66 1 LCM_Data = WDLCM;
67 1 LCM_RS = 1;
68 1 LCM_RW = 0;
69 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
70 1 LCM_E = 0; //延时
71 1 LCM_E = 1;
72 1 }
73
74 //写指令
75 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测,WCLCM为指令码
76 {
77 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
78 1 LCM_Data = WCLCM;
79 1 LCM_RS = 0;
80 1 LCM_RW = 0;
81 1 LCM_E = 0;
82 1 LCM_E = 0;
83 1 LCM_E = 1;
84 1 }
85
86 //读数据
87 unsigned char ReadDataLCM(void)
88 {
89 1 LCM_RS = 1;
90 1 LCM_RW = 1;
91 1 LCM_E = 0;
92 1 LCM_E = 0;
93 1 LCM_E = 1;
94 1 return(LCM_Data);
95 1 }
96
97 //读状态
98 unsigned char ReadStatusLCM(void)
99 {
100 1 LCM_Data=0xFF;
101 1 LCM_RS = 0;
102 1 LCM_RW = 1;
103 1 LCM_E = 0;
104 1 LCM_E = 0;
105 1 LCM_E = 1;
106 1 while (LCM_Data & Busy); //检测忙信号
107 1 return(LCM_Data);
108 1 }
109
110 void LCMInit(void) //LCM初始化
111 {
112 1 LCM_Data = 0;
113 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
114 1 Delay5Ms();
115 1 WriteCommandLCM(0x38,0);
116 1 Delay5Ms();
117 1 WriteCommandLCM(0x38,0);
C51 COMPILER V6.12 TEXT1 04/12/2006 16:30:19 PAGE 3
118 1 Delay5Ms();
119 1
120 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号(命令6)
121 1 WriteCommandLCM(0x08,1); //关闭显示(命令4)
122 1 WriteCommandLCM(0x01,1); //显示清屏(命令1)
123 1 WriteCommandLCM(0x06,1); // 显示光标移动设置 光标右移,屏幕上所有文字不移动(命令3)
124 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置(命令4)
125 1 }
126
127 //按指定位置显示一个字符
128 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
129 {
130 1 Y &= 0x1;
131 1 X &= 0xF; //限制X不能大于15,Y不能大于1
132 1 if (Y) X|= 0x40; //当要显示第二行时地址码+0x40;
133 1 X|= 0x80; //算出指令码
134 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
135 1 WriteDataLCM(DData);
136 1 }
137
138 //按指定位置显示一串字符
139 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
140 {
141 1 unsigned char ListLength;
142 1
143 1 ListLength = 0;
144 1 Y &= 0x1;
145 1 X &= 0xF; //限制X不能大于15,Y不能大于1(两行,每行16字符)
146 1 while (DData[ListLength]>0x20) //若到达字串尾则退出
147 1 {
148 2 if (X <= 0xF) //X坐标应小于0xF
149 2 {
150 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
151 3 ListLength++;
152 3 X++;
153 3 }
154 2 }
155 1 }
156
157 //5ms延时
158 void Delay5Ms(void)
159 {
160 1 unsigned int TempCyc = 10400;
161 1 while(TempCyc--);
162 1 }
163
164 //400ms延时
165 void Delay400Ms(void)
166 {
167 1 unsigned char TempCycA = 10;
168 1 unsigned int TempCycB;
169 1 while(TempCycA--)
170 1 {
171 2 TempCycB=6800;
172 2 while(TempCycB--);
173 2 };
174 1 }
175
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 307 ----
C51 COMPILER V6.12 TEXT1 04/12/2006 16:30:19 PAGE 4
CONSTANT SIZE = 21 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
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 + -