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

📄 recplay.asm

📁 录音机控制51源程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
moto_on            bit     p0.6        ;马达控制
cdct               bit     p0.5        ;电磁铁控制
rec_c              bit     p3.6        ;录音开关控制
play_c             bit     p3.7        ;放音开关控制
;comm               bit     p3.3        ;=1 关闭  =0 启动
vol1               bit     p1.0        ;音量控制
vol2               bit     p1.1
comm1              bit     p1.7        ;放音状态返回

cspin		   bit	   p1.6
clkpin		   bit	   p1.5
dipin		   bit	   p1.4

mode_sw            bit     p3.4        ;模式开关
rec_sw		   bit	   p3.5        ;录音开关

power_led          bit     p0.0        ;电源指示
rec_led            bit     p0.1        ;录音指示
play_led           bit     p0.2        ;放音指示
ffw_led            bit     p0.3        ;快进指示
rew_led            bit     p0.4        ;快倒指示


kh1_pad            bit     p2.3        ;键扫行1
kh2_pad            bit     p2.4        ;键扫行2
kh3_pad            bit     p2.5        ;键扫行3
kl1_pad            bit     p2.6        ;键扫列1
kl2_pad            bit     p2.7        ;键扫列1



k_num              equ     5bh          ;按键计数
pio2_tal           equ     5ch          ;端口累加器高
pio1_tal           equ     5dh          ;端口累加器低

sys_pwr            equ     5eh          ;电源标志       3关闭1接通2锁定
                                        ;遥控机芯代码   4停机5放音6快进7快倒8录音
lcdbuf		   equ	   60h
lcdbufend	   equ	   6fh
lcdmm		   equ	   70h

tim		   equ	   71h		;定时
ff_old             equ     72h          ;机芯模式
play_m		   equ	   73h		;暂停前记忆
play_mem	   equ	   74h		;暂停后记忆 0:无 1:录音 2:放音 3:快进 4:快倒
count0		   equ	   75h		;磁带计数低位首地址
count1		   equ	   76h
count2		   equ	   77h
count3		   equ	   78h		;磁带计数高位
au_to		   equ	   79h		;自动停机计数
san		   equ	   7ah		;闪显计数
count1_t	   equ	   7bh          ;液晶显示用
count2_t	   equ	   7ch          ;
count3_t	   equ	   7dh		;
woshou             equ     7eh          ;握手计数器
wo_t               equ     7fh          ;握手计时器



;
read_p             bit     18h          ;端口读标志
rec_cbit	   bit	   19h		;允许录音
play_cbit	   bit	   1ah		;允许放音
ffw_cbit	   bit	   1bh		;允许快进
rew_cbit	   bit	   1ch		;允许快倒
fang		   bit	   1dh		;记忆计数方向 1:进 0:倒
san_bit 	   bit	   1eh		;闪亮
p_sw               bit     1fh


key_clr            bit     20h
key_rec            bit     21h
key_play           bit     22h
key_ff             bit     23h
key_rew            bit     24h
key_stop           bit     25h

;
		   org	   0000h
		   ljmp    start		   ;跳转到主程序
;
		   org	   0003h
		   ljmp    b_int0                ;中断0
		   ljmp    start
;
		   org	   000bh
                   ljmp    b_t0                  ;T0定时中断
		   ljmp    start
;
		   org	   0013h
                   ljmp    b_int1                ;中断1
		   ljmp    start
;
		   org	   001bh
		   ljmp    start                 ;T1
;
		   org	   0023h
		   ljmp    start
;
		   org	   0100h
;
tst:               ljmp    test_open
;
start:
                   mov     sp,#30h
                   lcall   cjdata                 ;采集端口
                   clr     c
                   mov     a,20h
                   addc    a,21h
                   jz      tst                    ;转测试程序
                   ;
                   mov     sp,#30h
                   mov     psw,#00h
        	   mov	   r7,#08h		   ;进入初始开机状态
loopp3: 	   mov	   r6,#0ffh
loopp2: 	   mov	   r5,#0ffh
loopp1: 	   djnz    r5,loopp1
		   djnz    r6,loopp2
		   djnz    r7,loopp3
