📄 keyc.lst
字号:
C51 COMPILER V7.20 KEYC 02/20/2005 17:38:18 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE KEYC
OBJECT MODULE PLACED IN keyc.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE keyc.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*======YB-51-A单片机通用实验板按键和液晶屏显示演示程序===========================*/
2 /*======程序来源:远博科技 0371-6949037 13949105551 13603453895=======================*/
3 /*===================================================================
4
5 [注]:AT89C51的晶振频率为11.0592MHz
6 ====================================================================*/
7
8 /* ACM1602A (16x2)接线图
9 =====================================================================
10 连接线图: ACM-------51 ACM-------51 ACM--------51
11 DB0-----P0.0 DB4-----P0.4 RS-------P1_0
12 DB1-----P0.1 DB5-----P0.5 RW-------P1_1
13 DB2-----P0.2 DB6-----P0.6 E--------P1_2
14 DB3-----P0.3 DB7-----P0.7 BLA------P1_3
15
16 VLCD接1K电阻到GND
17
18 ====================================================================*/
19 /*阅读本程序之前,请参考光盘上带的LCD1602的工作原理(长沙太阳人科技公司提供)*/
20
21 #include <AT89X51.H>
22 #include <Delay.h>
23 #include <stdio.h>
24 #include <Intrins.h>
25 #define uchar unsigned char
26 #define uint unsigned int
27 // 1602连线
28 #define RS P1_0 //数据/命令选择
29 #define RW P1_1 //读/写选择
30 #define Elcm P1_2 //使能信号
31 #define BLA P1_3 //液晶显示屏背光
32
33 #define DataPort P0 // 数据端口
34 #define Busy 0x80
35
36 //按键定义
37 #define K1 P1_4
38 #define K2 P1_5
39 #define K3 P1_6
40 #define K4 P1_7
41
42 void WaitForEnable( void );
43 void LcdWriteData( char dataW );
44 void LcdWriteCommand( uchar CMD,uchar AttribC ) ;
45 void LcdReset( void ) ;
46 void DispOneChar(uchar x,uchar y,uchar Wdata) ;
47 void ePutstr(uchar x,uchar y, uchar code *ptr) ;
48 code char examp[]="Wellcom to Ybkj 0371-6949037";
49 code char examp1[]="K1 be pressed!";
50 code char examp2[]="K2 be pressed!";
51 code char examp3[]="K3 be pressed!";
52 code char examp4[]="K4 be pressed!";
53
54
55 void main(void) {
C51 COMPILER V7.20 KEYC 02/20/2005 17:38:18 PAGE 2
56 1 BLA=0; //打开液晶显示屏背光
57 1 LcdReset();
58 1 ePutstr(0,0,examp); // 液晶屏显示一个预定字符串
59 1 while(1) {
60 2 if(!K1) { DelayMs(5); //去抖动延时
61 3 if(!K1)
62 3 { LcdReset();
63 4 ePutstr(0,0,examp1); }
64 3 }
65 2
66 2 if(!K2) { DelayMs(5);
67 3 if(!K2)
68 3 {LcdReset();
69 4 ePutstr(0,0,examp2); }
70 3 }
71 2 if(!K3) { DelayMs(5);
72 3 if(!K3)
73 3 { LcdReset();
74 4 ePutstr(0,0,examp3); }
75 3 }
76 2 if(!K4) { DelayMs(5);
77 3 if(!K4)
78 3 { LcdReset();
79 4 ePutstr(0,0,examp4); }
80 3 }
81 2
82 2 } }
83
84
85 /*=======================================================
86 液晶屏上显示字符串
87 =======================================================*/
88 void ePutstr(uchar x,uchar y, uchar code *ptr) {
89 1 uchar i,l=0;
90 1 while (*ptr++ >0){l++;}; //统计字符的个数
91 1 ptr=ptr-(l+1); //使指针重新指向首个字符
92 1 for (i=0;i<l;i++) { DispOneChar(x++,y,*ptr++);
93 2 if ( x == 31 ) { x = 0; y ^= 0; }
94 2 }
95 1 }
96
97
98 /*=======================================================
99 显示光标定位
100 =======================================================*/
101 void Disp_XY( char posx,char posy) {
102 1
103 1 uchar temp;
104 1
105 1 temp = posx & 0x0f;
106 1 posy &= 0x1;
107 1 if ( posx>15 ) temp |= 0x40;
108 1 if (posy==1) temp |=0x40;
109 1 temp |= 0x80;
110 1 LcdWriteCommand(temp,0);
111 1 }
112
113 /*=======================================================
114 按指定位置显示数出一个字符
115 =======================================================*/
116 void DispOneChar(uchar x,uchar y,uchar Wdata) {
117 1
C51 COMPILER V7.20 KEYC 02/20/2005 17:38:18 PAGE 3
118 1 Disp_XY( x, y ); // 定位显示地址
119 1 LcdWriteData( Wdata ); // 写字符
120 1 }
121
122 /*=======================================================
123 初始化程序, 必须按照产品资料介绍的初始化过程进行
124 =======================================================*/
125 void LcdReset( void ) {
126 1
127 1 LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
128 1 DelayMs(10);
129 1 LcdWriteCommand( 0x38, 0); // 共三次
130 1 DelayMs(10);
131 1 LcdWriteCommand( 0x38, 0);
132 1 DelayMs(10);
133 1
134 1 LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
135 1 LcdWriteCommand( 0x08, 1); // 显示关闭
136 1 LcdWriteCommand( 0x01, 1); // 显示清屏
137 1 LcdWriteCommand( 0x06, 1); // 显示光标移动设置
138 1 LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
139 1 }
140
141 /*=======================================================
142 写控制字符子程序: E=1 RS=0 RW=0
143 =======================================================*/
144 void LcdWriteCommand( uchar CMD,uchar AttribC ) {
145 1
146 1 if (AttribC) WaitForEnable(); // 检测忙信号?
147 1 RS=0; RW=0; _nop_();
148 1 DataPort=CMD; _nop_();
149 1 // 送控制字子程序
150 1 Elcm=1;_nop_();_nop_();Elcm=0; // 操作允许脉冲信号
151 1 }
152
153 /*=======================================================
154 当前位置写字符子程序: E =1 RS=1 RW=0
155 =======================================================*/
156 void LcdWriteData( char dataW ) {
157 1
158 1 WaitForEnable();
159 1 // 检测忙信号
160 1
161 1 RS=1; RW=0; _nop_();
162 1
163 1 DataPort=dataW; _nop_();
164 1
165 1 Elcm=1; _nop_(); _nop_(); Elcm=0; // 操作允许脉冲信号
166 1
167 1 }
168
169 /*=======================================================
170 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
171 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
172 ========================================================*/
173 void WaitForEnable( void ) {
174 1
175 1 DataPort = 0xff;
176 1
177 1 RS=0; RW=1; _nop_(); Elcm=1; _nop_(); _nop_();
178 1
179 1 while( DataPort & Busy );
C51 COMPILER V7.20 KEYC 02/20/2005 17:38:18 PAGE 4
180 1 Elcm=0;
181 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 456 ----
CONSTANT SIZE = 90 ----
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 + -