⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spdj.asm

📁 8051单片机汇编语言编写的UPD6464视频叠加遥控接收解码点歌程序。用于KTV房遥控点歌。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                mov     orderram1,#'T'
                mov     orderram2,#'V'
                mov     orderram3,#0ah
                mov     ordermark,#0ffh
                ret

;**********************************
iniirf:       	mov	coderam0,#0
		mov	coderam1,#0
		mov	coderam2,#0
		mov	coderam3,#0
                mov     pulsetime,#0            ;初始化INT1中断次数
		mov	codemark,#00h
                ret

;****************************************************
codetab0:       db      code0          ;"0"的遥控码
                db      30h
                db      code1          ;"1"的遥控码
                db      31h
                db      code2          ;"2"的遥控码
                db      32h
                db      code3          ;"3"的遥控码
                db      33h
                db      code4          ;"4"的遥控码
                db      34h
                db      code5          ;"5"的遥控码
                db      35h
                db      code6          ;"6"的遥控码
                db      36h
                db      code7          ;"7"的遥控码
                db      37h
                db      code8          ;"8"的遥控码
                db      38h
                db      code9          ;"9"的遥控码
                db      39h
                db      0ffh
codetab1:       db      codeEJT        ;"出盒"的遥控码
                db      '*stop',0ah
                db      codeMUTE       ;"静音"的遥控码
                db      '*mute',0ah
                db      codeTV         ;"电视/TV"的遥控码
                db      '*TV',0ah
;                db      codePAUSE      ;"暂停"的遥控码
;                db      '*pause',0ah
                db      codeRL         ;"声道"的遥控码
                db      '*RL',0ah
;                db      codeFOWARD     ;"快进"的遥控码
;                db      '*FW',0ah
;                db      codeTOWARD     ;"快退"的遥控码
;                db      '*FD',0ah
                db      codeFREUP      ;"音调大"的遥控码
                db      '*B+',0ah
                db      codeFREDW      ;"音调小"的遥控码
                db      '*B-',0ah
                db      codeVOLDW      ;"音量小"的遥控码
                db      '*N',0ah
                db      codeVOLUP      ;"音量大"的遥控码
                db      '*M',0ah
                db      0ffh

;************** numorder:歌号送入orderram中 **********
;入口参数:r0--播放歌号地址单元
numorder:       mov     r4,#4
loopord:        mov     a,@r0
                cjne    a,#'-',isvod
                mov     vodovermark,#00h
                ret
isvod:          mov     @r1,a
                inc     r0
                inc     r1
                djnz    r4,loopord
                mov     vodovermark,#0ffh
                ret

;************** movsongnum:移动歌曲号***********
movsongnum:     mov     r0,#songnub10
                mov     r1,#songnub20
                mov     r7,#9
upnum0:         mov     r4,#4
upnum1:         mov     a,@r1
                mov     @r0,a
                inc     r0
                inc     r1
                djnz    r4,upnum1
                djnz    r7,upnum0
                mov     songnuba0,#'-'
                mov     songnuba1,#'-'
                mov     songnuba2,#'-'
                mov     songnuba3,#'-'
                ret

;************** vodsong:点歌处理程序 ***************************
vodsong:        lcall   predispm
                mov     dispram0,#88h
                mov     dispram1,#0fh
                mov     r6,#2
                lcall   sendbyte
                mov     temp2,#0fh
                mov     temp3,#88h
                mov     r2,#1
                mov     r3,#10
                mov     r0,#songnub10
loopmenu:       mov     dispram0,#0c0h
                mov     a,r2
                mov     b,#10
                div     ab
                mov     a,b
                add     a,#30h
                mov     dispram1,a
                mov     dispram2,#'.'
                mov     a,@r0
                mov     dispram3,a
                inc     r0
                mov     a,@r0
                mov     dispram4,a
                inc     r0
                mov     a,@r0
                mov     dispram5,a
                inc     r0
                mov     a,@r0
                mov     dispram6,a
                mov     r6,#7
                lcall   sendbyte
                mov     a,#20h
                add     a,temp2
                mov     temp2,a
                clr     a
                addc    a,temp3
                mov     temp3,a
                mov     dispram0,temp3     ;确定字符写入VideoRam的地址
                mov     dispram1,temp2
                mov     r6,#2
                lcall   sendbyte
                inc     r2
                inc     r0
                djnz    r3,loopmenu
                lcall   setex1
                ret

;************** 字符闪烁 **************
blinkchar:      mov     a,line
                rl      a
                rl      a
                mov     r0,#songnub10
                add     a,r0
                add     a,column
                mov     r0,a
                mov     a,@r0
                mov     tmp,a
                mov     temp2,#11h
                mov     temp3,#88h
                mov     temp0,line
                mov     temp1,column
loopincline:    mov     a,line
                cjne    a,#0,noline0
                ljmp    loopinccol
noline0:        mov     a,#20h
                add     a,temp2
                mov     temp2,a
                clr     a
                addc    a,temp3
                mov     temp3,a
                djnz    temp0,noline0
loopinccol:     mov     a,column
                cjne    a,#0,nocol0
                ljmp    tolc
nocol0:         mov     a,#01h
                add     a,temp2
                mov     temp2,a
                djnz    temp1,nocol0
tolc:           mov     dispram0,temp3     ;确定字符写入VideoRam的地址
                mov     dispram1,temp2
                mov     r6,#2
                lcall   sendbyte
                mov     a,#0c0h
                orl     a,blinkmark
                mov     dispram0,a
                mov     dispram1,tmp
                mov     r6,#2
                lcall   sendbyte
                ret

;******************************************************
clrscreen:      mov     dispram0,#VCLR
                mov     r6,#1
                lcall   sendbyte
                ret

;************* sendbyte:输出n字节数据至uPD6464 *****************
;入口参数:r6-输出的数据个数;dispram0-输出数据的起始地址
sendbyte:       clr     CS
                mov     r1,#dispram0
nxsloop:        mov     r7,#8
                mov     a,@r1
sendloop:       clr     CLK
                rlc     a
                mov     DATAS,c
                nop
                nop
                setb    CLK
                nop
                nop
                nop
                nop
                djnz    r7,sendloop
                inc     r1
                djnz    r6,nxsloop
                setb    CS
                setb    DATAS
                lcall   delay5ms
                ret

;************** 准备显示字符 ***************************
predisp:        mov     dispram0,#88h           ;确定字符写入VideoRam的地址
                mov     dispram1,#23h
                mov     r6,#2
                lcall   sendbyte
predispm:       mov     dispram0,#80h                   ;确定显示起始位置
                mov     dispram1,#81h
                mov     r6,#2
                lcall   sendbyte
                mov     dispram0,#DISPON                ;打开显示和LC
                mov     r6,#1
                lcall   sendbyte
                ret

;************** 延时5ms**********************
delay5ms:       mov     r5,#10
dlyloop:        mov     r4,#250
                djnz    r4,$
                djnz    r5,dlyloop
                ret

;*********** Codegather: 得到遥控码 **********
codegather:	mov	a,codemark
		cjne	a,#0aah,if_one
		ljmp	yescodezero
if_one:         cjne    a,#55h,eret
		setb	c
		ljmp    reccode
yescodezero:	clr	c
reccode:	mov	a,coderam3
		rlc	a
		mov	coderam3,a
		mov	a,coderam2
		rlc	a
		mov	coderam2,a
		mov	a,coderam1
		rlc	a
		mov	coderam1,a
		mov	a,coderam0
		rlc	a
		mov	coderam0,a
		ret
eret:		mov	codemark,#0fh
		ret

;*********** Learer:判断引导头子程序 **************************************
leader:         mov     a,tmpth0                ;if 1800h<T1<1d00h
                                                ;(12.3ms<T1<14.8ms)
                cjne    a,#2ch,no_th33h         ;if TH0=18h
		mov	a,tmptl0		;TH0=18h
                cjne    a,#48h,no_tl90h         ;TH0=18h,if TL0=00h
is_lead:        mov     codemark,#0ffh          ;是引导头,置codemark=0ffh
		ret
no_tl90h:       jnc     is_lead                 ;TH0=18h,TL0>00h,OK!
l_lead:         mov     codemark,#00h           ;Th0<18h(Time<Leader),
                                                ;置codemark=00h
		ret
no_th33h:	jnc	glt33			;TH0>18h
                mov     codemark,#00h           ;TH0<18h(Time<leader),
                                                ;置codemark=00h
		ret
glt33:          cjne    a,#35h,no_th35h         ;if TH0=1dh
		mov	a,tmptl0		;TH0=1dh
                cjne    a,#50h,no_tl18h         ;TH0=1dh,if TL0=0h
                ljmp    is_lead                 ;TH0=1dh,TL0=00h,OK!
no_tl18h:       jc      is_lead                 ;TH0=1dh,TL0<00h,OK!
                mov     codemark,#0fh           ;TH0=1d,TL0>00h(Time>Leader),
                                                ;置codemark=0fh
		ret
