📄 ir.s
字号:
lds R2,_Table+12
out 0x15,R2
.dbline 108
rjmp L14
L41:
.dbline 109
; case 17: PORTC=Table[13];break; //A
lds R2,_Table+13
out 0x15,R2
.dbline 109
rjmp L14
L43:
.dbline 110
lds R2,_Table+14
out 0x15,R2
.dbline 110
.dbline 111
L14:
.dbline -2
L12:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e spk _spk fV
; i -> R20
.even
_spk::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 122
; case 18: PORTC=Table[14];break; //C
; default: break;
; }
; }
; /************************************************
; 函 数 名: spk()
; 功 能: 蜂鸣器鸣叫一声函数
; 输入参数:
; 输出参数:
; 描 述: /
; ***********************************************/
; void spk (uchar i)
; {
.dbline 123
; PORTA &= ~(1<<PA2); //蜂鸣器响
cbi 0x1b,2
.dbline 124
; DelaymS (i); //延迟
mov R16,R20
clr R17
rcall _DelaymS
.dbline 125
; PORTA |= (1<<PA2); //蜂鸣器关闭
sbi 0x1b,2
.dbline -2
L46:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e Init_mcu _Init_mcu fV
.even
_Init_mcu::
.dbline -1
.dbline 135
; }
; /************************************************
; 函 数 名: Init_mcu()
; 功 能: 单片机初始化函数
; 输入参数: /
; 输出参数: /
; 描 述: 相关口方向的设置等
; ***********************************************/
; void Init_mcu(void)
; {
.dbline 136
; DDRC = 0xff; //PC口为推挽1输出
ldi R24,255
out 0x14,R24
.dbline 137
; DDRD = 0b11110111; //PD3(INT1)接蜂鸣器为输入,其余为输出。
ldi R24,247
out 0x11,R24
.dbline 138
; PORTD = 0b10001111; //红外输入端需要使用内部上拉电阻,只使用第一位数码管。
ldi R24,143
out 0x12,R24
.dbline 139
; DDRA = 0xff; //PA口为输出,PA4接蜂鸣器
ldi R24,255
out 0x1a,R24
.dbline 140
; PORTA = 0xff; //默认蜂鸣器不响
out 0x1b,R24
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_int1 _init_int1 fV
.even
_init_int1::
.dbline -1
.dbline 150
; }
; /************************************************
; 函 数 名: Init_int1()
; 功 能: 外部中断1初始化函数
; 输入参数: /
; 输出参数: /
; 描 述: 设置外部中断1为下降沿触发
; ***********************************************/
; void init_int1 (void) //外部中断1初始化
; {
.dbline 151
; MCUCR |= (1<<ISC11); //设置为下降沿中断触发
in R24,0x35
ori R24,8
out 0x35,R24
.dbline 152
; MCUCR &= ~(1<<ISC10); //设置为下降沿中断触发
in R24,0x35
andi R24,251
out 0x35,R24
.dbline 153
; GICR |= (1<<INT1); //通用中断控制寄存器,中断使能
in R24,0x3b
ori R24,128
out 0x3b,R24
.dbline -2
L48:
.dbline 0 ; func end
ret
.dbend
.dbfunc e int1_serving _int1_serving fV
; buf -> y+0
; j -> R22
; k -> R10
; mid -> R12
; i -> R20
.even
_int1_serving::
rcall push_lset
rcall push_gset4
sbiw R28,4
.dbline -1
.dbline 163
; }
; /************************************************
; 函 数 名: Init_serving()
; 功 能: 红外IR接收中断服务程序
; 输入参数: /
; 输出参数: /
; 描 述: 整个红外译码部分的处理
; ***********************************************/
; void int1_serving (void) //外部中断1,红外IR接收中断服务程序
; {
.dbline 166
; uchar i,j,k,mid ;
; uchar buf[4];
; CLI(); //暂时屏蔽外部中断
cli
.dbline 168
;
; for (i=0;i<9;i++)
clr R20
rjmp L53
L50:
.dbline 169
; {
.dbline 170
; Delay882uS(); //调用882uS延迟程序。
rcall _Delay882uS
.dbline 171
; if((PIND&0x08)!=0) //判断INT1端口的状态。操作的是PD3,PD3为高吗?
sbis 0x10,3
rjmp L54
.dbline 172
; {
.dbline 173
; SEI(); //开中断
sei
.dbline 174
; return; //如果为高,说明是干扰或出错,跳出这个循环。
rjmp L49
L54:
.dbline 176
L51:
.dbline 168
inc R20
L53:
.dbline 168
cpi R20,9
brlo L50
L56:
.dbline 177
L57:
.dbline 177
; }
; }
; while ((PIND & 0x08) == 0); //等待9ms的低电平结束,
sbis 0x10,3
rjmp L56
L59:
.dbline 179
L60:
.dbline 179
;
; while ((PIND & 0x08) != 0); //等待4.5ms的高电平结束,
sbic 0x10,3
rjmp L59
.dbline 181
;
; for (j=0;j<4;j++)
clr R22
rjmp L65
L62:
.dbline 182
; {
.dbline 183
; k=0;
clr R10
.dbline 184
; for (i=0;i<8;i++)
clr R20
rjmp L69
X5:
.dbline 185
; {
L70:
.dbline 186
L71:
.dbline 186
; while((PIND&0x08)==0); //等待每一个数据位的0.565ms低电平后的高电平
sbis 0x10,3
rjmp L70
.dbline 188
;
; Delay882uS(); //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
rcall _Delay882uS
.dbline 190
;
; mid = PIND & 0x08; //读取端口的值。
in R24,0x10
andi R24,8
mov R12,R24
.dbline 191
; if (mid != 0)
tst R24
breq L73
.dbline 192
; {
.dbline 193
; Delay1000uS(); //为高电平,再延迟1ms,
rcall _Delay1000uS
.dbline 194
; k |= 1<<i; //读取1
ldi R16,1
mov R17,R20
rcall lsl8
or R10,R16
.dbline 195
; }
rjmp L74
L73:
.dbline 197
; else
; {
.dbline 198
; k &= ~(1<<i); //读取0
ldi R16,1
mov R17,R20
rcall lsl8
mov R2,R16
com R2
and R10,R2
.dbline 199
; }
L74:
.dbline 200
L67:
.dbline 184
inc R20
L69:
.dbline 184
cpi R20,8
brlo L71
.dbline 201
movw R24,R28
mov R30,R22
clr R31
add R30,R24
adc R31,R25
std z+0,R10
.dbline 202
L63:
.dbline 181
inc R22
L65:
.dbline 181
cpi R22,4
brlo L62
.dbline 204
; }
; buf[j] = k ; //保存读到的数据
; }
;
; if ((buf[2]|buf[3]) != 0xff) //判断数据的第三字节和第四字节的取反后相等吗?
ldd R2,y+3
ldd R24,y+2
or R24,R2
cpi R24,255
breq L75
.dbline 205
; {
.dbline 206
; SEI(); //开中断
sei
.dbline 207
; return; //如果不相等说明是干扰或出错,跳出整个循环。
rjmp L49
L75:
.dbline 209
; }
; key_decode (buf[2]); //判断键值并显示,系统码即buf[1]和buf[2]忽略。
ldd R16,y+2
rcall _key_decode
.dbline 211
; //PORTC = buf[2]; //直接显示键值
; spk(1000); //蜂鸣器响一声。
ldi R16,232
rcall _spk
.dbline 212
; SEI(); //开中断
sei
.dbline -2
L49:
adiw R28,4
rcall pop_gset4
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym l buf 0 A[4:4]c
.dbsym r j 22 c
.dbsym r k 10 c
.dbsym r mid 12 c
.dbsym r i 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 216
; }
; //------------------------main----------------------------
; void main (void)
; {
.dbline 217
; Init_mcu(); //单片机端口初始化,口方向设置与外部中断的使用无关,不影响。
rcall _Init_mcu
.dbline 218
; spk(1000); //蜂鸣器响一声。
ldi R16,232
rcall _spk
.dbline 219
; init_int1(); //外部中断1初始化
rcall _init_int1
.dbline 220
; SEI(); //开中断
sei
.dbline 221
; PORTC=0b10111111; ///上电后初始显示"-"
ldi R24,191
out 0x15,R24
L81:
.dbline 223
L82:
.dbline 222
rjmp L81
X6:
.dbline -2
L80:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -