?? avrd04debug.asm.bak
字號:
.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
out sph,r16
ldi r16,0x00
out spl,r16
; SEI
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
;******************************************************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 + -