no_th35h:       jc      is_lead                 ;TH0<1dh,OK!
                mov     codemark,#0fh           ;TH0>1dh(Time>Leader),
                                                ;置codemark=0fh
		ret

;*********** Iscodezero: 判断是否遥控码子程序 *********************************
iscode:         mov     a,tmpth0                ;if 0100h<T1<0580h
                                                ;(512uS<T1<2816uS)
                cjne    a,#01h,no_t01h          ;if TH0=01h
		mov	a,tmptl0		;TH0=01h
                cjne    a,#0d7h,no_t00h         ;TH0=01h,if TL0=00h
is_zer:         mov     codemark,#0ffh          ;是"0",置codemark=0ffh
		ret
no_t00h:	jnc	is_zer			;TH0=01h,TL0>00h,OK!
no_zer:         mov     codemark,#00h           ;Th0<01h(Time<Codezero),
                                                ;置codemark=00h
		ret
no_t01h:	jnc	gl3			;TH0>05h
                mov     codemark,#00h           ;Th0<01h(Time<Codezero),
                                                ;置codemark=00h
		ret
gl3:		cjne	a,#0ah,no_t5h		;if TH0=05h
		mov	a,tmptl0		;TH0=05h
		cjne	a,#23h,no_t8h		;TH0=05h,if TL0=80h
		ljmp	is_zer			;TH0=05h,TL0=80h,OK!
no_t8h:         jc      is_zer                  ;TH0=05h,TL0<80h,OK!
                mov     codemark,#0fh           ;TH0>05h(Time>Codezero),
                                                ;Set codemark=0fh
		ret
no_t5h:         jc      is_zer                  ;TH0<05h,OK!
                mov     codemark,#0fh           ;TH0>05h(Time>Codezero),
                                                ;Set codemark=0fh
		ret

;*********** Codezero: 判断遥控码为"0"子程序 *********************************
codezero:       mov     a,tmpth0                ;if 0100h<T1<0380h
                                                ;(512uS<T1<1792uS)
                cjne    a,#01h,no_th01h         ;if TH0=01h
		mov	a,tmptl0		;TH0=01h
                cjne    a,#0d7h,no_tl00h        ;TH0=01h,if TL0=00h
is_zero:        mov     codemark,#0aah          ;是"0",置codemark=0aah
		ret
no_tl00h:       jnc     is_zero                 ;TH0=01h,TL0>00h,OK!
no_zero:	mov	codemark,#00h		;非"0",置codemark=00h
		ret
no_th01h:	jnc	glt3			;TH0>01h
                ljmp    no_zero                 ;TH0<01h,BAD!
glt3:           cjne    a,#06h,no_th5h          ;if TH0=03h
		mov	a,tmptl0		;TH0=03h
                cjne    a,#74h,no_tl8h          ;TH0=03h,if TL0=80h
                ljmp    is_zero                 ;TH0=03h,TL0=80h,OK!
no_tl8h:        jc      is_zero                 ;TH0=03h,TL0<80h,OK!
                ljmp    no_zero                 ;TH0=03h,TL0>80h,BAD!
no_th5h:        jc      is_zero                 ;TH0<03h,OK!
                ljmp    no_zero                 ;TH0>03h,BAD!

;*********** Codeone: 判断遥控码为"1"子程序 *********************************
codeone:        mov     a,tmpth0                ;if 038fh<T1<0580h
                                                ;(1822uS<T1<2816uS)
                cjne    a,#06h,no_th03h         ;if TH0=03h
		mov	a,tmptl0		;TH0=03h
                cjne    a,#8fh,no_tlf0h         ;TH0=03h,if TL0=8fh
is_one:         mov     codemark,#55h           ;是"1",置codemark=55h
		ret
no_tlf0h:	jnc	is_one			;TH0=03h,TL0>8fh,OK!
no_one:         mov     codemark,#00h           ;非"1",置codemark=00h
		ret
no_th03h:	jnc	glt5			;TH0>03h
		ljmp	no_one			;TH0<03h,BAD!
glt5:           cjne    a,#0ah,no_th05h         ;if TH0=05h
		mov	a,tmptl0		;TH0=05h
                cjne    a,#23h,no_tl08h         ;TH0=05h,if TL0=80h
		ljmp	is_one			;TH0=05h,TL0=80h,OK!
no_tl08h:	jc	is_one			;TH0=05h,TL0<80h,OK!
		ljmp	no_one			;TH0=05h,TL0>80h,BAD!
no_th05h:	jc	is_one			;TH0<05h,OK!
		ljmp	no_one			;TH0>05h,BAD!

;*****************************
                org     07fdh
                ljmp    init
                end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -