📄 ps.lst
字号:
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE PS
OBJECT MODULE PLACED IN PS.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h>
2 #include <REG922.H>
3 #include <intrins.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 uchar code dout[5]={0x01,0x42,0x00,0x00,0x00};
8 uchar data din[5]={0x00,0x00,0x00,0x00,0x00};
9 uint code hos_tabup[16]={0xE31B,0xF800,0xF50D,0xFF07,0xDE26,0x0000,0x0000,0xDF27, //主手柄释放键表
10 0x877F,0xB941,0xBA42,0x8870,0xDC24,0xA159,0xD820,0xA058};
11 uint code hos_tabdn[16]={0x639B,0x7880,0x758D,0x7F87,0x5EA6,0x0000,0x0000,0x5FA7, //主手柄按键表
12 0x07FF,0x39C1,0x3AC2,0x08F0,0x5CA4,0x21D9,0x58A0,0x20D8};
13 /*uint code hos_tabup[16]={0x0000,0x8870,0x877F,0x0000,0xDE26,0x0000,0x0000,0xDF27, //主手柄释放键表
14 0xF50D,0xFF07,0xE31B,0xF800,0xDC24,0xA159,0xD820,0xA058};
15 uint code hos_tabdn[16]={0x0000,0x08F0,0x07FF,0x0000,0x5EA6,0x0000,0x0000,0x5FA7, //主手柄按键表
16 0x758D,0x7F87,0x639B,0x7880,0x5CA4,0x21D9,0x58A0,0x20D8}; */
17 uint code gue_tabup[16]={ 0x9961,0x9A62,0x9B63,0x8B73,0x0000,0x0000,0x0000,0x0000, //副手柄释放键表
18 0xB149,0xA35B,0xFC04,0xF901,0x0000,0x0000,0x0000,0x0000};
19 uint code gue_tabdn[16]={ 0x19E1,0x1AE2,0x1BE3,0x0BF3,0x0000,0x0000,0x0000,0x0000, //副手柄按键表
20 0x31C9,0x23DB,0x7C84,0x7981,0x0000,0x0000,0x0000,0x0000};
21 //unsigned long endcode=0x0005AA8A; //结束码的红外发射码 ,
22 uint KEY_hos[2]={0xFFFF,0xFFFF}; //主游戏手柄扫描值,
23 uint KEY_gue[2]={0xFFFF,0xFFFF}; //副游戏手柄扫描值,
24 uint ir_key; //标准红外码缓冲,
25 uint chan_key; //手柄按键有变化的位,
26 uint stat_key; //当前手柄的状态值,
27
28 unsigned long ref;
29 unsigned long idata irbuf[32]; //红外输出缓冲区,
30 unsigned long *p_t; //指向红外缓冲区的两个指针,
31 unsigned long *p_b;
32 bit bdata Buf_emp=1; //红外输出缓冲区空标志,
33 bit bdata Bit_F=0; //红外输出的移位标志,
34 bit bdata Buf_ful=0; //红外输出缓冲区满标志
35 bit bdata Saf_F=0; //安全间隔标志位
36 bit bdata Host_F=0;
37
38 sbit ACK1 =P1^2;
39 sbit ACK2 =P1^3;
40 sbit DI1 =P0^3;
41 sbit DI2 =P1^6;
42 sbit DO1 =P0^0;
43 sbit DO2 =P0^4;
44 sbit CLK1 =P0^2;
45 sbit CLK2 =P0^7;
46 sbit SEN1 =P0^1;
47 sbit SEN2 =P1^7;
48 sbit PWM =P0^5;
49 sbit IR_OUT=P0^6;
50
51
52 void delay(uchar n);
53 void Isp_Init(); //初始化串口,
54 //void keysignout(void) ;
55 void Getkey_hos(void);
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 2
56 void Getkey_gue(void);
57 void Trans(void); //手柄键码转化为红外输出码,
58
59 main()
60 {
61 1
62 1 P0M1=0XDF; //外部引脚I/O配置,
63 1 P0M2=0XF7;
64 1 P1M1=0XFF;
65 1 P1M2=0X83;
66 1 DIVM=0; //时钟分频设置,
67 1 // AUXR1=AUXR1|0x80;
68 1 TH0=238;
69 1 TL0=212;
70 1 TMOD=0X01; //记数器0设置,
71 1 PWM=0;
72 1 IR_OUT=1;
73 1 TCON=0x14; //设置下降沿中断,
74 1 IEN0=0x06; //开外部中断一 ,定时器零,
75 1 EA=1;
76 1 Isp_Init(); //初始化串口,
77 1
78 1 p_t=&irbuf[0];
79 1 p_b=&irbuf[0];
80 1
81 1
82 1
83 1 while(1)
84 1 {
85 2 Getkey_hos();
86 2 chan_key=KEY_hos[0]^KEY_hos[1];
87 2 if(chan_key)
88 2 {
89 3 Host_F=1;
90 3 stat_key=KEY_hos[0];
91 3 Trans();
92 3 KEY_hos[1]=KEY_hos[0];
93 3 }
94 2 Getkey_gue();
95 2 chan_key=KEY_gue[0]^KEY_gue[1];
96 2 if(chan_key)
97 2 {
98 3 Host_F=0;
99 3 stat_key=KEY_gue[0];
100 3 Trans();
101 3 KEY_gue[1]=KEY_gue[0];
102 3 }
103 2 }
104 1
105 1 }
106
107 void irout() interrupt 2 using 2 //使用外部中断1中断服务程序 ,
108 {
109 1 EA=0;
110 1 IR_OUT=PWM;
111 1 PWM=!PWM;
112 1 EA=1;
113 1 }
114
115 void delay( uchar n) //n*12us延时程序;
116 {
117 1 uchar i, j;
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 3
118 1 for(i=0;i<n;i++)
119 1 {
120 2 for(j=0;j<10;j++)
121 2 {
122 3 _nop_();
123 3 }
124 2 }
125 1 }
126 void Getkey_hos() //get gamekdy
127 {
128 1 uchar p,i,ref;
129 1 SEN2=0;
130 1 delay(4);
131 1 for(p=0;p<5;p++)
132 1 {
133 2 for(ref=0x01;ref>0x00;ref<<=1)
134 2 {
135 3 CLK2=0;
136 3 if(ref&dout[p]) //输出一位控制数据 ?是否满足4us
137 3 DO2=1;
138 3 else
139 3 DO2=0;
140 3 for(i=0;i<3;i++) //大概2us的延迟,
141 3 _nop_();
142 3 CLK2=1;
143 3 if(DI2)
144 3 din[p]=ref|din[p]; //输入一位控制数据 ?是否满足4us
145 3 for(i=0;i<2;i++) //大概2us的延迟,
146 3 _nop_();
147 3 }
148 2 DO2=1;
149 2 if(p<4)
150 2 {
151 3
152 3 // delay(1);
153 3 // do
154 3 // {
155 3 // while(ACK2) //检测ACK信号是否响应。 有响应则向下 执行。
156 3 // {
157 3 _nop_();
158 3 // ACK=1;
159 3 // timeout=10000;
160 3 // break;
161 3 // }
162 3 delay(2);
163 3 // }
164 3 // while(timeout--);
165 3 }
166 2 // else
167 2 // {}
168 2
169 2 }
170 1 SEN2=1;
171 1 // delay(2);
172 1 // keysignout(); // 键码值通过串口输出。
173 1 KEY_hos[0]=din[3];
174 1 KEY_hos[0]<<=8;
175 1 KEY_hos[0]+=din[4];
176 1 for(i=0;i<5;i++)
177 1 din[i]=0x00;
178 1 // for(i=0;i<255;i++)
179 1 // delay(255);
C51 COMPILER V8.05a PS 06/20/2007 10:34:01 PAGE 4
180 1
181 1 }
182
183 void Getkey_gue() //get gamekdy
184 {
185 1 uchar p,i,ref;
186 1
187 1 SEN1=0;
188 1 delay(4);
189 1 for(p=0;p<5;p++)
190 1 {
191 2 for(ref=0x01;ref>0x00;ref<<=1)
192 2 {
193 3 CLK1=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -