📄 lyd.lst
字号:
C51 COMPILER V8.02 LYD 04/22/2008 11:38:52 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LYD
OBJECT MODULE PLACED IN lyd.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE lyd.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*===========================================================================
3
4 KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式 晓奇
5 =============================================================================
6 连接线图: LCM-------51 LCM-------51 LCM--------51
7 DB0-----P0.0 DB4-----P0.4 RW-------P2.0
8 DB1-----P0.1 DB5-----P0.5 RC-------P2.1
9 DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd
10 DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND
11
12 [注]:AT89C51的晶振频率为12MHz
13 ============================================================================*/
14 // 产生汇编文件
15 #include <reg51.h>
16 #include<intrins.h> //#pragma src
17
18 //========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
19 #define Uchar unsigned char
20 #define Uint unsigned int
21
22 // ================= LCM1602A端口地址定义 =======================
23 char xdata Lcd1602CmdPort _at_ 0x8cff; //E=1 RS=0 RW=0
24 char xdata Lcd1602WdataPort _at_ 0x8dff; //E =1 RS=1 RW=0
25 char xdata Lcd1602StatusPort _at_ 0x8eff; //CS=1 RS=0 RW=1
26
27
28 unsigned long temp1=0;
29 unsigned int dis=0,i;
30 unsigned int counter=0; /*等待1ms的计数位 */
31 bit disable_flag; /*距离太远无法测量标志, 1:太远不可测; 0:可测 */
32 bit receive_flag; /*接收标志位 1:收到; 0:没收到 */
33 sbit transmit=P1^1; /*发送控制 1:发; 0:停 */
34 sbit reset=P1^2; /*接收触发器复位,0复位,下一个1时允许中断,后又必须复位*/
35
36
37 #define Busy 0x80 // 忙判别位
38
39 code char exampl[]= "No success! ";
40 code char examp2[]= "Dis is: cm";
41 code char examp3[]= "Waiting.....";
42
43 void Delay400Ms(void);
44 void Delay5Ms(void);
45 void LcdWriteData( char dataW );
46 void LcdWriteCommand( Uchar CMD,Uchar AttribC );
47 void LcdReset( void );
48 void Display( Uchar dd );
49 void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
50 void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
51 void DispNumber(Uint Num);
52
53 /*=======================================================
54 显示字符串
55 =======================================================*/
C51 COMPILER V8.02 LYD 04/22/2008 11:38:52 PAGE 2
56 void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
57 1 Uchar i,l=0;
58 1 while (ptr[l] >31){l++;};
59 1 for (i=0;i<l;i++) {
60 2 DispOneChar(x++,y,ptr[i]);
61 2 if ( x == 16 ){
62 3 x = 0; y ^= 1;
63 3 }
64 2 }
65 1 }
66
67 /*=======================================================
68 演示一行连续字符串,配合上位程序演示移动字串
69 =======================================================*/
70 void Display( Uchar dd ) {
71 1
72 1 Uchar i;
73 1
74 1 for (i=0;i<16;i++) {
75 2
76 2 DispOneChar(i,1,dd++);
77 2
78 2 dd &= 0x7f;
79 2 if (dd<32) dd=32;
80 2 }
81 1 }
82
83 /*=======================================================
84 显示光标定位
85 =======================================================*/
86 void LocateXY( char posx,char posy) {
87 1
88 1 Uchar temp;
89 1
90 1 temp = posx & 0x0f;//取底四位
91 1 posy &= 0x1;//取最后一位
92 1 if ( posy )temp |= 0x40;
93 1 temp |= 0x80;
94 1 LcdWriteCommand(temp,0);
95 1 }
96
97 /*=======================================================
98 按指定位置显示数出一个字符
99
100
101 =======================================================*/
102 void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
103 1
104 1 LocateXY( x, y ); // 定位显示地址
105 1 LcdWriteData( Wdata ); // 写字符
106 1 }
107
108 /*=======================================================
109 初始化程序, 必须按照产品资料介绍的初始化过程进行
110 =======================================================*/
111 void LcdReset( void ) {
112 1
113 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
114 1 Delay5Ms();
115 1 LcdWriteCommand( 0x38, 0); // 共三次
116 1 Delay5Ms();
117 1 LcdWriteCommand( 0x38, 0);
C51 COMPILER V8.02 LYD 04/22/2008 11:38:52 PAGE 3
118 1 Delay5Ms();
119 1
120 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
121 1 LcdWriteCommand( 0x08, 1); // 显示关闭
122 1 LcdWriteCommand( 0x01, 1); // 显示清屏
123 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
124 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
125 1 }
126
127 /*=======================================================
128 写控制字符子程序: E=1 RS=0 RW=0
129 =======================================================*/
130 void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
131 1
132 1 if (AttribC) while( Lcd1602StatusPort & Busy ); // 检测忙信号?
133 1 Lcd1602CmdPort = CMD;
134 1 }
135
136 /*=======================================================
137 当前位置写字符子程序: E =1 RS=1 RW=0
138 =======================================================*/
139 void LcdWriteData( char dataW ) {
140 1
141 1 while( Lcd1602StatusPort & Busy ); // 检测忙信号
142 1 Lcd1602WdataPort = dataW;
143 1 }//
144
145 // 短延时
146 void Delay5Ms(void)
147 {
148 1 Uint i = 5552;
149 1 while(i--);
150 1 }
151
152 //长延时
153 void Delay400Ms(void)
154 {
155 1 Uchar i = 5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -