📄 yk1602.lst
字号:
C51 COMPILER V8.02 YK1602 03/14/2009 10:50:20 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE YK1602
OBJECT MODULE PLACED IN yk1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE yk1602.c DEBUG OBJECTEXTEND
line level source
1 //遥控带液晶显示程序,已经调试完毕2008/10/30
2 //并可显示时钟
3 //若遥控接收不到,修改脉宽值即可
4 //
5 //-----------------------------------------------
6
7 //-----------------------------------------------
8 #include <reg51.h>
9 #include<intrins.h>
10 #include<absacc.h>
11
12 //变量类型标识的宏定义,
13 #define uchar unsigned char
14 #define uint unsigned int
15
16 #define DEDA 20
17 unsigned char deda=0;
18
19 // 1602 控制引脚定义,
20 sbit RS = P0^0;
21 sbit RW = P0^1;
22 sbit Elcm =P0^2;
23 #define DATAPORT P1 // 数据端口
24 #define busy 0x80 //用于检查写忙信号
25
26
27 //外键控制(本程序未用,现在用遥控控制)
28 sbit act=P2^1; /*加键*/
29 sbit deb=P2^0; /*减键*/
30 sbit cong=P2^2; /*功能键*/
31
32
33
34 char data led6[8];/*六位显示缓冲区*/
35
36 code char love[]="I LOVE YOU ";
37
38 code char time[]="0123456789ABCDEF:MinHour ";
39
40 unsigned char hour=0,min=0,sec=0;
41 bit menu=0;
42 bit up=0;
43 bit dw=0;
44 #define temp1 DBYTE[0x50]
45 #define temp2 DBYTE[0x51]
46 #define temp3 DBYTE[0x52]
47 #define temp4 DBYTE[0x53]
48 #define temp5 DBYTE[0x54]
49 //遥控
50 unsigned char yt; //中断次数
51 bit start=0; //起码标志
52 bit h=0; //解码标志
53 unsigned char da=0; //暂存数据
54 unsigned char gt=0,gv=0; //
55
C51 COMPILER V8.02 YK1602 03/14/2009 10:50:20 PAGE 2
56 //
57 void delay400ms(void);
58 void delay5ms(void);
59 void lcdreset( void ); //LCD RESET
60 void WaitForEnable( void ); //忙信号检测
61
62 void lcdwrite_c( uchar CMD,uchar AttribC );//
63 void DispOneChar(uchar x,uchar y,uchar Wdata);//显示一个字符
64 void LocateXY( char posx,char posy);
65 void LcdWrite_D( char dataW ) ; //写一个数据
66 void yk(void);
67 /*键盘检测*/
68 void acct_1(void);
69 unsigned char conh=0; /*功能键键值*/
70 void key_hit(unsigned char add3);
71 void delay(void);
72
73 /*定时初始化------------*/
74 void init_timer()
75 {
76 1 TMOD=0x11;
77 1 TH0=0x4c;
78 1 TL0=0x00;
79 1
80 1 IP=0x10;
81 1 IE=0X82;
82 1 TR0=1;
83 1 IT0=1; //边沿触发方式
84 1 EX0=1; //INT0
85 1
86 1 }
87 /*------------------------*/
88 /*----------显示缓冲区放数子程序--------------*/
89 void gift_in(void)
90 {
91 1 if(conh==0)
92 1 {
93 2 led6[0]=hour/10;
94 2 led6[1]=hour%10;
95 2 led6[2]=16;
96 2 led6[3]=min/10;
97 2 led6[4]=min%10;
98 2 led6[5]=16;
99 2 led6[6]=sec/10;
100 2 led6[7]=sec%10;
101 2 }
102 1 else if(conh==1)
103 1 {
104 2 led6[0]=17;
105 2 led6[1]=18;
106 2 led6[2]=19;
107 2 led6[3]=16;
108 2 led6[4]=min/10;
109 2 led6[5]=min%10;
110 2 led6[6]=24;
111 2 led6[7]=24;
112 2 }
113 1 else
114 1 {
115 2 led6[0]=20;
116 2 led6[1]=21;
117 2 led6[2]=22;
C51 COMPILER V8.02 YK1602 03/14/2009 10:50:20 PAGE 3
118 2 led6[3]=23;
119 2 led6[4]=16;
120 2 led6[5]=hour/10;
121 2 led6[6]=hour%10;
122 2 led6[7]=24;
123 2
124 2
125 2 }
126 1 }
127 /*----------时间判断子程序--------------*/
128
129 conv()
130 {
131 1 if(sec==60){min++;sec=0;}
132 1 if(min==60){hour++;min=0;}
133 1 if(hour==24) hour=0;
134 1
135 1 gift_in();
136 1 }
137 /*-----------中断服务程序-------------*/
138 void time8()interrupt 1 using 3
139 {
140 1 TH0=0x4c;
141 1 TL0=0x00;
142 1
143 1 deda++;
144 1 if(deda==DEDA)
145 1 {
146 2 sec++;deda=0;
147 2
148 2 }
149 1 conv();
150 1 }
151
152 /*-----------送显子程序-------------*/
153 void disp1(uchar x,uchar y)
154 {
155 1 unsigned char *pd;
156 1 unsigned char*kt;
157 1 unsigned char b;
158 1 kt=&led6[0]; /*送led的首地址给指针KT*/
159 1 for(b=0;b<8;b++)
160 1 { /* 显示六位*/
161 2 pd=&time[*kt]; /*查表---送要显示的码给指针pd*/
162 2 kt++; /*缓冲区加1*/
163 2 DispOneChar(x,y,*pd);
164 2 x++; //显示位置X
165 2 }
166 1 }
167
168 /*------------------------*/
169
170
171 /*=======================================================
172 显示字符串
173 =======================================================*/
174 void disp(uchar x,uchar y,char *ptr)
175 {
176 1 uchar i,l=0;
177 1 while (ptr[l] >31){l++;};
178 1 for (i=0;i<l;i++)
179 1 {
C51 COMPILER V8.02 YK1602 03/14/2009 10:50:20 PAGE 4
180 2 DispOneChar(x++,y,ptr[i]);
181 2 if ( x == 16 )
182 2 {
183 3 x = 0; y ^= 1;
184 3 }
185 2 }
186 1 }
187
188 /*=======================================================
189 按指定位置显示数出一个字符
190 =======================================================*/
191 void DispOneChar(uchar x,uchar y,uchar Wdata)
192 {
193 1
194 1 LocateXY( x, y ); // 定位显示地址
195 1 LcdWrite_D( Wdata ); // 写字符
196 1 }
197
198 /*=======================================================
199 显示光标定位
200 =======================================================*/
201 void LocateXY( char posx,char posy) {
202 1
203 1 uchar temp;
204 1
205 1 temp = posx & 0xf;
206 1 posy &= 0x1;
207 1 if ( posy )temp |= 0x40;
208 1 temp |= 0x80;
209 1 lcdwrite_c(temp,0);
210 1 }
211 //初始化
212 void lcdreset(void){
213 1 lcdwrite_c(0x38, 0); //显示模式设置(不测试忙信号)共三次
214 1 delay5ms();
215 1 lcdwrite_c(0x38, 0);
216 1 delay5ms();
217 1 lcdwrite_c(0x38, 0);
218 1 delay5ms();
219 1
220 1 lcdwrite_c( 0x38, 1);
221 1 lcdwrite_c( 0x08, 1);
222 1 lcdwrite_c( 0x01, 1);
223 1 lcdwrite_c( 0x06, 1);
224 1 lcdwrite_c( 0x0c, 1);
225 1
226 1 }
227
228
229
230 /*=======================================================
231 写控制字符子程序: E=1 RS=0 RW=0
232 =======================================================*/
233 void lcdwrite_c( uchar CMD,uchar AttribC )
234 {
235 1
236 1 if (AttribC) WaitForEnable(); // 检测忙信号?
237 1
238 1 RS = 0; RW = 0; _nop_();
239 1
240 1 DATAPORT =CMD; _nop_(); // 送控制字子程序
241 1
C51 COMPILER V8.02 YK1602 03/14/2009 10:50:20 PAGE 5
242 1 Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号
243 1 }
244
245 /*=======================================================*/
246 /*=======================================================
247 当前位置写字符子程序: E =1 RS=1 RW=0
248 =======================================================*/
249 void LcdWrite_D( char dataW )
250 {
251 1
252 1 WaitForEnable(); // 检测忙信号
253 1
254 1 RS = 1; RW = 0; _nop_();
255 1
256 1 DATAPORT = dataW; _nop_();
257 1
258 1 Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号
259 1
260 1 }
261
262 /*=======================================================
263 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
264 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
265 ========================================================*/
266 void WaitForEnable( void )
267 {
268 1
269 1 DATAPORT = 0xff;
270 1
271 1 RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
272 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -