📄 接收.asm
字号:
clr kd8
mov 24h,#0
mov a,kd_v
orl a,#11110000b
cjne a,#255,read_key_11
setb kd8
setb kd10
clr kd9
mov 24h,#4
mov a,kd_v
orl a,#11110000b
cjne a,#255,read_key_11
setb kd8
setb kd9
clr kd10
mov 24h,#8
mov a,kd_v
orl a,#11110000b
cjne a,#255,read_key_11
jmp read_key_0
read_key_11: mov a,kd_v
mov b,#4
mov r2,#0
read_key_12: rrc a
jnc read_key_13
inc r2
djnz b,read_key_12
jmp read_key_0
read_key_13: mov a,24h
add a,r2
cjne a,#12,read_key_14
read_key_14: jc read_kay_2
jmp read_key_0
read_kay_2: mov dptr,#key_tab
movc a,@a+dptr
mov key_value,a ;转换键值
jb key_mark1,read_key_22
jb key_mark0,read_key_21
mov key_t,#0
clr key_mark1
clr key_mark
read_key_21: setb key_mark0
read_key_22: mov a,key_t
cjne a,#key_const,read_key_23
read_key_23: jnc read_key_24
ret
read_key_24: setb key_mark1
mov key_t,#key_const
ret
;*******************************
key_tab:
; 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11,12,13
; 1, 4, 7, *, 2, 5, 8, 0, 3, 6, 9, 确定
db 1, 4, 7, 10,2, 5, 8, 0, 3, 6, 9, 11, 255
;*******************************
;B系列液晶显示模块应用程序 :(3a)开头 a0结束
lcd_busy equ p1.5 ;应答信号=0:模块空闲,可接收数据
lcd_req equ p1.6 ;请求信号,高电平有效
lcd_rest equ p1.7 ;复位信号,低电平有效
lcd_port equ p0 ;模块接收数据口
;***************
;模块初始化
lcd_init_0: ret
jb lcd_v,lcd_init_05
clr lcd_req
setb lcd_busy
setb lcd_rest
setb lcd_v
mov r7,#10
lcd_init_01: mov a,#229
djnz acc,$
djnz r7,lcd_init_01
lcd_init_03: mov a,#0f4h
lcall lcd_write_0
mov r7,#20
lcd_init_04: mov a,#229
djnz acc,$
djnz r7,lcd_init_04
lcd_init_05: ret
;***************
;模块初始化
lcd_init_1: setb lcd_rest
clr lcd_req
mov a,#10
djnz acc,$
setb lcd_busy
setb lcd_v
mov r7,#10
lcd_init_11: mov a,#229
djnz acc,$
djnz r7,lcd_init_11
lcd_init_13: mov a,#0f4h
lcall lcd_write_0
mov r7,#20
lcd_init_14: mov a,#229
djnz acc,$
djnz r7,lcd_init_14
ret
;*******************************
;写模块子程序(双线应答方式)
lcd_write_0: jb lcd_busy,$ ;确信模块空闲(BUSY=0)
mov lcd_port,a ;向总线送数
nop ;等待数据总线稳定
setb lcd_req ;向模块发请求命令
lcd_write_01: ;mov acc,#10
;djnz acc,$
jnb lcd_busy,$ ;等待模块响应(BUSY =1)
clr lcd_req ;撤消REQ请求信号,数据输入结束
ret
;*******************************
x_reg equ 30h ;行坐标值,02到09
y_reg equ 31h ;列坐标值,00到03
char_h equ 32h ;GB2312汉字区位码高位
char_l equ 33h ;GB2312汉字区位码低位
local_reg equ 34h ;半角计数器
;写汉字程序
char_write_0: clr c
cjne a,#0b0h,char_write_01
char_write_01: jc ascii_write_0
mov a,#0f0h ;选显示汉字命令字
lcall lcd_write_0 ;调用写子程序
mov a,x_reg ;以汉字为单位的屏幕行坐标值,02到09
lcall lcd_write_0
mov a,y_reg ;以汉字为单位的屏幕列坐标值,00到03
lcall lcd_write_0
clr c
mov a,char_h ;GB2312汉字区位码高位
subb a,#0a0h
clr c
lcall lcd_write_0
clr c
mov a,char_l ;GB2312汉字区位码低位
subb a,#0a0h
clr c
lcall lcd_write_0
ret
;*******************************
;写ASCII程序
ascii_write_0: mov a,#0f9h ;选显示ascii命令字
lcall lcd_write_0 ;调用写子程序
mov a,x_reg ;以ascii为单位的屏幕行坐标值,04到13
lcall lcd_write_0
mov a,y_reg ;以ascii为单位的屏幕列坐标值,00到3F
lcall lcd_write_0
mov a,char_h ;ascii码
lcall lcd_write_0
ret
;*******************************
h_max data 16 ;每行最大ASCII字符数
char_addr_0: mov a,char_h
cjne a,#20h,char_addr_00
char_addr_00: jnc char_addr_01
ret
char_addr_01: cjne a,#0b0h,char_addr_011
char_addr_011: jnc char_addr_02
mov a,local_reg
mov b,#h_max
div ab
mov x_reg,b
mov y_reg,a
mov b,#4
div ab
mov y_reg,b
jnz char_addr_012
mov a,local_reg
jz char_addr_012
mov a,x_reg
jnz char_addr_012
;lcall clr_screen_0
char_addr_012: inc local_reg
mov a,x_reg
add a,#4
mov x_reg,a
mov a,y_reg
mov b,#16
mul ab
mov y_reg,a
mov a,#0
ret
char_addr_02: mov a,local_reg
jnb acc.0,char_addr_021
inc a
mov local_reg,a
char_addr_021: mov b,#h_max
div ab
mov x_reg,b
mov y_reg,a
mov a,x_reg
rr a
mov x_reg,a
mov a,y_reg
mov b,#4
div ab
mov y_reg,b
jnz char_addr_022
mov a,local_reg
jz char_addr_022
mov a,x_reg
jnz char_addr_022
;lcall clr_screen_0
char_addr_022: inc local_reg
inc local_reg
mov a,x_reg
add a,#2
mov x_reg,a
mov a,#0ffh
ret
;*******************************
;清屏
clr_screen_0: mov a,#0f4h ;选显示清屏命令字
lcall lcd_write_0 ;调用写子程序
ret
;*******************************
;上移
lcd_up_0: mov a,#0f5h ;选显示上移命令字
lcall lcd_write_0 ;调用写子程序
ret
;*******************************
;下移
lcd_dn_0: mov a,#0f6h ;选显示下移命令字
lcall lcd_write_0 ;调用写子程序
ret
;*******************************
;左移
lcd_left_0: mov a,#0f7h ;选显示左移命令字
lcall lcd_write_0 ;调用写子程序
ret
;*******************************
;右移
lcd_righ_0: mov a,#0f8h ;选显示右移命令字
lcall lcd_write_0 ;调用写子程序
ret
;*******************************
;WMCON:看门狗及存储器控制积存器
;PS2 PS1 PS0 EEMWE EEMEN DSP WDTRST WDTEN
;看门狗时间 写 使能 数据指针 空/闲 看门狗使能
;*******************************
self_addr equ 7f0h ;本机地址
note_count equ 7d0h ;已经接收的信息数;最大为15个
para_addr equ 40h ;参数暂存积存器起始地址
note_max data 15 ;最大短信数
note_no equ 1dh ;当前短信号
;7d1h~7de:信息号
;*******************************
;存储短信
write_note_0: jb uart0_mark,write_note_01
ret
write_note_01: clr uart0_mark
mov r0,#uart0_r_addr
mov a,@r0
cjne a,#uart_stx,write_note_010
jmp write_note_011
write_note_010: ret
write_note_011: lcall note_r_no_0
lcall inc_note_0
lcall find_note_max_0
write_note_02: clr c
subb a,#para_addr+1
mov b,#80h
mul ab
mov dpl,a
mov dph,b
mov r0,#uart0_r_addr
orl wmcon,#00011000b ;EE写、使能、数据指针1
write_note_03: mov a,@r0
movx @dptr,a
push acc
inc r0
inc dptr
write_note_031: mov a,wmcon
jnb acc.1,write_note_031
pop acc
cjne a,#uart_etx,write_note_03
anl wmcon,#11100011b ;EE不写、使能、数据指针0
write_note_032: mov a,wmcon
jnb acc.1,write_note_032
ret
;*******************************
char_count equ 24h
;短信(短信号=note_no)显示
disp_note_0: lcall clr_screen_0
lcall note_r_no_0
disp_note_00: lcall find_note_0 ;查短信(短信号=note_no)
cjne @r0,#note_max,disp_note_000
disp_note_000: jc disp_note_001
ret
disp_note_001: clr c
subb a,#para_addr+1
mov b,#80h
mul ab
mov dpl,a
mov dph,b
mov char_count,#0
disp_note_019: mov local_reg,#0
orl wmcon,#00001000b ;EE不写、使能、数据指针1
disp_note_01: movx a,@dptr
inc dptr
cjne a,#0ffh,disp_note_010
jmp disp_note_015
disp_note_010: cjne a,#20h,disp_note_011
disp_note_011: jc disp_note_014
mov char_h,a
cjne a,#0b0h,disp_note_012
disp_note_012: jc disp_note_013
mov a,local_reg
jnb acc.0,disp_note_0121
lcall dptr_dec_0
mov char_h,#20h
jmp disp_note_013
disp_note_0121: movx a,@dptr
inc dptr
mov char_l,a
disp_note_013: lcall char_addr_0
mov a,char_h
lcall char_write_0
jmp disp_note_016
disp_note_014: cjne a,#uart_etx,disp_note_01
disp_note_015: jmp disp_note_017
disp_note_016: mov a,local_reg
mov b,#64
div ab
xch a,b
jnz disp_note_01
lcall delay_5s
lcall clr_screen_0
jmp disp_note_019
disp_note_017: mov a,char_count
add a,local_reg
mov char_count,a
disp_note_02: jnb uart0_mark,disp_note_021
lcall write_note_0
lcall clr_screen_0
lcall find_note_max_0
jmp disp_note_00
disp_note_021: lcall read_key
jnb key_mark,disp_note_02
clr key_mark
lcall lcd_init_0
mov a,key_value
cjne a,#key_enter,disp_note_023
disp_note_0210: anl wmcon,#11100011b ;EE不写、不使能、数据指针0
ret
disp_note_023: cjne a,#key_up,disp_note_024
lcall clr_screen_0
;clr c
;mov a,char_count
;subb a,local_reg
;jc disp_note_0235
;jz disp_note_0235
;mov b,#64
;div ab
;jz disp_note_0235
;jmp disp_note_00
disp_note_0235: dec note_no
jmp disp_note_03
disp_note_024: cjne a,#key_dn,disp_note_025
lcall clr_screen_0
;orl wmcon,#00001000b ;EE不写、使能、数据指针1
;lcall dptr_dec_0
;movx a,@dptr
;inc dptr
;cjne a,#uart_etx,disp_note_0242
inc note_no
jmp disp_note_03
disp_note_0242: jmp disp_note_019
disp_note_025: cjne a,#key_star,disp_note_026
lcall clr_screen_0
lcall dec_note_0
mov a,para_addr
jz disp_note_0252
cjne a,#note_max,disp_note_0251
disp_note_0251: jc disp_note_0253
disp_note_0252: lcall disp_main_5
jmp disp_note_02
disp_note_0253: jmp disp_note_00
disp_note_026: jmp disp_note_02
disp_note_03: mov b,para_addr
mov a,b
jz disp_note_0210
mov a,note_no
cjne a,b,disp_note_031
mov note_no,#0
jmp disp_note_00
disp_note_031: jc disp_note_032
mov note_no,para_addr
dec note_no
disp_note_032: jmp disp_note_00
;*******************************
;dptr-1
dptr_dec_0: push acc
clr c
mov a,dpl
subb a,#1
mov dpl,a
mov a,dph
subb a,#0
mov dph,a
pop acc
ret
;*******************************
;读短信信息号及地址放入para_addr开始的15个积存器单元
note_r_no_0: orl wmcon,#00001000b ;EE不写、使能、数据指针0
mov r0,#para_addr
mov dptr,#note_count
mov r2,#note_max+1
note_r_no_01: movx a,@dptr ;已经接收的信息数;最大为15个
mov @r0,a
inc r0
inc dptr
djnz r2,note_r_no_01
anl wmcon,#11100011b ;EE不写、不使能、数据指针0
ret
;*******************************
;写短信信息号及地址放入note_count开始的15个积存器单元
note_w_no_0: orl wmcon,#00011000b ;EE不写、使能、数据指针0
mov r0,#para_addr
mov dptr,#note_count
mov r2,#note_max+1
note_w_no_01: mov a,@r0
movx @dptr,a ;已经接收的信息数;最大为15个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -