📄 1602.lst
字号:
C51 COMPILER V8.08 1602 11/11/2007 02:20:21 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*===================================================================
2
3 1602字符液晶屏程序
4 =====================================================================
5 连接线图:
6 DB0-----P2.0 DB4-----P2.4 RS-------P0.5
7 DB1-----P2.1 DB5-----P2.5 RW-------P0.6
8 DB2-----P2.2 DB6-----P2.6 E--------P0.7
9 DB3-----P2.3 DB7-----P2.7 VLCD接1K2电阻到GND
10
11 [注]:AT89S51的晶振频率为12MHz
12 ====================================================================*/
13
14 #include <reg51.h>
15
16
17
18 //变量类型标识的宏定义,大家都喜欢这么做
19 #define Uchar unsigned char
20 #define Uint unsigned int
21
22 /*=================================================================
23 控制引脚定义,不同的连接必须修改的部分
24 ===============================================================*/
25 sbit RS = P0^5;
26 sbit RW = P0^6;
27 sbit Elcm = P0^7;
28 #define DataPort P2 //数据端口
29 #define Busy 0x80 //忙标志
30
31 /*=====================码表==================================*/
32 code char tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
33
34 code char cac[]="CACWORLD!!!";
35
36 /*=======================函数声明=============================*/
37 void Delay400Ms(void);
38 void Delay5Ms(void);
39 void LcdWriteData( char dataW );
40 void LcdWriteCommand( Uchar CMD,Uchar AttribC );
41 void LcdReset( void );
42 void Display( Uchar dd );
43 void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
44 void WaitForEnable( void );
45 void LocateXY( char posx,char posy) ;
46 void _nop_(void);
47 /*=======================================================
48 显示光标定位
49 =======================================================*/
50 void LocateXY( char posx,char posy) {
51 1
52 1 Uchar temp;
53 1
54 1 temp = posx & 0x0f;
55 1 posy &= 0x01;
C51 COMPILER V8.08 1602 11/11/2007 02:20:21 PAGE 2
56 1 if ( posy ) temp |= 0x40;
57 1 temp |= 0x80;
58 1 LcdWriteCommand(temp,0);
59 1 }
60
61 /*=======================================================
62 按指定位置显示数出一个字符
63 =======================================================*/
64 void DispOneChar(unsigned char x,Uchar y,Uchar Wdata) {
65 1
66 1 LocateXY( x, y ); // 定位显示地址
67 1 LcdWriteData( Wdata ); // 写字符
68 1 }
69
70 /*=======================================================
71 显示字符串
72 =======================================================*/
73 void Putstr(Uchar x,Uchar y, Uchar code *ptr) {
74 1 Uchar i,l=0;
75 1 while (ptr[l] >31){l++;};
76 1 for (i=0;i<l;i++) {
77 2 DispOneChar(x++,y,ptr[i]);
78 2 if ( x == 16 ){
79 3 x = 0; y ^= 1;
80 3 }
81 2 }
82 1 }
83
84 /*=======================================================
85 初始化程序, 必须按照产品资料介绍的初始化过程进行
86 =======================================================*/
87 void LcdReset( void ) {
88 1
89 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
90 1 Delay5Ms();
91 1 LcdWriteCommand( 0x38, 0); // 共三次
92 1 Delay5Ms();
93 1 LcdWriteCommand( 0x38, 0);
94 1 Delay5Ms();
95 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
96 1 LcdWriteCommand( 0x08, 1); // 显示关闭
97 1 LcdWriteCommand( 0x01, 1); // 显示清屏
98 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
99 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
100 1 }
101
102 /*=======================================================
103 写控制字符子程序: E=1 RS=0 RW=0
104 =======================================================*/
105 void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
106 1
107 1 if (AttribC) WaitForEnable(); // 检测忙信号?
108 1
109 1 RS = 0; RW = 0; _nop_();
110 1
111 1 DataPort = CMD; _nop_(); // 送控制字子程序
112 1
113 1 Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号
114 1 }
115
116 /*=======================================================
117 当前位置写字符子程序: E =1 RS=1 RW=0
C51 COMPILER V8.08 1602 11/11/2007 02:20:21 PAGE 3
118 =======================================================*/
119 void LcdWriteData( char dataW ) {
120 1
121 1 WaitForEnable(); // 检测忙信号
122 1
123 1 RS = 1; RW = 0; _nop_();
124 1
125 1 DataPort = dataW; _nop_();
126 1
127 1 Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号
128 1
129 1 }
130
131 /*=======================================================
132 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
133 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
134 ========================================================*/
135 void WaitForEnable( void )
136 {
137 1
138 1 DataPort = 0xff;
139 1
140 1 RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
141 1
142 1 while( DataPort & Busy );
143 1
144 1 Elcm = 0;
145 1 }
146
147
148
149 /*============空操作==============*/
150 void _nop_(void)
151 {
152 1 ;
153 1 }
154
155 /*==================短延时===============*/
156 void Delay5Ms(void)
157 {
158 1 Uint i = 5552;
159 1 while(i--);
160 1 }
161
162 /*=================长延时================*/
163 void Delay400Ms(void)
164 {
165 1 Uchar i = 5;
166 1 Uint j;
167 1 while(i--)
168 1 {
169 2 j=7269;
170 2 while(j--);
171 2 }
172 1 }
173 /*
174 void main(void)
175 { unsigned int i,j;
176 unsigned char x,y;
177 LcdReset();
178
179 while(1)
C51 COMPILER V8.08 1602 11/11/2007 02:20:21 PAGE 4
180 {
181
182
183 DispOneChar(15,1,tab[11]);
184 Putstr(i,0,"cac");
185 }
186
187 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 276 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 9
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 + -