📄 halir.lst
字号:
C51 COMPILER V8.01 HALIR 04/17/2008 09:46:51 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE HALIR
OBJECT MODULE PLACED IN .\Debug\halir.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ir\halir.c LARGE OPTIMIZE(9,SIZE) NOINTPROMOTE INCDIR(.\common;.\e2prom;.\f
-ile;.\fmtx;.\ir;.\keyboard;.\lcm;.\led;.\main;.\matrixkey;.\mp3ctrl;.\sd;.\usbhost;.\include;.\lib) DEBUG OBJECTEXTEND P
-RINT(.\Debug\halir.lst) OBJECT(.\Debug\halir.obj)
line level source
1 /****************************************************************
2 * Viaon Technology (Suzhou) Co.,Ltd
3 *
4 * Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
5 * All rights reserved.
6 *
7 *
8 * Filename: halir.c
9 *
10 * Programmer: Greg
11 *
12 * Created: 1/2/2008
13 *
14 * Description: public functions
15 *
16 *
17 * Change History (most recent first): 2008.1.2
18 ****************************************************************/
19
20
21 //VA4010 IR control will use the timer1 and external int1
22 //Only pin P3.3 can be used as IR input. So we doesnot need to change this pin assign.
23 #include "utiltypedef.h"
24 #include "va4010reg.h"
25 #include "common.h"
26 #include "halir.h"
27 #include "timer.h"
28
29 #define IR_STATUS_IDLE 0X01
30 #define IR_STATUS_START 0X02
31 #define IR_STATUS_DATA 0X03
32 #define IR_STATUS_STOP 0X04
33
34
35 sbit IR_PIN=P3^3;
36 static volatile BYTE data irstatus;
37 static volatile BYTE data ircnt;
38
39
40 static volatile DWORD irdata;
41 static volatile BYTE data irdone = 0; //0: not ready, 1: ready
42
43 void halIRINTInit(void)
44 {
45 1 //Set msb 4bit only for timer1
46 1 TMOD &= 0X0F;
47 1 TMOD |= 0x10;
48 1
49 1 //time1 INT
50 1 //PT1 = 1; //Set timer1 int as high priority
51 1
52 1 /*External INT1 Enable*/
53 1 EX1 = 1; //Negative level sensitive, IT1 = 0
C51 COMPILER V8.01 HALIR 04/17/2008 09:46:51 PAGE 2
54 1 //PX1 = 1; // Set INT1 Priority as High
55 1 irstatus = IR_STATUS_IDLE;
56 1
57 1 return;
58 1 }
59
60
61 /*---------------------------------TIMER1 ISR--------------------------------------------*/
62 void halT1ISR(void) interrupt 3 using 2
63 {
64 1 //DISABLE_INTERRUPTS;
65 1 TF1 = 0; //timer 1 overflow flag clear
66 1 TH1 = 0;
67 1 TL1 = 0;
68 1 ET1 = 0; //Disable timer1 INT
69 1 EX1 = 1;//Enable external INT1
70 1
71 1 /*------------------------------------------------------*/
72 1 //check INT1 pin, P3.3
73 1 if(IR_PIN == 0){
74 2 irstatus = IR_STATUS_IDLE;
75 2 }
76 1
77 1 //ENABLE_INTERRUPTS;
78 1 return;
79 1 }
80
81 /*---------------------------------External INT1 ISR--------------------------------------------*/
82 /*
83 3.5ms / 2us = 0x06D6
84 4.5ms / 2us = 0X08CA
85 2.25ms / 2us = 0x0465
86 1.0ms / 2us = 0x01F4
87
88 1.7ms / 2us = 0x0352
89 0.65ms /2us = 0x0145
90 0.6ms / 2us = 0x012c
91 0.4ms / 2us = 0x00C8
92 0.3ms / 2us = 0x0096
93 */
94 static volatile DWORD dwPrevIrData = 0Xffffffff;
95 static volatile BYTE data byRepeatCnt = 0;
96 void halINT1ISR(void) interrupt 2 using 3
97 {
98 1 //Disable external INT1
99 1 EX1 = 0;
100 1
101 1 switch(irstatus){
102 2 case IR_STATUS_IDLE:
103 2 //Check leader code
104 2 TH1 = TIMER_10MS_TH; // ??软件定时器中断 对6MHz
105 2 TL1 = TIMER_10MS_TL;
106 2 irstatus = IR_STATUS_START;
107 2 break;
108 2
109 2 case IR_STATUS_START:
110 2 if( (TH1<0X09)&&(TH1>0X04) ){ //Interval: 2.56ms -> 4.6ms
111 3 irstatus = IR_STATUS_DATA;
112 3 ircnt = 0;
113 3 irdata = 0;
114 3 byRepeatCnt = 0;
115 3 }else if(TH1<0x4){
C51 COMPILER V8.01 HALIR 04/17/2008 09:46:51 PAGE 3
116 3 irstatus = IR_STATUS_IDLE;
117 3 irdata = dwPrevIrData;
118 3 if(byRepeatCnt > 6)
119 3 {
120 4 irdone = 1;
121 4 byRepeatCnt = 5;
122 4 }
123 3 byRepeatCnt++;
124 3 }
125 2 else{
126 3 irstatus = IR_STATUS_IDLE;
127 3 }
128 2 TH1 = TIMER_P8MS_TH; // ??软件定时器中断 对6MHz
129 2 TL1 = TIMER_P8MS_TL;
130 2 break;
131 2
132 2 case IR_STATUS_DATA:
133 2 if((TH1<0X04)&&(TH1>0X01)){ //Interval: 1.024ms -> 2.048ms
134 3 #if 0
irdata = (irdata|0x01);
#else
137 3 irdata |= 0x80000000;
138 3 #endif
139 3 }else if((TH1<=0X01)){
140 3 //irdata = (irdata<<1);
141 3 }else{
142 3 //irstatus = IR_STATUS_IDLE;
143 3 }
144 2
145 2 ircnt ++;
146 2 if(ircnt >= 32){
147 3 //irstatus = IR_STATUS_STOP;
148 3 irstatus = IR_STATUS_IDLE;
149 3 irdone = 1;
150 3 dwPrevIrData = irdata;
151 3
152 3 //IRTicks = 0; //IR input again
153 3 //UartOutValue(irdata, 8);
154 3 }else{
155 3 #if 0
irdata = (irdata<<1);
#else
158 3 irdata = (irdata >> 1);
159 3 #endif
160 3 }
161 2 TH1 = TIMER_P8MS_TH; // ??软件定时器中断 对6MHz
162 2 TL1 = TIMER_P8MS_TL;
163 2 break;
164 2 }
165 1
166 1 ET1 = 1; //打开T1中断
167 1 TR1 = 1; //启动T1
168 1
169 1 return;
170 1 }
171
172 //Clear the dwPrevIrData, byRepeatCnt
173 #define IR_CLEAR_INTERVAL 10 // 100ms unit
174 #if 0
static void _halIRClr(void)
{
//If no IR input in 2Seconds, clear the IR repeat variables to avoid the IR disturb.
C51 COMPILER V8.01 HALIR 04/17/2008 09:46:51 PAGE 4
if(IRTicks > IR_CLEAR_INTERVAL){
//dwPrevIrData = IR_CODE_INVALID;
dwPrevIrData = 0X00;
byRepeatCnt = 0;
IRTicks = 0;
}
return;
}
#endif
189
190 BYTE halIRGet(DWORD *pIRDat)
191 {
192 1 BYTE data ret = IR_NULL;
193 1
194 1 if(irdone == 1){
195 2 irdone = 0;
196 2 IRTicks = 0; //IR input again
197 2 *pIRDat = irdata;
198 2 ret = IR_LEAD;
199 2
200 2 if(byRepeatCnt != 0)
201 2 ret = IR_REPEAT;
202 2 }else if(IRTicks > IR_CLEAR_INTERVAL){
203 2 //dwPrevIrData = IR_CODE_INVALID;
204 2 dwPrevIrData = 0Xffffffff;
205 2 byRepeatCnt = 0;
206 2 //IRTicks = 0;
207 2 }
208 1
209 1 return ret;
210 1 }
211
212
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 296 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 8 ----
PDATA SIZE = ---- ----
DATA SIZE = 4 1
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 + -