📄 dimmer.lst
字号:
200 1 }
201
202 /************************************************************************
203 函数说明:发送DMX512数据(一帧)
204 备注 :波特率为250Kbit/s 共发送210次数据(MAX_ADDR) 则发送一轮数据需
205 44*210+88+8+8=9344us
206 ************************************************************************/
207 void DMX512_SendData(uchar TxBuf)
208 {
209 1 uchar i;
210 1
211 1 TXD = 0; // Break
212 1 Delay10us(10); // Delay 100us instead 88us
213 1 TXD = 1; // Mark-after-break
214 1 Delay10us(1);
215 1
216 1 TB8 = 1; // the tenth bit that is the first stop bit
217 1 for(i=0;i<MAX_ADDR;i++){
218 2 TI = 0; // 清发送中断标志位
219 2 SBUF = TxBuf; // 发送数据
220 2 while(!TI); // 等待数据发送完毕
221 2 }
222 1 TXD = 1; // 置数据空闲位
223 1 }
224
225 void TurnOff_Output(void)
226 {
227 1 uchar i;
228 1
229 1 TXD = 0; // Break
230 1 Delay10us(10); // Delay 100us instead 88us
231 1 TXD = 1; // Mark-after-break
232 1 Delay10us(1);
233 1
234 1 TB8 = 1; // the tenth bit that is the first stop bit
235 1 for(i=0;i<MAX_ADDR;i++){
236 2 TI = 0; // 清发送中断标志位
237 2 SBUF = 0x00; // 发送数据
238 2 while(!TI); // 等待数据发送完毕
239 2 }
240 1 TXD = 1; // 置数据空闲位
241 1 }
C51 COMPILER V8.02 DIMMER 03/27/2009 09:21:37 PAGE 5
242
243 /************************************************************************
244 输入参数:无
245 返回参数:BIT[2-0]对应DEC,INC,POWER,值为1表示按键按下
246 备注 :KEY_POWER -> P2.5
247 KEY_INC -> P2.6
248 KEY_DEC -> P2.7
249 ************************************************************************/
250 uchar KeyScan(void)
251 {
252 1 uchar i, KeyValue;
253 1
254 1 if((P2 & KEY_MASK)== KEY_MASK) return(NONE); //无按键按下
255 1 Delay1ms(20); //有按键按下,则延时消抖
256 1 if((P2 & KEY_MASK)== KEY_MASK) return(NONE); //误触发
257 1
258 1 if(PowerState) LED = !LED;
259 1
260 1 KeyValue = (~(P2>>5)) & 0x07;
261 1
262 1 for(i=0;i<20;i++){
263 2 Delay1ms(10);
264 2 if((P2 & KEY_MASK)== KEY_MASK) break; //按键松开
265 2 }
266 1
267 1 if(PowerState) LED = !LED;
268 1
269 1 if(i<20) return KeyValue; //没有超时
270 1 else return OVERTIME; //按键按下超过200ms
271 1 }
272
273
274 void main(void)
275 {
276 1 uchar KeyValue; //按键返回值(可能为NONE,OVERTIME或有效按键值1~7)
277 1 uchar i;
278 1
279 1 Sys_Init(); //系统初始化
280 1 DataResume(); //从EEPROM中读取数据:电源开关状态和LED灰度值
281 1 EnableInterrupt();
282 1
283 1 while(1)
284 1 {
285 2 KeyValue = KeyScan(); //扫描按键
286 2
287 2 if (KeyValue==NONE){ //无按键按下
288 3 if (PowerState){ //控制面板上的LED开关
289 4 LED = ON;
290 4 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
291 4 } else {
292 4 LED = OFF;
293 4 TurnOff_Output(); //关闭调光器输出
294 4 }
295 3 }
296 2 else if (KeyValue==OVERTIME){ //按键按下超时,快速调节模式
297 3 if (!KEY_POWER){ //KEY_POWER键按下
298 4 while(!KEY_POWER); //等待按键松开
299 4 Delay1ms(20);
300 4 while(!KEY_POWER); //等待按键松开
301 4 if(PowerState){
302 5 PowerState = OFF;
303 5 TurnOff_Output();
C51 COMPILER V8.02 DIMMER 03/27/2009 09:21:37 PAGE 6
304 5 }else{
305 5 PowerState = ON;
306 5 DMX512_SendData(CodingTable[GreyLevel]);
307 5 }
308 4 DataSave(); //记录下控制参数
309 4 }
310 3 else if (!KEY_INC){ //KEY_INC键按下
311 4 if(PowerState == OFF) continue; //在电源关闭的情况下禁止调光
312 4 i = 0;
313 4 while(!KEY_INC){ //KEY_INC键持续按下过程中
314 5 if(GreyLevel < GREY_LEVEL_MAX){
315 6 GreyLevel++;
316 6 DMX512_SendData(CodingTable[GreyLevel]); //调光
317 6 Delay1ms(20); //此处延时影响连续调光时的平滑程度及调节速度
318 6 if(++i >= 6){ //6分频,周期120ms
319 7 i = 0;
320 7 LED = !LED;
321 7 }
322 6 } else {
323 6 GreyLevel = GREY_LEVEL_MAX;
324 6 //DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
325 6 //Delay1ms(40);
326 6 //LED = !LED;
327 6 }
328 5 }
329 4 LED = ON;
330 4 DataSave();
331 4 }
332 3 else if (!KEY_DEC){ //KEY_DEC键按下
333 4 if(PowerState == OFF) continue; //在电源关闭的情况下禁止调光
334 4 i = 0;
335 4 while(!KEY_DEC){ //KEY_DEC键持续按下过程中
336 5 if(GreyLevel > GREY_LEVEL_MIN){
337 6 GreyLevel--;
338 6 DMX512_SendData(CodingTable[GreyLevel]); //调光
339 6 Delay1ms(20); //此处延时影响连续调光时的平滑程度及调节速度
340 6 if(++i >= 6){ //6分频,周期120ms
341 7 i = 0;
342 7 LED = !LED;
343 7 }
344 6
345 6 } else {
346 6 GreyLevel = GREY_LEVEL_MIN;
347 6 //DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
348 6 //Delay1ms(40);
349 6 //LED = !LED;
350 6 }
351 5 }
352 4 LED = ON;
353 4 DataSave();
354 4 }
355 3 }
356 2 else { //单击模式
357 3 if(KeyValue & 0x01){ //KEY_POWER键按下
358 4 if(PowerState){ //切换开关状态
359 5 PowerState = OFF;
360 5 TurnOff_Output();
361 5 }else{
362 5 PowerState = ON;
363 5 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
364 5 }
365 4 }
C51 COMPILER V8.02 DIMMER 03/27/2009 09:21:37 PAGE 7
366 3 else if(KeyValue & 0x02){ //KEY_INC键按下
367 4 if(PowerState == ON){
368 5 if(GreyLevel < GREY_LEVEL_MAX){
369 6 GreyLevel++;
370 6 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
371 6 } else {
372 6 GreyLevel = GREY_LEVEL_MAX;
373 6 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
374 6 }
375 5 }
376 4 }
377 3 else if(KeyValue & 0x04){ //KEY_DEC键按下
378 4 if(PowerState == ON){
379 5 if(GreyLevel > GREY_LEVEL_MIN){
380 6 GreyLevel--;
381 6 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
382 6 } else {
383 6 GreyLevel = GREY_LEVEL_MIN;
384 6 DMX512_SendData(CodingTable[GreyLevel]); //向调光器发送数据
385 6 }
386 5 }
387 4 }
388 3 DataSave(); //重新保存LED控制参数
389 3 }
390 2 }
391 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 603 ----
CONSTANT SIZE = 74 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 4
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 + -