📄 8.1.lst
字号:
C51 COMPILER V7.09 8_1 08/23/2005 13:28:01 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE 8_1
OBJECT MODULE PLACED IN 8.1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 8.1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include<intrins.h>
3
4 #define Uchar unsigned char
5 #define Uint unsigned int
6
7 // LCM1602A端口地址定义
8 char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
9 char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
10 char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1
11
12 #define Busy 0x80 // 忙判别位
13
14 code char exampl[]="For an example. - By xiaoqi\n";
15
16 void Delay400Ms(void);
17 void Delay5Ms(void);
18 void LcdWriteData( char dataW );
19 void LcdWriteCommand( Uchar CMD,Uchar AttribC );
20 void LcdReset( void );
21 void Display( Uchar dd );
22 void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
23 void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
24
25 //主程序
26 void main(void)
27 {
28 1 Uchar temp;
29 1
30 1 Delay400Ms(); //启动时必须的延时,等待lcm进入工作状态
31 1
32 1 LcdReset(); //这也是必需的....初始化
33 1 temp = 32;
34 1 ePutstr(0,0,exampl); //上面一行显示一个预定字符串
35 1
36 1 Delay400Ms(); //保留显示内容
37 1 Delay400Ms();
38 1 Delay400Ms();
39 1 Delay400Ms();
40 1 Delay400Ms();
41 1 Delay400Ms();
42 1 Delay400Ms();
43 1 Delay400Ms();
44 1
45 1 while(1)
46 1 {
47 2 temp &= 0x7f; //只显示ASCII字符
48 2
49 2 if (temp<32)temp=32; //屏蔽控制字符,不予显示
50 2 Display( temp++ );
51 2
52 2 Delay400Ms();
53 2 }
54 1 }
55
C51 COMPILER V7.09 8_1 08/23/2005 13:28:01 PAGE 2
56 //显示字符串
57 void ePutstr(Uchar x,Uchar y, Uchar code *ptr)
58 {
59 1 Uchar i,l=0;
60 1 while (ptr[l] >31){l++;};
61 1 for (i=0;i<l;i++) {
62 2 DispOneChar(x++,y,ptr[i]);
63 2 if ( x == 16 )
64 2 {
65 3 x = 0; y ^= 1;
66 3 }
67 2 }
68 1 }
69
70 // 演示一行连续字符串,配合上位程序演示移动字串
71 void Display( Uchar dd )
72 {
73 1
74 1 Uchar i;
75 1
76 1 for (i=0;i<16;i++)
77 1 {
78 2
79 2 DispOneChar(i,1,dd++);
80 2
81 2 dd &= 0x7f;
82 2 if (dd<32) dd=32;
83 2 }
84 1 }
85
86 // 显示光标定位
87 void LocateXY( char posx,char posy)
88 {
89 1
90 1 Uchar temp;
91 1
92 1 temp = posx & 0xf;
93 1 posy &= 0x1;
94 1 if ( posy )temp |= 0x40;
95 1 temp |= 0x80;
96 1 LcdWriteCommand(temp,0);
97 1 }
98
99 // 按指定位置显示数出一个字符
100 void DispOneChar(Uchar x,Uchar y,Uchar Wdata)
101 {
102 1 LocateXY( x, y ); // 定位显示地址
103 1 LcdWriteData( Wdata ); // 写字符
104 1 }
105
106 // 初始化程序, 必须按照产品资料介绍的初始化过程进行
107 void LcdReset( void ) {
108 1
109 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
110 1 Delay5Ms();
111 1 LcdWriteCommand( 0x38, 0); // 共三次
112 1 Delay5Ms();
113 1 LcdWriteCommand( 0x38, 0);
114 1 Delay5Ms();
115 1
116 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
117 1 LcdWriteCommand( 0x08, 1); // 显示关闭
C51 COMPILER V7.09 8_1 08/23/2005 13:28:01 PAGE 3
118 1 LcdWriteCommand( 0x01, 1); // 显示清屏
119 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
120 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
121 1 }
122
123 // 写控制字符子程序: E=1 RS=0 RW=0
124
125 void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
126 1
127 1 if (AttribC) while( Lcd1602StatusPort & Busy ); // 检测忙信号?
128 1 Lcd1602CmdPort = CMD;
129 1 }
130
131 // 当前位置写字符子程序: E =1 RS=1 RW=0
132 void LcdWriteData( char dataW ) {
133 1
134 1 while( Lcd1602StatusPort & Busy ); // 检测忙信号
135 1 Lcd1602WdataPort = dataW;
136 1 }
137
138 // 短延时
139 void Delay5Ms(void)
140 {
141 1 Uint i = 5552;
142 1 while(i--);
143 1 }
144
145 //长延时
146 void Delay400Ms(void)
147 {
148 1 Uchar i = 5;
149 1 Uint j;
150 1 while(i--)
151 1 {
152 2 j=7269;
153 2 while(j--);
154 2 };
155 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 346 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
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 + -