📄 ir- motor-lcd1602.lst
字号:
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IR__MOTOR_LCD1602
OBJECT MODULE PLACED IN IR- MOTOR-LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IR- MOTOR-LCD1602.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****************************************************************/
2 /* *
3 /* ME500单片机开发系统演示程序 - 红外遥控步进电机 *
4 /* *
5 /* LCD1602显示 *
6 /* *
7 /* 版本: V1.0 (2006/11/20) *
8 /* 作者: gguoqing (Email: gguoqing@willar.com) *
9 /* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界)*
10 /* 时间: 2006/06/03 *
11 /* *
12 /*【版权】COPYRIGHT(C)伟纳电子 www.willar.com ALL RIGHTS RESERVED *
13 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
14 /* *
15 /*****************************************************************/
16
17 #include <reg51.h> //51芯片管脚定义头文件
18 #include <intrins.h> //内部包含延时函数 _nop_();
19
20 #define uchar unsigned char
21 #define uint unsigned int
22 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
23
24
25 uchar code FFW[8]= {0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
26 uchar code REV[8]= {0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
27
28 uchar IRCOM[6]=(0x00,0x00,0x00,0x00,0x00,0x00);
29
30 sbit BEEP = P3^7; //蜂鸣器
31 sbit IRIN=P3^2; //红外接收端口
32
33 sbit LCD_RS = P2^0;
34 sbit LCD_RW = P2^1;
35 sbit LCD_EN = P2^2;
36
37 bit on_off=0; //运行与停止标志
38 bit direction=1; //方向标志
39 bit rate_dr=1; //速率标志
40 bit snum_dr=1; //圈数标志
41 bit flag; //红外接收有效标志
42 bit pause1=0; //暂停标志
43
44 //uchar code cdis1[ ] = {" STEPPING MOTOR "};
45 //uchar code cdis2[ ] = {"CONTROL PROCESS"};
46
47 uchar code cdis1[ ] = {" IR CONTROL "};
48 uchar code cdis2[ ] = {" STEPPING MOTOR "};
49
50 uchar code cdis3[ ] = {"IR:--H STOP "};
51 uchar code cdis4[ ] = {"NUM: RATE: "};
52 uchar code cdis5[ ] = {" RUN "};
53 uchar code cdis6[ ] = {" STOP"};
54 uchar code cdis7[ ] = {"PAUSE"};
55
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 2
56 uchar m,v=0,q=0;
57
58 uchar number=0,number1=0;
59 uchar snum=10,snum1=10; //预设定圈数
60 uchar rate=8; //预设定速率
61 uchar data_temp,data_temp1,data_temp2;
62 uchar TEMP;
63
64 void IR_IN();
65 /********************************************************/
66 /*
67 /* 延时t毫秒
68 /* 11.0592MHz时钟,延时约1ms
69 /*
70 /********************************************************/
71 void delay(uint t)
72 {
73 1 uchar k;
74 1 while(t--)
75 1 {
76 2 for(k=0; k<125; k++)
77 2 { }
78 2 }
79 1 }
80
81 /********************************************************/
82 void delayB(uchar x) //x*0.14MS
83 {
84 1 uchar i;
85 1 while(x--)
86 1 {
87 2 for (i=0; i<13; i++)
88 2 { }
89 2 }
90 1 }
91
92 /********************************************************/
93 void beep()
94 {
95 1 uchar j;
96 1 for (j=0;j<100;j++)
97 1 {
98 2 delayB(5);
99 2 BEEP=!BEEP; //BEEP取反
100 2 }
101 1 BEEP=1; //关闭蜂鸣器
102 1 }
103
104 /********************************************************/
105 /*
106 /*检查LCD忙状态
107 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
108 /*
109 /********************************************************/
110 bit lcd_busy()
111 {
112 1 bit result;
113 1 LCD_RS = 0;
114 1 LCD_RW = 1;
115 1 LCD_EN = 1;
116 1 delayNOP();
117 1 result = (bit)(P0&0x80);
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 3
118 1 LCD_EN = 0;
119 1 return(result);
120 1 }
121
122 /********************************************************/
123 /*
124 /*写指令数据到LCD
125 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
126 /*
127 /********************************************************/
128 void lcd_wcmd(uchar cmd)
129 {
130 1 while(lcd_busy());
131 1 LCD_RS = 0;
132 1 LCD_RW = 0;
133 1 LCD_EN = 0;
134 1 _nop_();
135 1 _nop_();
136 1 P0 = cmd;
137 1 delayNOP();
138 1 LCD_EN = 1;
139 1 delayNOP();
140 1 LCD_EN = 0;
141 1 }
142
143 /********************************************************/
144 /*
145 /*写显示数据到LCD
146 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
147 /*
148 /********************************************************/
149 void lcd_wdat(uchar dat)
150 {
151 1 while(lcd_busy());
152 1 LCD_RS = 1;
153 1 LCD_RW = 0;
154 1 LCD_EN = 0;
155 1 P0 = dat;
156 1 delayNOP();
157 1 LCD_EN = 1;
158 1 delayNOP();
159 1 LCD_EN = 0;
160 1 }
161
162 /********************************************************/
163 /*
164 /* LCD初始化设定
165 /*
166 /********************************************************/
167 void lcd_init()
168 {
169 1 delay(30);
170 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
171 1 delay(5);
172 1 lcd_wcmd(0x38);
173 1 delay(5);
174 1 lcd_wcmd(0x38);
175 1 delay(5);
176 1
177 1 lcd_wcmd(0x0c); //显示开,关光标
178 1 delay(5);
179 1 lcd_wcmd(0x06); //移动光标
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 4
180 1 delay(5);
181 1 lcd_wcmd(0x01); //清除LCD的显示内容
182 1 delay(5);
183 1 }
184
185 /********************************************************/
186 /*
187 /* 设定显示位置
188 /*
189 /********************************************************/
190 void lcd_pos(uchar pos)
191 {
192 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
193 1 }
194
195 /********************************************************/
196 /*
197 /* LCD1602初始显示子程序
198 /*
199 /********************************************************/
200 void LCD_init_DIS()
201 {
202 1 delay(10); //延时
203 1 lcd_init(); //初始化LCD
204 1
205 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
206 1 for(m=0;m<16;m++)
207 1 lcd_wdat(cdis1[m]);
208 1
209 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
210 1 for(m=0;m<16;m++)
211 1 lcd_wdat(cdis2[m]);
212 1
213 1 delay(3000); //延时
214 1
215 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
216 1 for(m=0;m<16;m++)
217 1 lcd_wdat(cdis3[m]);
218 1
219 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
220 1 for(m=0;m<16;m++)
221 1 lcd_wdat(cdis4[m]);
222 1
223 1 for(m=0;m<2;m++)
224 1 {
225 2 lcd_pos(0x0d+m); //显示方向符号
226 2 lcd_wdat(0x3e);
227 2 }
228 1
229 1 }
230 /********************************************************/
231 /*
232 /*数据转换子程序
233 /*
234 /********************************************************/
235 void data_conv()
236 {
237 1 data_temp1=data_temp/10; //高位
238 1 if(data_temp1==0)
239 1 {data_temp1=0x20;} //高位为0不显示
240 1 else
241 1 {data_temp1=data_temp1+0x30;}
C51 COMPILER V8.02 IR__MOTOR_LCD1602 12/22/2006 09:46:41 PAGE 5
242 1
243 1 data_temp2=data_temp%10; //低位
244 1 data_temp2=data_temp2+0x30;
245 1 }
246
247 void code_conv()
248 {
249 1 IRCOM[5]=IRCOM[2];
250 1 IRCOM[6]=IRCOM[5]&0x0f; //低位
251 1
252 1 if(IRCOM[6]>0x09)
253 1 IRCOM[6]=IRCOM[6]+0x37;
254 1 else
255 1 IRCOM[6]=IRCOM[6]+0x30;
256 1
257 1 IRCOM[5]=(IRCOM[5]&0xf0)>>4; //高位
258 1 if(IRCOM[5]>0x09)
259 1 IRCOM[5]=IRCOM[5]+0x37;
260 1 else
261 1 IRCOM[5]=IRCOM[5]+0x30;
262 1 }
263
264 /********************************************************/
265 /*
266 /*数据显示子程序
267 /*
268 /********************************************************/
269 void data_dis()
270 {
271 1 code_conv();
272 1 lcd_pos(0x03);
273 1 lcd_wdat(IRCOM[5]);
274 1 // lcd_pos(0x08);
275 1 lcd_wdat(IRCOM[6]);
276 1
277 1 data_temp = snum; //显示圈数
278 1 data_conv();
279 1 lcd_pos(0x44);
280 1 lcd_wdat(data_temp1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -