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

📄 接收.asm

📁 用于实现对液晶进行显示控制以及对键盘进行扫描识别
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*******************************
;*******************************
;晶体频率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 + -