📄 yaok2.lst
字号:
C51 COMPILER V7.06 YAOK2 07/06/2007 15:26:22 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE YAOK2
OBJECT MODULE PLACED IN yaok2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE yaok2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /**********************************************************
2 *遥控解码程序(C语言)
3 *遥控IC型号:RSM2222-001 与PT6122,uPD6122相同
4 *版本:V0.2
5 *编程:飞扬
6 *学习C语言15天重写的,希望高手把你们写的好的程序贴出来给我们
7 *这些菜鸟看看!!.
8 *用12M晶振把引导信号检测次数改为10次
9 **********************************************************/
10 #include <sm8954a.h>
11 //引脚定义
12 //#define LED2 P0
13 #define LED P1
14 sbit Led = P1 ^ 7;
15 sbit Beep = P1^6;//P1.4脚音效输出
16 sbit P3_2 = P3^2;
17 sbit K2 = P2 ^ 2;
18 sbit K3 = P2 ^ 3;
19 sbit K4 = P2 ^ 4;
20 sbit K5 = P2 ^ 5;
21 static unsigned char data DT;
22 //函数声明
23 void delay1s();
24 void Delay400us();
25 void Sound();
26
27 /**********************************************************
28 *外中断0 遥控解码函数(子程序)
29 **********************************************************/
30 void IR() interrupt 0 using 3 //选择工作寄存器组
31 {
32 1 //LED=0xff;
33 1 //unsigned int a;
34 1 unsigned char i,k;
35 1 unsigned char KeyCoding[4]; //定义数组,存放接收到的数据
36 1 /*我的遥控按键编码 确定 上 下 左 右 菜单 退出*/
37 1 //unsigned char code KeyCode[9]={0x51,0x06,0x44,0x47,0x40,0x02,0x07,0x4b,0x03};
38 1 EA = 0; //关外中断0
39 1 if (P3_2==0) //P3.2低电平继续
40 1 {
41 2 for (i=20;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
42 2 {
43 3 Delay400us(); //延时438us
44 3 if (P3_2==1) //低电平引导信号出现高电平就跳出
45 3 {
46 4 EA = 1; //开外中断
47 4 return;
48 4 }
49 3 }
50 2 while(P3_2==0); //等待高电平引导信号到了.
51 2 for (i=10;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
52 2 {
53 3 Delay400us();
54 3 if (P3_2==0) //高电平引导信号出现低电平就跳出
55 3 {
C51 COMPILER V7.06 YAOK2 07/06/2007 15:26:22 PAGE 2
56 4 EA = 1; //开外中断
57 4 return;
58 4 }
59 3 }
60 2
61 2 while(P3_2==1); //等待高电平引导信号结束.
62 2 //接收4个字节的数据
63 2 for (k=0;k<4;k++)
64 2 {
65 3 for (i=8;i>0;i--) //8位数据
66 3 {
67 4 while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
68 4 Delay400us();
69 4 Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
70 4 KeyCoding[k]>>= 1; //右移1位
71 4 if(P3_2==1) //仍是1,最高位写入1,0跳过
72 4 KeyCoding[k]|= 0x80;
73 4 while(P3_2==1); //等待高电平结束
74 4 }
75 3 }
76 2 //比较地址码和地址反码,不同解码错误退出
77 2 if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
78 2 {
79 3 EA = 1; //开外中断
80 3 return;
81 3 }
82 2 Sound(); //解码成功声音提示.
83 2 }
84 1 switch (KeyCoding[2])
85 1 {//按键判断
86 2 case 0x14:
87 2 LED=0xfe;
88 2 DT = 1;//确定键
89 2 //这里添加代码
90 2 break;
91 2 case 0x11: //向上键
92 2 LED=0xfb;
93 2 DT = 1;
94 2 //这里添加代码
95 2 break;
96 2 case 0x09: //向下键
97 2 LED=0xef;
98 2 DT = 1;
99 2 //这里添加代码
100 2 break;
101 2 case 0x1b: //向左键
102 2 LED=0xdf;
103 2 DT = 1;
104 2 //这里添加代码
105 2 break;
106 2 case 0x12: //向右键
107 2 LED=0xfa;
108 2 DT = 1;
109 2 //这里添加代码
110 2 break;
111 2 case 0x16:
112 2 EA=1;
113 2 EX0=1; //标题菜单键
114 2 do
115 2 {
116 3 LED=0xfe;
117 3 delay1s();
C51 COMPILER V7.06 YAOK2 07/06/2007 15:26:22 PAGE 3
118 3 LED=0xfb;
119 3 delay1s();
120 3 LED=0xef;
121 3 delay1s();
122 3 LED=0xdf;
123 3 delay1s();
124 3 }while(1);
125 2 LED=0x00;
126 2 DT = 1;
127 2 //这里添加代码
128 2 break;
129 2 case 0x07: //系统设定键
130 2 LED=0x00;
131 2 DT = 1;
132 2 //这里添加代码
133 2 break;
134 2 case 0x18:
135 2 LED=0xff;
136 2 DT=1;
137 2 break;
138 2 }
139 1 EA = 1; //开外中断
140 1 //return;
141 1
142 1 }
143 /**********************************************************
144 *延时400us
145 **********************************************************/
146 void Delay400us() //晶振=12MHz 延时时间=404us
147 { //晶振=11.0592MHz 延时时间≈438us
148 1 unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
149 1 for (j=2;j>0;j--)
150 1 for (i=100;i>0;i--);
151 1 }
152 void delay1s()
153 {
154 1 unsigned int b;
155 1 for (b=6000;b>0;b--) //循环检测10次,低电平引导信号干扰检测(2700ms)
156 1 {
157 2 Delay400us(); //延时438us
158 2 }
159 1 }
160
161 /**********************************************************
162 *音效子程序
163 **********************************************************/
164 void Sound()
165 {
166 1 unsigned char k;
167 1 for (k=100;k>0;k--)
168 1 {
169 2 Beep=~Beep;
170 2 Delay400us();
171 2 }
172 1 }
173 void Delay(unsigned char a)//延时函数
174 {
175 1 unsigned char i;
176 1 while( --a != 0)
177 1 {
178 2 for(i = 0; i < 125; i++);
179 2 }
C51 COMPILER V7.06 YAOK2 07/06/2007 15:26:22 PAGE 4
180 1 }
181 void main(void)
182 {
183 1 unsigned int de;
184 1
185 1 //TMOD = 0x01; //定时器0方式1
186 1 EA = 1; //允许CPU中断
187 1 IT0 = 1; //INT0下降沿有效
188 1 EX0 = 1; //开INT0中断
189 1
190 1 P1 = 0xff;
191 1 do
192 1 {
193 2
194 2 if(K2 == 0)//判断K2是否被按下
195 2 {
196 3 Delay(10);//延时10MS
197 3 if(K2 == 0)//再次确定K2是否被按下
198 3 {
199 4 LED = 0xfe; //p1.3的LED被点亮
200 4 while(K2 == 0);//等待肯定K2的松开
201 4 LED = 0xff; //关闭P13的LED
202 4 }
203 3 }
204 2 if(K3 == 0)
205 2 {
206 3 Delay(10);
207 3 if(K3 == 0)
208 3 {
209 4 LED = 0xFB;
210 4 while(K3 == 0);
211 4 LED = 0xff;
212 4 }
213 3 }
214 2 if(K4 == 0)
215 2 {
216 3 Delay(10);
217 3 if(K4 == 0)
218 3 {
219 4 LED = 0xef;
220 4 while(K4 == 0);
221 4 LED = 0xff;
222 4 }
223 3 }
224 2 if(K5 == 0)
225 2 {
226 3 Delay(10);
227 3 if(K5 == 0)
228 3 {
229 4 LED = 0xdf;
230 4 while(K5 == 0);
231 4 LED = 0xff;
232 4 }
233 3 }
234 2
235 2 for (de=0; de<8000; de++)
236 2 Led = 1; //LED点亮
237 2 for (de=0; de<8000; de++)
238 2 Led = 0; //LED熄灭
239 2 if (DT)
240 2 {
241 3 EX0=0; //关闭外中断
C51 COMPILER V7.06 YAOK2 07/06/2007 15:26:22 PAGE 5
242 3 for (de=0; de<30000; de++) //这里起到按键值正确后会有一个延时,防止重复按键
243 3 Led = 1;
244 3 for (de=0; de<30000; de++)
245 3 Led = 0;
246 3
247 3 DT = 0;
248 3 }
249 2 EX0 = 1;
250 2 }while(1);
251 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 487 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 6
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 + -