📄 avrd04debug.asm
字号:
.include "m16def.inc"
; ***** PORTD ************************
; PORTD - Port D Data Register
.equ RX = 0 ; Port D Data Register bit 0
.equ TX = 1 ; Port D Data Register bit 0
.equ REM = 2 ; Port D Data Register bit 0
.equ VOLADDKEY = 3 ; Port D Data Register bit 0
;.equ VOLMIUSKEY = 4 ; Port D Data Register bit 0
.equ upd_io = 4 ; Port D Data Register bit 0
.equ upd_ncs = 5 ; Port D Data Register bit 0
.equ upd_clk = 6 ; Port D Data Register bit 0
;-------------------------------------------------------------
.equ nby =0x60
.equ nbx =0x61
.equ disdata =0x62
.equ clscerancount =0x63
.equ clscerancount1 =0x64
.equ inexmodule =0X65
.equ customercodeh =0X66
.equ customercodel =0X67
.equ keycodeh =0X68
.equ keycodel =0X69
.equ status =0X69
;-------------------------------------------------------
;R20,R21,R22,R23,R24,R25 为专用寄存器 r16 ,R17,R18是 公共 寄存器 R16 IS 中转寄存器
;r5,r6,r7 IS DELAY 寄存器
;**********************************************************
.org 0x0000
jmp resert
; .org 0x0002
; JMP int_0
.org 0x0100
resert:
ldi r16,0x04
sts nby,r16
out sph,r16
ldi r16,0x00
out spl,r16
; SEI
cli
cbi ddrd,rem
sbi portd,rem
;----------------------
; ldi r16,0xff
; out ddra,r16
;loop:
; out porta,r16
; call delay100ms
; ldi r16,0x00
; out porta,r16
; call delay100ms
; ldi r16,0xff
; jmp loop
;;-------------------
; call cpuini
; ldi r16,0b01000101
; sts inexmodule,r16
; call ini6464
; ldi r16,0x0
sbi ddra,0
loopp:
;
; sts disdata,r16
; call clrscreen
; call delay100ms
; lds r16,disdata
; inc r16
; sts disdata,r16
; jmp loopp
;sbic pind,rem
;jmp loopp
;jmp int_0
sbi porta,0
call delay800us
cbi porta,0
call delay800us
jmp loopp
;******************************************************remote program
exit:
;
; RETI ;
jmp loopp
int_0:
LDI R19,10
SB:
CALL DELAY800US ; 调用882微秒延时子程序
sbic pind,rem
jmp exit ; 延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
dec R19 ; 重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
brne SB ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
SB_1:
sbis pind,rem ; 等待高电平避开9毫秒低电平引导脉冲
jmp SB_1
LDI R19,14
WAIT4MS:
CALL DELAY800US ; 调用882微秒延时子程序
sbis pind,rem
jmp exit
dec r19
brne WAIT4MS
WAIT4MS_1:
sbic pind,rem
jmp WAIT4MS_1
ldi r26,0x66
ldi r27,0x00
ldi r18,0x4 ; 接收从1AH到1BH的2个内存,用于存放操作码和操作反码
PP:
ldi r19,0x8 ; 每组数据为8位
JJJJ:
sbic pind,rem ; 等待地址码第一位的高电平信号
jmp JJJJ
CALL delay800us ; 高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
sbis pind,rem
jmp UUU
CALL Rdelay1ms ; 检测到高电平1的话延时1毫秒等待脉冲高电平结束
sec
jmp UUU_1
UUU:
clc
UUU_1:
ld r1,x
Ror r1; 将C中的值0或1移入A中的最低位
st x,r1
dec r19
brne JJJJ
INC r26 ; 对R1中的值加1,换下一个RAM
brne PP
lds r16,customercodeh
cpi r16,0x00
brne exit
lds r16,customercodel
cpi r16,0xff
brne exit
lds r16,keycodeh
com r16
lds r17,keycodel
cp r16,r17
breq send ; 对1AH取反后和1BH比较
jmp EXIT ; 如果不等表示接收数据发生错误,放弃
;========================================操作程序
send:
; ;clr status.3 ; clr banduan dismian
; mov a,25h
; cjne a,#07h,send_1 ;
; ljmp voladd
;send_1:
; cjne a,#06h,send_2
; jmp VOLMIUS
;send_2:
; cjne a,#0fh,send_3
; ljmp NEXTTRACK
;send_3:
; cjne a,#03h,send_4
; jmp PRETRACK
;send_4:
; cjne a,#0bh,send_5
; setb status.3 ; clr banduan dismian
; ljmp PLAYPAUSE
;send_5:
; cjne a,#05h,send_6
; call sendpower
; call sendpower
; call sendpower
; ljmp tvmode
;send_6:
; mov a,25h
; cjne a,#08h,send_7
; ; call sendpower
; ;call sendpower
; ;call sendpower
; ljmp miusemode
;;------------------------------------
;send_7:
; ; call sendpower
; ; call sendpower
; ; call sendpower
;send_7_1:
; mov a,25h
; jb status.0,tvmodesend ; miuse mode;
;miusesend:
; cjne a,#01h,miusesend1
; jmp NEXTLIST
;miusesend1:
; cjne a,#09h,miusesend2
; jmp PRELIST
;miusesend2:
; cjne a,#00h,miusesend3
; jmp uparrow
;miusesend3:
; cjne a,#0ah,miusesend4
; jmp downarrow
;miusesend4:
; cjne a,#04h,miusesend5
; jmp menu
;miusesend5:
; cjne a,#02h,miusesend6
; jmp select
;miusesend6:
; jmp exit
;;=======================
;tvmodesend:
; jb searchstaus.2,searchstaussend
; ;cjne a,#01h,tvmodesend1 ; no searchstaus
; ;jmp NEXTLIST
;tvmodesend1:
; ;cjne a,#09h,tvmodesend2
; ;jmp PRELIST
;tvmodesend2:
; ;cjne a,#00h,tvmodesend3
; ;jmp uparrow
;tvmodesend3:
; ;cjne a,#0ah,tvmodesend4
; ;jmp downarrow
;tvmodesend4:
; cjne a,#04h,tvmodesend5
; jmp search
;tvmodesend5:
; ;cjne a,#02h,tvmodesend6
; ;jmp ensure
;tvmodesend6:
; jmp exit
;;------------------------------------
;searchstaussend:
; jb searchstaus.3,selectstaussend
; cjne a,#01h,searchstaussend1
; jmp rightarrow
;searchstaussend1:
; cjne a,#09h,searchstaussend2
; jmp leftarrow
;searchstaussend2:
; cjne a,#00h,searchstaussend3
; jmp shangarrow
;searchstaussend3:
; cjne a,#0ah,searchstaussend4
; jmp xianarrow
;searchstaussend4:
; cjne a,#04h,searchstaussend5
; jmp search
;searchstaussend5:
; cjne a,#02h,searchstaussend6
; jmp ensure
;searchstaussend6:
; jmp exit
;;---------------------------------------------------------
;selectstaussend:
; cjne a,#01h,selectstaussend1
; jmp searchstaussend6
;selectstaussend1:
; cjne a,#09h,selectstaussend2
; jmp searchstaussend6
;selectstaussend2:
; cjne a,#00h,selectstaussend3
; jmp shangselect
;selectstaussend3:
; cjne a,#0ah,selectstaussend4
; jmp xianselect
;selectstaussend4:
; cjne a,#02h,selectstaussend5
; jmp selecttrack
;selectstaussend5:
; ;cjne a,#02h,selectstaussend6
; ;jmp ensure
;selectstaussend6:
; jmp exit
;;****************************************************
;;***************************************************remote lose key programm
;losekey:
; clr ea
; setb status.1
; mov r7,#37
; ; CALL YS3
;losekey_1:
; call D39MS
; jnb p3.2,losekey_2
; djnz r7,losekey_1
;losekey_1_1: ;lose key
; clr status.1
; jmp loseexit
;losekey_2:
; CALL YS1
; mov losetimes,#6
;losekey_2_1:
; call YS1
; jb p3.2,losekey_1_1; if low 9ms, is high to exit
; djnz losetimes,losekey_2_1
; jnb p3.2,$ ; wait low 9ms
;;----------------------------------- repeat high 2ms
; ;mov losetimes,#2
;losekey3:
; ;call YS1
; ;jnb p3.2,loseexit
; ;djnz losetimes,losekey3
; ;clr status.1 ; lose key
;loseexit:
; ret
;----------------------------------------------
Rdelay1ms:
ldi r16,10
MOV R6,R16
jmp delay100US
delay800us:
ldi r16,8
MOV R6,R16
delay100US:
ldi r16,255
mov r7,r16
delay100US_1:
dec r7
brne delay100US_1
dec R6
brne delay100US
ret
;********************************************************** upd6464 program
;*****************************************************************
clrscreen: ; clear screen
;ldi r16,0x18
;sts disdata,r16
ldi r16,0x0
sts nby,r16
ldi r16,12
sts clscerancount,r16
clrscreen_2:
ldi r16,24
sts clscerancount1,r16
ldi r16,0x0
sts nbx,r16
clrscreen_1:
call displaychar
lds r16,nbx
inc r16
sts nbx,r16
lds r16,clscerancount1
dec r16
sts clscerancount1,r16
brne clrscreen_1
lds r16,nby
inc r16
sts nby,r16
lds r16,clscerancount
dec r16
sts clscerancount,r16
brne clrscreen_2
ret
;**************************************************************r1,r18
displaychar:
LDS R16,nby
ROR R16
ROR R16
ROR R16
ANDI R16, 0X01
ORI R16,0X88
MOV R17,R16
LDS R16,nby
swap R16
rOL R16
ANDI R16,0Xe0
LDS R2,nbx
or R16,R2
mov R18,R16
call writ16byt
LDI R17,0Xc0
LDS R18,disdata
call writ16byt
RET
;*****************************************************************r16 r17
writ8byt:
cbi PORTD,upd_ncs
ldi r16, 0x08
ibit1:
rol r17
brcs ibit1_1
cbi PORTD,upd_io
jmp ibit1_2
ibit1_1:
sbi PORTD,upd_io
ibit1_2:
nop
cbi PORTD,upd_clk
nop
sbi PORTD,upd_clk
nop
dec r16
brne ibit1
nop
cbi PORTD,upd_clk
nop
nop
sbi PORTD,upd_ncs
ret
;**********************************************************r16, r17,r18
writ16byt:
cBI PORTD,upd_ncs
ldi r16, 8
ibit2:
rol r17
brcs ibit2_1
cbi PORTD,upd_io
jmp ibit2_2
ibit2_1:
sbi PORTD,upd_io
ibit2_2:
nop
nop
nop
cbi PORTD,upd_clk
nop
nop
nop
sbi PORTD,upd_clk
nop
nop
dec r16
brne ibit2
nop
nop
nop
nop
nop
nop
sbi PORTD,upd_clk
ldi r16, 8
ibit3:
rol r18
brcs ibit3_1
cbi PORTD,upd_io
jmp ibit3_2
ibit3_1:
sbi PORTD,upd_io
ibit3_2:
NOP
NOP
nop
CBI PORTD,upd_clk
nop
NOP
NOP
sBI PORTD,upd_clk
nop
DEC R16
BRNE ibit3
SBI PORTD,upd_clk
nop
SBI PORTD,upd_ncs
ret
;-------------------------------------------------------------------------------------------
ini6464:
cBI PORTD,upd_ncs ;=0;
call Delay10ms; //程序开始时,要输入CS四次去清除上电复位,然后所作的设置才是有效的。
SBI PORTD,upd_ncs
cBI PORTD,upd_ncs ;=0;
call Delay10ms;
SBI PORTD,upd_ncs
cBI PORTD,upd_ncs ;=0;
call Delay10ms;
SBI PORTD,upd_ncs
cBI PORTD,upd_ncs;=0;
call Delay10ms;
SBI PORTD,upd_ncs
cBI PORTD,upd_ncs ;=0;
call Delay10ms;
SBI PORTD,upd_ncs
LDI R17, 0X00 ; video ram batch
call writ8byt
LDI R17, 0B00011100 ;display control (D0 1,display on ;lc 1 LC oscillation on ;bl1,bl0 0,0 blinking off)
call writ8byt
LDI R17,0B00100000 ;internal video signal color control (grenn)
call writ8byt
LDI R17, 0B00110000 ;background control
call writ8byt
LDS R17,inexmodule
;mov b, #01000101b ; internal/external mode control crystal control
call writ8byt
LDI R17, 0B01010010 ; 晶振方式选择,4fsc方式
call writ8byt
LDI R17, 0B01001001 ; video signal method control (pal)
call writ8byt
;mov temp,#10000000b ; 起始偏移位置h, 0
;mov temp1,#1000011b ; 起始偏移位置l, 0
LDI R17,0B10000001 ; 起始偏移位置h, 0
LDI R18,0B0000101 ; 起始偏移位置l, 0
call writ16byt
LDI R17,0B10001000 ; 显示行列位置h,0列
LDI R18,0B00000000 ; 显示行列位置l,0行
call writ16byt
LDI R17,0B10010001 ; 输出电平控制h,2vpp
LDI R18,0B00000001 ; 输出电平控制l,75ire
call writ16byt
LDI R17,0B10011000 ; 字符尺寸控制h,最小尺寸
LDI R18,0B00000000 ; 字符尺寸控制l,0行
call writ16byt
ret
;**************************************************************** count program
;4字节除4字节商为4字节除法子程序CHU40
;被除数放在内部8H.09H.0AH.0BH 单元中,除数放在0C.0D.0E.0F单元中
;商数放在内部R4.R5.R6.R7单元中,余数放在10H.11H.12H.13H单元中.
;----------------------------------------------------
;被除数放在内部r8.r9.r10.r11 单元中,除数放在r12.r13.r14.r15单元中
;商数放在内部R4.R5.R6.R7单元中,余数放在r16.r17.r18.r19单元中.
;使用 R0,R1,R4.R5.R6.R7,r8.r9.r10.r11,r12.r13.r14.r15,r16.r17.r18.r19,R20,R21,R22,R23
;-----------------------------------------------------------------------------------
CHU40:
ldi r16,0x20
mov R0, r16
ldi r16, 0x00
ldi r17, 0x00
ldi r18, 0x00
ldi r19, 0x00
CHU47:
Clc
rol r11
rol r10
rol r9
rol r8
rol r19
rol r18
rol r17
rol r16
rol r7
rol r6
rol r5
rol r4
clc
mov r23,r19
sbc r23,r15
MOV R1, r23
mov r23,r18
sbc r23,r14
MOV r20, r23
mov r23,r17
sbc r23,r13
MOV r21, r23
mov r23,r16
sbc r23,r12
MOV r22,r23
brcs LOP490
INC R7
MOV r19,R1; 建立余数
MOV r18,r20
MOV r17,r21
MOV r16,r22
LOP490:
dec R0
brne CHU47
ret
;**********************************************************************
; ;(17) 标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;
;;入口条件:待转换的双字节十六进制整数在R16、R17中。
;;出口信息:转换后的三字节BCD码整数在r16,r17,r18,r19,r20中。
;;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
;使用 R16,R17,r18,r19,r20
hextobcd:
ser r20
hextobcd_1:
inc r20
subi r16,low(10000)
sbci r17,high(10000)
brcc hextobcd_1
subi r16,low(-10000)
sbci r17,high(-10000)
ser r19
hextobcd_2:
inc r19
subi r16,low(1000)
sbci r17,high(1000)
brcc hextobcd_2
subi r16,low(-1000)
sbci r17,high(-1000)
ser r18
hextobcd_3:
inc r18
subi r16,low(100)
sbci r17,high(100)
brcc hextobcd_3
subi r16,low(-100)
sbci r17,high(-100)
ser r17
hextobcd_4:
inc r17
subi r16,10
brcc hextobcd_4
subi r16,(-10)
ret
;***********************************************delay program
;-----------------------------------------
delay3s:
ldi r16,200
delay3s_1:
ldi r17,150
delay3s_2:
ldi r18,76
delay3s_2_1:
dec r18
brne delay3s_2_1
dec r17
brne delay3s_2
dec r16
brne delay3s_1
ret
;------------------------------
delay100ms:
LDI R16,100
MOV R5,R16
JMP delay1ms_1
delay80ms:
LDI R16,80
MOV R5,R16
JMP delay1ms_1
delay40ms:
LDI R16,40
MOV R5,R16
JMP delay1ms_1
delay20ms:
LDI R16,20
MOV R5,R16
JMP delay1ms_1
delay10ms:
LDI R16,10
MOV R5,R16
JMP delay1ms_1
delay1ms:
LDI R16,1
MOV R5,R16
delay1ms_1:
LDI R16,10
MOV R6,R16
delay: ;100US
LDI R16,250
MOV R7,R16
delay_1:
dec r7
brne delay_1
dec R6
brne delay
DEC R5
BRNE delay1ms_1
ret
;**************************************
NOP
NOP
cpuini:
sbi ddrd, upd_io
sbi ddrd, upd_ncs
sbi ddrd,upd_clk
ret
.EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -