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

📄 接收.asm

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