;
start0:            lcall   startdata
                   lcall   lcdreset                ;lcd复位
                   lcall   reset 		   ;机芯复位
		   ;
start1:            lcall   key			   ;键扫描
                   mov     count1_t,count1
                   mov     count2_t,count2
                   mov     count3_t,count3
start1_1:          lcall   led_dis                 ;发光管显示
		   lcall   autostop		   ;自动停机
                   clr     power_led
                   lcall   lcd_data                ;生成lcd数据
                   lcall   transram                ;lcd数据传送
                   lcall   woshou_ctl              ;握手控制
                   mov     a,sys_pwr
                   cjne    a,#03h,start1_2
                   ljmp    start2 ;转关闭
start1_2:          cjne    a,#02h,start1
                                  ;转集控
                   mov     count1_t,#10h           ;显示"---"
                   mov     count2_t,#10h
                   mov     count3_t,#10h
		   ljmp    start1_1
;
start2:            mov     a,play_mem              ;关闭
                   jz      start3
                   lcall   stop_ctl
                   lcall   jxc
start3:            setb    play_led
                   setb    rec_led
                   setb    rew_led
                   setb    ffw_led
                   jb      san_bit,start4
                   setb    power_led
                   sjmp    start5
start4:            clr     power_led
start5:            mov     count1_t,#0fh           ;显示"OFF"
                   mov     count2_t,#0fh
                   mov     count3_t,#00h
                   lcall   lcd_data                ;生成lcd数据
                   lcall   transram                ;lcd数据传送
                   lcall   woshou_ctl              ;握手控制
                   mov     a,sys_pwr
                   cjne    a,#03h,start1_1
		   ljmp    start2
;
cjdata:            mov     20h,#00h
                   mov     21h,#00h
                   mov     c,p1.0
                   mov     00h,c      ;l1
                   mov     c,p1.1
                   mov     01h,c      ;l2
                   mov     c,p1.7
                   mov     02h,c      ;l3
                   mov     c,p3.2
                   mov     03h,c      ;l5
                   mov     c,p3.5
                   mov     04h,c      ;l6
                   mov     c,p3.4
                   mov     05h,c      ;l7
                   mov     c,p3.7
                   mov     06h,c      ;l8
                   mov     c,p3.6
                   mov     07h,c      ;l9
                   mov     c,p0.5
                   mov     08h,c      ;l10
                   mov     c,p0.6
                   mov     09h,c      ;l11
                   ret

;
test_open:         mov	   sp,#30h
                   mov     p0,#0ffh
                   mov     p1,#0ffh
                   mov     p2,#0ffh
                   mov     p3,#0ffh
                   clr     read_p               ;
                   mov     pio1_tal,#00h
                   mov     pio2_tal,#00h
                   mov     k_num,#00h
                   mov     24h,#00h
                   lcall   lcdreset                ;lcd复位
open0:             mov     c,p3.3     ;测试程序
                   jc      open1
                   jb      read_p,open0   ;p3.3=0,  已读退出
                   setb    read_p
                   lcall   cjdata        ;读端口
                   clr     c
                   mov     a,pio1_tal
                   addc    a,20h
                   mov     pio1_tal,a     ;读端口累加
                   clr     c
                   mov     a,pio2_tal
                   addc    a,21h
                   mov     pio2_tal,a     ;读端口累加
                   sjmp    open0
open1:             clr     read_p      ;p3.3=1,清除读标志
                   mov     a,pio1_tal
                   cjne    a,#0ffh,open2
                   mov     a,pio2_tal
                   cjne    a,#03h,open2
                   clr     p0.0                   ;端口测试通过,电源灯亮
                   lcall   key_test
                   mov     count1_t,#10h
                   mov     count2_t,k_num
                   mov     count3_t,#10h
                   mov     a,24h
                   cjne    a,#3fh,open1_1
                   mov     count1_t,#08h           ;测试完成
                   mov     count2_t,#08h
                   mov     count3_t,#08h
open1_1:           lcall   lcd_data                ;生成lcd数据
                   lcall   transram                ;lcd数据传送
                   sjmp    open0
open2:             mov     count1_t,#10h           ;端口测试未通过
                   mov     count2_t,#10h
                   mov     count3_t,#10h
                   lcall   lcd_data                ;生成lcd数据
                   lcall   transram                ;lcd数据传送
                   sjmp    open0

;
startdata:	   mov	   p3,#0ffh	;(11111111)
                   mov	   p2,#0ffh	;(11111111)
                   mov	   p1,#0ffh	;(11111111)
                   mov     p0,#0ffh
                   mov	   play_mem,#0     ;机芯当前记忆
		   mov	   play_m,#0       ;暂停前记忆
                   clr     p_sw
		   setb    rec_c
                   setb    play_c
                   clr     comm1
		   mov	   count0,#0
		   mov	   count1,#0
		   mov	   count2,#0
		   mov	   count3,#0
                   mov     woshou,#00h
                   mov     wo_t,#00h
                   mov     sys_pwr,#03h
		   mov	   tmod,#21h	    ;T0方式1定时,T1方式2
		   mov	   th0,#0dch
		   mov	   tl0,#0
		   mov	   th1,#0ffh
		   mov	   tl1,#0ffh
                   clr     vol2             ;音量1
                   setb    vol1
		   ;mov	   scon,#50h	    ;串行方式1允许中断接收
		   ;mov	   pcon,#80h	    ;T1波特发生器,57600 bit/s
		   ;mov	   ip,#00h	    ;串口中断优先
                   clr     et1              ;禁止t1中断
                   clr     tf1              ;清中断标志
		   setb    tr0
                   setb    tr1
		   setb    it0              ;外中断0 边沿触发
                   setb    it1              ;外中断1 边沿触发
		   setb    ex0		    ;允许外中断0
                   setb    ex1		    ;允许外中断1
		   setb    et0              ;允许t0中断
		   setb    ea		    ;开放中断
		   ret
;
wos1:              jnc     wos0
                   ret
woshou_ctl:        mov     a,wo_t
                   cjne    a,#20,wos1
wos0:              mov     a,woshou
                   mov     woshou,#00h
                   jz      wos2
                   cjne    a,#01h,wo_c2
                   mov     sys_pwr,#01h       ;自由
                   lcall   stop_ctl           ;停机
                   lcall   jxc
                   sjmp    wos2
wo_c2:             cjne    a,#03h,wo_c3
                   mov     sys_pwr,#03h       ;关闭
                   sjmp    wos2
wo_c3:             cjne    a,#04h,wo_c4
                   mov     sys_pwr,#02h       ;集控
                   lcall   stop_ctl           ;停机
                   lcall   jxc
                   sjmp    wos2
wo_c4:             cjne    a,#05h,wo_c5
                   mov     sys_pwr,#02h       ;集控
                   lcall   play_ctl_x         ;放音
                   lcall   jxc
                   sjmp    wos2
wo_c5:             cjne    a,#06h,wo_c6
                   mov     sys_pwr,#02h      ;集控
                   lcall   ffw_ctl           ;快进
                   lcall   jxc
                   sjmp    wos2
wo_c6:             cjne    a,#07h,wo_c7
                   mov     sys_pwr,#02h      ;集控
                   lcall   rew_ctl           ;快倒
                   lcall   jxc
                   sjmp    wos2
wo_c7:             cjne    a,#08h,wo_c8
                   mov     sys_pwr,#02h       ;集控
                   lcall   rec_ctl_x          ;录音
                   lcall   jxc
                   sjmp    wos2
wo_c8:             cjne    a,#09h,wo_c9
                   clr     vol2             ;音量0
                   clr     vol1
                   sjmp    wos2
wo_c9:             cjne    a,#0ah,wo_c10
                   clr     vol2       ;音量1
                   setb    vol1
                   sjmp    wos2
wo_c10:            cjne    a,#0bh,wo_c11
                   setb    vol2       ;音量2
                   clr     vol1
                   sjmp    wos2
wo_c11:            cjne    a,#0ch,wos2
                   setb    vol2       ;音量3
                   setb    vol1
wos2:              ret

;
;
b_t0:		   mov	   th0,#0dch
		   mov	   tl0,#0
		   push    psw
		   push    acc
		   dec	   tim	             ;T0定时中断  ,10ms
                   ;mov     comm,#00h         ;清除通讯字节
                   inc	   au_to
                   inc     wo_t
		   inc	   san
		   mov	   a,san
		   cjne    a,#30,b_t0_1
b_t0_0: 	   cpl	   san_bit
		   mov	   san,#0
		   sjmp    b_t0_2
b_t0_1: 	   jnc	   b_t0_0
b_t0_2: 	   pop	   acc
		   pop	   psw
		   reti
                   ;
		   nop
		   nop
		   ljmp    start
		   nop
		   nop
;

key:               clr     kl1_pad            ;键扫程序
                   setb    kl2_pad
                   jnb     kh1_pad,stop_p
                   jnb     kh2_pad,rew_p
                   jnb     kh3_pad,ffw_p
                   setb    kl1_pad
                   clr     kl2_pad
                   jnb     kh1_pad,play_p
                   jnb     kh2_pad,rec_p
                   jnb     kh3_pad,clear_p
                   sjmp    key_end2           ;无键按下
                   ;
stop_p:            lcall   delay_5ms
                   jnb     kh1_pad,stop_p1
                   sjmp    key_end1
stop_p1:           lcall   stop_ctl
                   sjmp    key_end
                   ;
rew_p:             lcall   delay_5ms
                   jnb     kh2_pad,rew_p1
                   sjmp    key_end1
rew_p1:            lcall   rew_ctl
                   sjmp    key_end
                   ;
ffw_p:             lcall   delay_5ms
                   jnb     kh3_pad,ffw_p1
                   sjmp    key_end1
ffw_p1:            lcall   ffw_ctl
                   sjmp    key_end
                   ;
play_p:            lcall   delay_5ms
                   jnb     kh1_pad,play_p1
                   sjmp    key_end1
play_p1:           lcall   play_ctl
                   sjmp    key_end
                   ;
rec_p:             lcall   delay_5ms
                   jnb     kh2_pad,rec_p1
                   sjmp    key_end1
rec_p1:            lcall   rec_ctl
                   sjmp    key_end
                   ;
clear_p:           lcall   delay_5ms
                   jnb     kh3_pad,clear_p1
                   sjmp    key_end1
clear_p1:          lcall   clear_ctl
                   sjmp    key_end1
                   ;
key_end:           lcall   jxc
key_end1:          mov     a,p2                   ;等待按键松开
                   anl     a,#38h      ;读3根行线
                   cjne    a,#38h,key_end1
key_end2:          setb    kh1_pad
                   setb    kh2_pad
                   setb    kh3_pad
                   ret
;
delay10ms:	   mov	   r3,#20
dy1:		   mov	   r2,#230
		   djnz    r2,$
		   djnz    r3,dy1
		   ret
;
                   nop
		   nop
		   ljmp    start
		   nop
		   nop
;
clear_ctl:	   mov	   count0,#0		  ;计数器清零
		   mov	   count1,#0
		   mov	   count2,#0
		   mov	   count3,#0
        	   ret
;
play_ctl_x:        jb	   p_sw,play_ctl_x3       ;放音
		   setb    play_cbit
		   clr	   ffw_cbit
		   clr	   rew_cbit
		   clr	   rec_cbit
		   mov	   play_mem,#2
		   mov	   play_m,#0
		   lcall   jxctl
play_ctl_x3:       ret
;
                   nop
		   nop
		   ljmp    start
		   nop
		   nop
;
play_ctl:	   mov     a,play_mem        	  ;放音及暂停控制
                   cjne    a,#02h,play_ctl2
                   jb      moto_on,play_ctl1
                   mov     au_to,#0          ;暂停
                   setb    moto_on
                   mov     play_m,play_mem
                   sjmp    play_ctl3
play_ctl1:         mov     au_to,#0        ;重启
                   clr     moto_on
                   mov     play_m,#0
                   sjmp    play_ctl3
                   ;
play_ctl2:         jb	   p_sw,play_ctl3       ;放音
		   setb    play_cbit
		   clr	   ffw_cbit
		   clr	   rew_cbit

⌨️ 快捷键说明

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