📄 iic按键读写与显示.txt
字号:
MODE EQU 30H
WRITE EQU 1
READ EQU 2
;-------
SUB_MODE EQU 31H
WRITE_NONE EQU 1
WRITE_ADD EQU 2
WRITE_LENGTH EQU 3
WRITE_DATA EQU 4
READ_NONE EQU 1
READ_ADD EQU 2
READ_LENGTH EQU 3
READ_DATA EQU 4
;-------
DISP_FLAG BIT 00H
KEY_BUFF EQU 32H
DISP_BUFF EQU 34H
COUNT EQU 35H
COMMOND EQU 38H
WRITE_ADD_BUFF EQU 40H
WRITE_LENGTH_BUFF EQU 41H
WRITE_LENGTH_BUFF1 EQU 56H
WRITE_DATA_BUFF EQU 42H
W_DATA_BUFF EQU 70H
READ_ADD_BUFF EQU 54H
READ_LENGTH_BUFF EQU 55H
READ_LENGTH_BUFF1 EQU 57H
READ_DATA_BUFF EQU 53H
R_DATA_BUFF EQU 60H
;---------
SCL BIT P3.2
SDA BIT P3.3
CONTROL EQU 56H
DATA1 EQU 58H
;---------
RS BIT P3.5
RW BIT P3.6
EN BIT P3.7
;--------
DELAY1 EQU 50H
DELAY2 EQU 51H
DELAY3 EQU 52H
;--------------------------
ORG 00H
LJMP INIT
ORG 40H
;---------------------------
INIT:
MOV MODE,#WRITE
MOV SUB_MODE,#WRITE_NONE
MOV COUNT,#0
SETB DISP_FLAG
MOV COMMOND,#38H ;8位数据总线,两行模式,5*7点阵+光标显示模式
LCALL W_COMMOND
MOV COMMOND,#01H ;该指令将空格码(0x20)写入显存中;达到清屏显示的功能。
LCALL W_COMMOND
MOV COMMOND,#0FH ;显示开,光标显示,光标所在位闪烁启动
LCALL W_COMMOND
MOV COMMOND,#06H ;AC为自动加1计数器,操作数据后AC自动加1,写入字符数据时禁止画面滚动/光标移动
LCALL W_COMMOND
MOV R1,#0
MOV R7,#4
MOV R6,#2
MOV R0,#W_DATA_BUFF
MOV R2,#8
;---------------------------
MAIN:
LCALL SCAN_KEY
LCALL DISP
LJMP MAIN
;----------------------------
;FUNCTON:显示子程序
;----------------------------
DISP:
JNB DISP_FLAG,DISP_RET1
CLR DISP_FLAG
MOV A,MODE
CJNE A,#WRITE,DISP_READ
;-------------------------------------
;FUNCTION:写模式下显示相关信息及数据
;--------------------------
MOV A,SUB_MODE
CJNE A,#WRITE_NONE,DISP_WRITE_ADD
MOV A,COUNT
CJNE A,#0,DISP_WRITE_NONE
MOV COMMOND,#80H
MOV DISP_BUFF,#'W'
LCALL DISP1 ;DISP "W"
RET
DISP_RET1:
RET
DISP_READ:
LJMP DISP_READ1
RET
DISP_WRITE_NONE:
MOV COMMOND,#81H
MOV DISP_BUFF,#'*'
LCALL DISP1 ;DISP "*"
RET
DISP_WRITE_ADD:
CJNE A,#WRITE_ADD,DISP_WRITE_LENGTH
MOV A,COUNT
CJNE A,#1,DISP_WRITE_ADD0
MOV COMMOND,#82H
MOV DISP_BUFF,#'A'
LCALL DISP1 ;DISP "A"
RET
DISP_WRITE_ADD0:
CJNE A,#2,DISP_WRITE_ADD1
MOV COMMOND,#83H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_WRITE_ADD1:
MOV COMMOND,#84H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_WRITE_LENGTH:
CJNE A,#WRITE_LENGTH,DISP_WRITE_DATA
MOV A,COUNT
CJNE A,#1,DISP_WRITE_LENGTH0
MOV COMMOND,#85H
MOV DISP_BUFF,#'L'
LCALL DISP1 ;DISP "L"
RET
DISP_WRITE_LENGTH0:
MOV COMMOND,#86H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_WRITE_DATA:
MOV A,COUNT
CJNE A,#1,DISP_WRITE_DATA1
MOV COMMOND,#0C0H
MOV DISP_BUFF,#'S'
LCALL DISP1 ;DISP "S"
RET
DISP_WRITE_DATA1:
ADD A,#0BEH
MOV COMMOND,A
LCALL DISP1 ;DISP "DISP_BUFF"
RET
;--------------------------
;FUNCTION:读模式下显示相关信息及数据
;--------------------------
DISP_READ1:
MOV A,SUB_MODE
CJNE A,#READ_NONE,DISP_READ_ADD
MOV A,COUNT
CJNE A,#0,DISP_READ_NONE
MOV COMMOND,#80H
MOV DISP_BUFF,#'R'
LCALL DISP1 ;DISP "R"
RET
DISP_RET:
RET
DISP_READ_NONE:
MOV COMMOND,#81H
MOV DISP_BUFF,#'*'
LCALL DISP1 ;DISP "*"
RET
DISP_READ_ADD:
CJNE A,#READ_ADD,DISP_READ_LENGTH
MOV A,COUNT
CJNE A,#1,DISP_READ_ADD1
MOV COMMOND,#82H
MOV DISP_BUFF,#'A'
LCALL DISP1 ;DISP "A"
RET
DISP_READ_ADD1:
CJNE A,#2,DISP_READ_ADD2
MOV COMMOND,#83H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_READ_ADD2:
MOV COMMOND,#84H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_READ_LENGTH:
CJNE A,#READ_LENGTH,DISP_READ_DATA
MOV A,COUNT
CJNE A,#1,DISP_READ_LENGTH1
MOV COMMOND,#85H
MOV DISP_BUFF,#'L'
LCALL DISP1 ;DISP "L"
RET
DISP_READ_LENGTH1:
MOV COMMOND,#86H
LCALL DISP1 ;DISP "DISP_BUFF"
RET
DISP_READ_DATA:
MOV R0,#R_DATA_BUFF
MOV COMMOND,#0C0H
DISP_READ_DATA1:
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV DISP_BUFF,A
LCALL DISP_CHANGE
LCALL DISP1
INC COMMOND
MOV A,@R0
ANL A,#0FH
MOV DISP_BUFF,A
LCALL DISP_CHANGE
LCALL DISP1
INC COMMOND
INC R0
DJNZ READ_LENGTH_BUFF1,DISP_READ_DATA1
RET
;-------------------------------------------
;FUNCTION:按键扫描子程序
;------------------------------------
SCAN_KEY:
MOV P1,#1FH
CLR P3.0
MOV A,P1
ORL A,#0E0H
CPL A
JNZ SCAN_1
RET
SCAN_1:
LCALL DELAY5MS
MOV P1,#1FH
CLR P3.0
MOV A,P1
ORL A,#0E0H
CPL A
JNZ SCAN_2
RET
SCAN_2:
SETB DISP_FLAG
SETB P3.0
MOV P1,#0DFH
JNB P1.1,SCAN_KEY_1
JNB P1.2,SCAN_KEY_2
JNB P1.3,SCAN_KEY_3
JNB P1.4,SCAN_KEY_4
MOV P1,#0BFH
JNB P1.0,SCAN_KEY_5
JNB P1.1,SCAN_KEY_6
JNB P1.2,SCAN_KEY_7
JNB P1.3,SCAN_KEY_8
JNB P1.4,SCAN_KEY_9
MOV P1,#7FH
JNB P1.0,SCAN_KEY_10
JNB P1.1,SCAN_KEY_11
JNB P1.2,SCAN_KEY_12
JNB P1.3,SCAN_KEY_13
JNB P1.4,SCAN_KEY_14
CLR P3.0
MOV P1,#0FFH
JNB P1.1,SCAN_KEY_15
JNB P1.2,SCAN_KEY_16
JNB P1.3,SCAN_KEY_17
JNB P1.4,SCAN_KEY_18
RET
;--------------
;FUNCITON:储存按键值并转到相应处理程序
;----------------
SCAN_KEY_1:
MOV KEY_BUFF,#00H
LJMP KEY_PROCESS
RET
SCAN_KEY_2:
MOV KEY_BUFF,#04H
LJMP KEY_PROCESS
RET
SCAN_KEY_3:
MOV KEY_BUFF,#08H
LJMP KEY_PROCESS
RET
SCAN_KEY_4:
MOV KEY_BUFF,#0CH
LJMP KEY_PROCESS
RET
SCAN_KEY_5:
LJMP MODE_CHANGE
RET
SCAN_KEY_6:
MOV KEY_BUFF,#01H
LJMP KEY_PROCESS
RET
SCAN_KEY_7:
MOV KEY_BUFF,#05H
LJMP KEY_PROCESS
RET
SCAN_KEY_8:
MOV KEY_BUFF,#09H
LJMP KEY_PROCESS
RET
SCAN_KEY_9:
MOV KEY_BUFF,#0DH
LJMP KEY_PROCESS
RET
SCAN_KEY_10:
LJMP SUB_MODE_CHANGE
RET
SCAN_KEY_11:
MOV KEY_BUFF,#02H
LJMP KEY_PROCESS
RET
SCAN_KEY_12:
MOV KEY_BUFF,#06H
LJMP KEY_PROCESS
RET
SCAN_KEY_13:
MOV KEY_BUFF,#0AH
LJMP KEY_PROCESS
RET
SCAN_KEY_14:
MOV KEY_BUFF,#0EH
LJMP KEY_PROCESS
RET
SCAN_KEY_15:
MOV KEY_BUFF,#03H
LJMP KEY_PROCESS
RET
SCAN_KEY_16:
MOV KEY_BUFF,#07H
LJMP KEY_PROCESS
RET
SCAN_KEY_17:
MOV KEY_BUFF,#0BH
LJMP KEY_PROCESS
RET
SCAN_KEY_18:
MOV KEY_BUFF,#0FH
LJMP KEY_PROCESS
RET
;--------------------
;FUNCTION:写模式下按键处理子程序
;---------------------
KEY_PROCESS:
MOV A,MODE
CJNE A,#WRITE,KEY_PROCESS_READ1
MOV A,SUB_MODE
CJNE A,#WRITE_NONE,KEY_PROCESS_WRITE_2
RET
KEY_PROCESS_READ1:
LJMP KEY_PROCESS_READ
RET
KEY_PROCESS_WRITE_2:
CJNE A,#WRITE_ADD,KEY_PROCESS_WRITE_3
INC COUNT
MOV A,COUNT
CJNE A,#2,KEY_PROCESS_WRITE_21
MOV A,KEY_BUFF
SWAP A
MOV WRITE_DATA_BUFF,A
MOV A,WRITE_ADD_BUFF
ANL A,#0FH
ORL A,WRITE_DATA_BUFF
MOV WRITE_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_WRITE_21:
CJNE A,#3,KEY_PROCESS_WRITE_22
MOV A,WRITE_ADD_BUFF
ANL A,#0F0H
ORL A,KEY_BUFF
MOV WRITE_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_WRITE_22:
MOV COUNT,#2
MOV A,WRITE_ADD_BUFF
ANL A,#0FH
MOV WRITE_ADD_BUFF,A
MOV A,KEY_BUFF
SWAP A
ORL A,WRITE_ADD_BUFF
MOV WRITE_ADD_BUFF,A
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_WRITE_3:
CJNE A,#WRITE_LENGTH,KEY_PROCESS_WRITE_4
INC COUNT
MOV A,COUNT
CJNE A,#2,KEY_PROCESS_WRITE_31
MOV WRITE_LENGTH_BUFF,KEY_BUFF
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_WRITE_31:
MOV COUNT,#2
MOV WRITE_LENGTH_BUFF,KEY_BUFF
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
;--------------------
;FUNCTION:对输入用于存储的数据进行处理,当超过输入长度时数据从头开始从写
;--------------------
KEY_PROCESS_WRITE_4:
INC COUNT
MOV A,COUNT
CJNE A,WRITE_LENGTH_BUFF1,KEY_PROCESS_WRITE_41
MOV A,KEY_BUFF
MOV WRITE_DATA_BUFF,A
MOV A,@R0
ANL A,#0F0H
ORL A,WRITE_DATA_BUFF
MOV @R0,A
INC R0
MOV R6,#2
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
KEY_PROCESS_WRITE_41:
JNC KEY_PROCESS_WRITE_42
CJNE R6,#2,KEY_PROCESS_WRITE_411
MOV A,KEY_BUFF
SWAP A
MOV WRITE_DATA_BUFF,A
MOV A,@R0
ANL A,#0FH
ORL A,WRITE_DATA_BUFF
MOV @R0,A
DEC R6
LJMP KEY_RET1
KEY_PROCESS_WRITE_411:
MOV A,KEY_BUFF
MOV WRITE_DATA_BUFF,A
MOV A,@R0
ANL A,#0F0H
ORL A,WRITE_DATA_BUFF
MOV @R0,A
INC R0
MOV R6,#2
KEY_RET1:
MOV DISP_BUFF,KEY_BUFF
LCALL DISP_CHANGE
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -