📄 irm.lst
字号:
C51 COMPILER V8.02 IRM 01/31/2009 14:04:30 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IRM
OBJECT MODULE PLACED IN irm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE irm.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "osc.h"
2 #include "irm.h"
3 #include "number.h"
4 #include "common.h"
5
6 unsigned char irm_code;//红外解码键值返回全局变量
7 bit flag ;// 上一位编码位
8
9
10 void extern2_init(void)
11 {
12 1 EA = 1;
13 1 IT2 = 1;//下降沿中断
14 1 EX2 = 1;
15 1 }
16
17 static unsigned char check_bit(unsigned char bit_num)
18 {
19 1 //最大检测7位
20 1 unsigned char irm_code0 = 0;
21 1 unsigned char i ;
22 1 unsigned int count ;
23 1 #define ERROR 0x10;
24 1 for(i=0;i<bit_num;i++)
25 1 {
26 2 count = 0 ;
27 2 irm_code0 = irm_code0<<1 ;
28 2 if(flag)
29 2 {
30 3 while(IRM_DQ)if(count++>10000) return ERROR;
31 3 if(count>150)
32 3 {
33 4 flag = 0 ;// 结束码为 10
34 4 }
35 3 else
36 3 {
37 4 flag = 1 ;// 结束码为 01
38 4 irm_code0 |= 0x01;
39 4 while(!IRM_DQ)if(count++>10000) return ERROR;
40 4 }
41 3 }
42 2 else // 结束码为 10
43 2 {
44 3 while(!IRM_DQ)if(count++>10000) return ERROR;
45 3 if(count>150)
46 3 {
47 4 flag = 1 ;// 结束码为 01
48 4 irm_code0 |= 0x01;
49 4 }
50 3 else
51 3 {
52 4 flag = 0 ;// 结束码为 10
53 4 while(IRM_DQ)if(count++>10000) return ERROR;
54 4 }
55 3 }
C51 COMPILER V8.02 IRM 01/31/2009 14:04:30 PAGE 2
56 2 }
57 1 return irm_code0 ; //解码成功 !!
58 1 }
59
60
61 //STC单片机特有的外部中断INT2实现红外解码
62 //解码结果由数据缓冲区返回
63 void IRMint(void) interrupt 6
64 {
65 1 unsigned int count;
66 1 unsigned char temp_code[2];
67 1
68 1 EA = 0;/*解码过程禁止其它中断发生*/
69 1 IRM_DQ = 1 ;
70 1 /*跳过1.5bit 起始码*/
71 1 {
72 2 count = 0;
73 2 while(!IRM_DQ)if(count++>1000) goto return_main;
74 2 count = 0;
75 2 while(IRM_DQ)if(count++>1000) goto return_main;
76 2 }
77 1 /*跳过1bit控制码和5bit用户码*/
78 1 {
79 2 flag = 0 ; //起始码以10结束
80 2 temp_code[0] = check_bit(6);
81 2 }
82 1 /*数据码*/
83 1 temp_code[1] = check_bit(6);
84 1 irm_code = temp_code[1] ; //返回键值
85 1 IE2 = 0 ;
86 1 EX2 = 0;
87 1 return_main:
88 1 EA = 1;
89 1 }
90
91
92 /*按键扫描*/
93 void key_scan(void)
94 {
95 1 unsigned int code timeH [] = {111,254,253,248,241,183};//{50,5000,2500,1000,500,100};
96 1 unsigned int code timeL [] = {255,143, 30,204,153,255};//{50,5000,2500,1000,500,100};
97 1
98 1 if(irm_code!=0) {
99 2 switch (irm_code)
100 2 {
101 3 case 30: acdc_flag ^= 0x01; break;
102 3 case 31: run_flag ^= 0x01; break;
103 3 case 34: if(pointxA > 0 ) pointxA--; break;
104 3 case 35: if(pointxA < WIDTH-2) pointxA++; break;
105 3 case 42: if(pointxB > 0 ) pointxB--; break;
106 3 case 43: if(pointxB < WIDTH-2) pointxB++; break;
107 3 case 45: if(pointyA > ZEROY-HEIGHT+1) pointyA--; break;
108 3 case 44: if(pointyA < ZEROY-2 ) pointyA++; break;
109 3 case 47: if(pointyB > ZEROY-HEIGHT+1) pointyB--; break;
110 3 case 46: if(pointyB < ZEROY-2 ) pointyB++; break;
111 3 case 48: if(val_tdiv > 0) val_tdiv--; break;
112 3 case 49: if(val_tdiv < 4) val_tdiv++; break;
113 3 case 54: if(val_vdiv > 0) val_vdiv--; break;
114 3 case 58: if(val_vdiv < 5) val_vdiv++; break;
115 3 case 55: if(movx > -(WIDTH/2-1)) movx--; break;
116 3 case 56: if(movx < (WIDTH/2-1)) movx++; break;
117 3 case 63: if(movy > -(HEIGHT/2)) movy--; break;
C51 COMPILER V8.02 IRM 01/31/2009 14:04:30 PAGE 3
118 3 case 57: if(movy < (HEIGHT/2)) movy++; break;
119 3 default: break;
120 3 }
121 2
122 2 RCAP2H = timeH[val_tdiv];
123 2 RCAP2L = timeL[val_tdiv];
124 2
125 2 irm_code=0;
126 2 BEEP_ON();
127 2 disp_vdiv();
128 2 disp_ypoint();
129 2 delay_ms(200);
130 2 BEEP_OFF();
131 2 delay(10000);
132 2 EX2 = 1;
133 2 }
134 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 621 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 2
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -