📄 接收.asm
字号:
;*******************************
;*******************************
;晶体频率11.0592MHz
t0_10ms equ 10h
t0_sec equ 11h
t0_const data 9216-7 ;10ms
;***************
moden_v equ p1.4 ;=0,mode power close
lcd_v equ p3.5 ;=0,lcd power close
;*******************************
org 0
;l1: lcall inc_note_0
; jmp l1
;l2: lcall dec_note_0
; jmp l2
jmp main
;*******************************
org 0bh
jmp t0_isr
org 23h
jmp uart0_isr ;异步串行0口中断
org 0a3h
;*******************************
org 100h
main: mov sp,#60h ;init stack pointer
setb moden_v
clr lcd_v
clr tone_control
lcall clr_inram
lcall code_r_0
lcall note_r_no_0
lcall t0_init
lcall uart_init ;异步串行口初始化
setb ea
lcall lcd_init_1
setb ea
lcall disp_main_0
lcall delay_5s
lcall disp_main_1
;lcall l1
;setb uart0_mark
;lcall delay_5s
;lcall clr_screen_0
;lcall disp_main_2
start: jnb uart0_mark,start_1
lcall write_note_0
lcall lcd_init_0
lcall clr_screen_0
lcall find_note_max_0
lcall disp_note_0
jmp start_25
start_1: mov key_count,#0
lcall read_key
jnb key_mark,start
lcall clr_screen_0
jmp start_12
start_11: jb uart0_mark,start
lcall read_key
jnb key_mark,start_11
start_12: clr key_mark
lcall lcd_init_0
mov a,key_value
cjne a,#key_enter,start_13
mov a,key_count
jnz start_11
lcall disp_main_3
jmp start_2
start_13: cjne a,#key_star,start_14
mov key_count,#0
jmp start_25
start_14: cjne a,#10,start_141
start_141: jnc start_11
mov a,key_count
cjne a,#0,start_142
mov a,key_value
cjne a,#2,start_1411
start_1411: jnc start_11
mov key_beg,a
mov a,para_addr
jz start_1413
cjne a,#note_max,start_1412
start_1412: jc start_1414
start_1413: lcall disp_main_5
jmp start_11
start_1414: inc key_count
lcall disp_main_4
jmp start_11
start_142: mov a,key_beg
mov b,#10
mul ab
add a,key_value
jz start_11
cjne a,#16,start_1421
start_1421: jnc start_11
dec a
cjne a,para_addr,start_1422
start_1422: jnc start_11
mov note_no,a
lcall disp_note_0
jmp start_25
start_2: jb uart0_mark,start_11
lcall read_key
jnb key_mark,start_2
start_22: clr key_mark
lcall lcd_init_0
mov a,key_value
cjne a,#key_enter,start_23
jmp start_25
start_23: cjne a,#key_star,start_24
jmp start_25
start_24: cjne a,#10,start_241
start_241: jnc start_2
jz start_2
mov code_reg,a
mov key_count,#0
lcall code_w_0
start_25: mov key_count,#0
lcall disp_main_1
jmp start
;*******************************
key_count equ 1ch
;定时器初始化
;晶体频率11.0592MHz
;t0_10ms equ 10h
;t0_sec equ 11h
;t0_const data 9216-14 ;10ms
t0_init: orl tmod,#01h
mov th0,#high(-t0_const)
mov tl0,#low(-t0_const)
setb tr0
setb et0
ret
;*******************************
t0_isr: push acc
push psw
clr tr0
mov a,#low(-t0_const);2
add a,tl0;2,2
mov tl0,a;2
mov a,#high(-t0_const);2
addc a,th0;2,2
mov th0,a;2
setb tr0
inc t0_10ms
inc key_t
inc dtmf_t
t0_isr_01: jb dtmf_int,t0_isr_02
clr dtmf_mark1
jmp t0_isr_03
t0_isr_02: lcall dtmf_rx_0
t0_isr_03: mov a,t0_10ms
cjne a,#100,t0_isr_end
mov t0_10ms,#0
inc t0_sec
t0_isr_end: pop psw
pop acc
reti
;*******************************
;读密码放入code_reg开始的1个积存器单元
code_r_0: orl wmcon,#00001000b ;EE不写、使能、数据指针0
mov dptr,#self_addr
movx a,@dptr ;已经接收的信息数;最大为15个
mov code_reg,a
anl wmcon,#11100011b ;EE不写、不使能、数据指针0
ret
;*******************************
;读密码放入code_reg开始的1个积存器单元
code_w_0: orl wmcon,#00011000b ;EE不写、使能、数据指针0
mov dptr,#self_addr
mov a,code_reg
movx @dptr,a ;已经接收的信息数;最大为15个
code_w_01: mov a,wmcon
jnb acc.1,code_w_01
anl wmcon,#11100011b ;EE不写、不使能、数据指针0
ret
;*******************************
tone_control equ p2.7 ;=0,开
dtmf_int equ p2.4 ;mt8870输出
dtmf_mark0 bit 20h.2 ;正在接收命令
dtmf_mark1 bit 20h.3 ;正在接收命令
dtmf_mark bit 20h.4 ;收到有效命令
dtmf_data equ p2
dtmf_t equ 1ah
dtmf_count equ 19h
dtmf_reg equ 58h
dtmf_min data 5
dtmf_max data 10
code_reg equ 1bh ;本机密码
dtmf_rx_0: jb dtmf_int,dtmf_rx_01
dtmf_rx_00: ret
dtmf_rx_01: jb dtmf_mark1,dtmf_rx_00
setb rs0
setb rs1
setb dtmf_mark1
mov dtmf_t,#0
mov a,dtmf_data
anl a,#0fh
cjne a,#11,dtmf_rx_011 ;1:*
setb dtmf_mark0
clr dtmf_mark
mov dtmf_count,#0
mov r0,#dtmf_reg
mov @r0,a
dtmf_rx_010: inc r0
inc dtmf_count
ret
dtmf_rx_011: mov a,dtmf_t
cjne a,#dtmf_max,dtmf_rx_012
dtmf_rx_012: jnc dtmf_rx_0202
dtmf_rx_02: jnb dtmf_mark0,dtmf_rx_00
mov a,dtmf_data
anl a,#0fh
mov @r0,a
mov a,dtmf_count
cjne a,#1,dtmf_rx_021
cjne @r0,#0,dtmf_rx_0203 ;2:0~3
jmp dtmf_rx_0202
dtmf_rx_0203: cjne @r0,#10,dtmf_rx_0200 ;2:0=10
jmp dtmf_rx_010
dtmf_rx_0200: cjne @r0,#4,dtmf_rx_0201 ;2:0~3
dtmf_rx_0201: jnc dtmf_rx_0202
jmp dtmf_rx_010
dtmf_rx_0202: clr dtmf_mark0
ret
dtmf_rx_021: cjne a,#2,dtmf_rx_022
cjne @r0,#12,dtmf_rx_0202;3:#
jmp dtmf_rx_010
dtmf_rx_022: cjne a,#5,dtmf_rx_023
cjne @r0,#11,dtmf_rx_0221;6:1~10
dtmf_rx_0221: jnc dtmf_rx_0202
lcall code_comp_0
jmp dtmf_rx_0202
dtmf_rx_023: jc dtmf_rx_0231
ret
dtmf_rx_0231: cjne @r0,#11,dtmf_rx_0232;4,5:1~10
dtmf_rx_0232: jnc dtmf_rx_0202
jmp dtmf_rx_010
code_comp_0: push b
mov r0,#dtmf_reg+3
code_comp_01: mov a,@r0
inc r0
mov b,@r0
cjne a,b,code_comp_011 ;4:5
jmp code_comp_02
code_comp_011: inc r0
mov b,@r0
cjne a,b,code_comp_012 ;4:6
jmp code_comp_02
code_comp_012: dec r0
mov a,@r0
cjne a,b,code_comp_013 ;5:6
jmp code_comp_02
code_comp_013: pop b
ret
code_comp_02: pop b
cjne a,#10,code_comp_021
jmp code_comp_03
code_comp_021: cjne a,code_reg,code_comp_030 ;code
code_comp_03: mov r0,#dtmf_reg+1
cjne @r0,#10,code_comp_031
clr tone_control
clr moden_v
code_comp_030: ret
code_comp_031: cjne @r0,#1,code_comp_032
setb tone_control
setb moden_v
ret
code_comp_032: cjne @r0,#2,code_comp_033
setb tone_control
setb moden_v
ret
code_comp_033: cjne @r0,#3,code_comp_034
clr tone_control
setb moden_v
code_comp_034: ret
;*0#XXX:接收机声音关,开MODEN,XXX=0~9,0-通播
;*1#XXX:接收机声音开,关MODEN,XXX=1~9,X本机码
;*2#XXX:接收机声音开,XXX=1~9
;*3#XXX:接收机声音关,关MODEN,XXX=1~9
;*******************************
;异步串行口初始化
;波特率=sysclk/(32*12*(256-th1),smod=0
;系统时钟=24MHz(22.1184MHz)
;波特率 0:1200bps,1:4800bps,2:9600bps(default),3:19200bps(默认),4:115200bps;
baud9600 data 3 ;
baud4800 data 6 ;
baud2400 data 12 ;
baud1200 data 24 ;
;***************
;uart0波特率设置
;波特率=sysclk/(32*(65536-rcap2:rcap2l)),rclk0或tclk0=1
baud equ baud9600 ;定时器2重载值
;*******************************
t1_init: orl tmod,#20h
mov tl1,#low(-baud)
mov th1,#low(-baud)
setb tr1
ret
;***************
;
uart_init: mov scon,#01010000b;9位UART,可变波特率,SM20忽,ren=1
lcall t1_init
orl ie,#00010000b ;异步串行口0中断使能,es0=1
ret ;从程序中返回
;*******************************
;*******************************
;异步串行口uart0中断
uart0_r_addr data 80h ;串口0接收80h~0ffh共128个字节
uart0_mark bit 20h.0 ;串口0接收结束标志
uart0_mark0 bit 20h.1 ;串口0正在标志
uart_ack data 6 ;主控单元正确接收时回送一个确认字符ACK(06h)
uart_nak data 15h ;主控单元错误接收时回送一个否认字符NAK(15h)
uart_stx data 2 ;命令起始符STX(02h)
uart_etx data 3 ;命令结束符ETX(03h)
uart0_begh equ 14h ;串口0接收计数器高8位
uart0_begl equ 15h ;串口0接收计数器低8位
uart0_reg equ 16h ;串口0接收暂存单元
wmcon equ 96h ;WMCON:看门狗及存储器控制积存器
;WMCON:看门狗及存储器控制积存器
;PS2 PS1 PS0 EEMWE EEMEN DSP WDTRST WDTEN
;看门狗时间 写 使能 数据指针 空/闲 看门狗使能
;***************
uart0_isr: jnb ri,uart0_isr_end ;判断是否由接收引起的中断
clr ri
jb moden_v,uart0_isr_end
push psw
push acc
push b
;orl wmcon,#00011000b ;EE写、使能、数据指针1
setb rs0 ;工作区=1,仅使用了R0(08H)
mov a,sbuf
mov uart0_reg,a
clr ri
uart0_isr_01: mov a,uart0_reg
cjne a,#uart_stx,uart0_isr_02;命令起始符STX(02h)
mov uart0_begh,#high(uart0_r_addr)
mov uart0_begl,#low(uart0_r_addr)
clr uart0_mark
setb uart0_mark0
jmp uart0_isr_04
uart0_isr_02: jnb uart0_mark0,uart0_isr_05
cjne a,#uart_etx,uart0_isr_03;命令结束符ETX(03h)
setb uart0_mark
clr uart0_mark0
jmp uart0_isr_04
uart0_isr_03: ;jnb uart0_mark0,uart0_isr_05
;clr uart0_mark
;jmp uart0_isr_05
uart0_isr_04: mov r0,uart0_begl
mov @r0,a
inc r0
mov uart0_begl,r0
cjne r0,#0ffh,uart0_isr_05
setb uart0_mark
clr uart0_mark0
mov @r0,#uart_etx
uart0_isr_05: pop b
pop acc
pop psw
uart0_isr_end: reti
;*******************************
clr_inram: mov r0,#10h
mov r2,#50h
clr a
clr_inram_01: mov @r0,a
inc r0
djnz r2,clr_inram_01
mov r0,#80h
mov r2,#80h
clr_inram_02: mov @r0,a
inc r0
djnz r2,clr_inram_02
ret
;*******************************
;***************
key_enter data 11
key_star data 10
key_up data 2
key_dn data 8
key_left data 4
key_righ data 6
;***************
; p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6 p1.7
; kd0 kd1 kd2 kd3 kd4 kd5 kd6 kd7
;kd8 1 4 7 * p3.2
;kd9 2 5 8 0 p3.3
;kd10 3 6 9 # p3.4
kd8 bit p3.2
kd9 bit p3.3
kd10 bit p3.4
kd_v equ p1
key_t equ 12h ;按键时间
key_value equ 13h ;键值
key_mark bit 20h.5 ;=0,按键无效; =1,有效按键结束标志
key_mark0 bit 20h.6 ;=0,未按键或key_t>=50ms;0<=key_t<50ms =1,,按键有效标志
key_mark1 bit 20h.7 ;=0,key_t<50ms; =1,key_t>=50ms,按键有效标志
key_const data 5 ;按键最小有效时间>=50ms
key_beg equ 50h ;键入数字缓冲区首地址
;***************
read_key: orl kd_v,#00001111b
clr kd8
clr kd9
clr kd10
mov a,kd_v
orl a,#11110000b
cjne a,#255,read_key_1 ;有键按下,转
read_key_0: jnb key_mark1,read_key_03
jnb key_mark0,read_key_03
;clr key_mark0
;mov key_t,#0
read_key_01: mov a,key_t
cjne a,#key_const+3,read_key_02
read_key_02: jc read_key_04 ;软件去毛刺20~30ms
setb key_mark ;key_t>=50ms,按键有效标志
read_key_03: clr key_mark0
clr key_mark1
read_key_04: ret
read_key_1: setb kd8
setb kd9
setb kd10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -