📄 发送,接收,运算,4x4键盘,i2c,.asm
字号:
;///////////////////////////////////////////
rS EQU P2. 0 ;决定要传送的是命令还是数据
RW EQU P3.7 ;决定要读还是写,一般写的时候多.
E EQU P2.1 ;时钟信号
D1 EQU 39H
D2 EQU 3EH
D3 EQU 3FH
D4 EQU 46H
D5 EQU 47H
;////////////////////////////////////////////
vscl bit p3.4 ;时钟信号
vsda bit p3.5 ;数据信号
sla equ 7dh ;寻址字节存放单元
numbyt equ 7eh ;传送字节数据存放单元
mtd equ 73h ;发放数据的缓冲区
mrd equ 73h ;接收数据的缓冲区
slaw equ 0a0h ;写命令字
slar equ 0a1h ;读命令字
;...........................................
org 0000h
ajmp init
org 30h
init:
;...........................................
; call DELAY_10MS
;call DELAY_10MS
;...........................................
mov sp,#5fh ; /////////串口初始化
mov tmod,#00100000b
mov th1,#0fdh
mov TL1,#0fdh
orl pcon,#00000000b ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
setb tr1
mov scon,#01010000b
mov dptr,#tab ;将表头位置送入DPTR
main:
;.....................................................................
disstart:
mov 3ah,#00h ;将30H个位显示缓冲单元清零
mov 3bh,#00h ;将31H十位显示缓冲单元清零
mov 3ch,#00h ;将32H百位显示缓冲单元清零
mov 3dh,#00h ;将33H千位显示缓冲单元清零
mov 50h,#00h ;将50H个位显示缓冲单元清零
mov 51h,#00h ;将51H十位显示缓冲单元清零
mov 52h,#00h ;将52H百位显示缓冲单元清零
mov 53h,#00h ;将53H千位显示缓冲单元清零
mov 55h,#00h ;将50H个位显示缓冲单元清零
mov 56h,#00h ;将51H十位显示缓冲单元清零
mov 57h,#00h ;将52H百位显示缓冲单元清零
mov 58h,#00h ;将53H千位显示缓冲单元清零
mov 5ah,#00h ;将50H个位显示缓冲单元清零
mov 5bh,#00h ;将51H十位显示缓冲单元清零
mov 5ch,#00h ;将52H百位显示缓冲单元清零
mov 5dh,#00h ;将53H千位显示缓冲单元清零
mov 61h,#00h ;将53H千位显示缓冲单元清零
;.............................................................
;////////////////////////////////////////////
mov mtd,#2bh ;写I2C总线器件的地址
mov sla,#slaw ;写命令
mov numbyt,#1 ;写字节
lcall wrnbyt ;调用写子程序
mov sla,#slar ;读命令
mov numbyt,#4 ;读的字节数
lcall rdnbyt ;调用读字节程序
mov 3ah,73h ;缓冲区地址_V
mov 3bh,74h
MOV 3cH,75H
MOV 3dH,76H
;mov 50h,78H
;mov 51h,79h
;.....................................
/*mov 77h,#01h
mov 78h,#02h
mov 7ah,#03h
mov 79h,#04h*/
/* mov 50h,77h ;缓冲区地址_i
mov 51h,78h
MOV 52H,79H
MOV 53H,7aH*/
;.......................................
;***************************************
; mov 3ah,#05h ;将30H个位显示缓冲单元清零
; mov 3bh,#06h ;将31H十位显示缓冲单元清零
; mov 3ch,#04h ;将32H百位显示缓冲单元清零
;mov 3dh,#03h
;.............................................................
MOV p1,#00000001B ;清屏
ACALL ENABLE
MOV p1,#00000001B ;清屏
ACALL ENABLE
MOV p1,#00111000B ;设置16*2显示,5*7点阵8位数据口
ACALL ENABLE
MOV p1,#00001101B ;开显示,显示光标光标闪烁
ACALL ENABLE
; MOV p1,#00000110B ;读写一个字符地址指针加一,整屏不移动
; ACALL ENABLE
call delay1
;call delay1
mov 34h,#0Ah
MOV p1,#083H ;点
ACALL ENABLE
MOV A, 34h
MOVC A, @A+DPTR
CALL write2
;.....................
mov 54h,#0Ah
MOV p1,#08bH ;点
ACALL ENABLE
MOV A, 54h
MOVC A, @A+DPTR
CALL write2
;.....................
mov 59h,#0Ah
MOV p1,#0c3H ;点
ACALL ENABLE
MOV A, 59h
MOVC A, @A+DPTR
CALL write2
;.....................
mov 5eh,#0Ah
MOV p1,#0ccH ;点
ACALL ENABLE
MOV A, 5eh
MOVC A, @A+DPTR
CALL write2
;.....................
mov 34h,#0Dh
MOV p1,#086H ;第一行显示起始地址 V
ACALL ENABLE
MOV A,34H
MOVC A, @A+DPTR
call write2
;......................
mov 54h,#0Eh
MOV p1,#08eH ;第一行显示起始地址 A
ACALL ENABLE
MOV A,54H
MOVC A, @A+DPTR
call write2
;.....................
mov 59h,#0Eh
MOV p1,#0c6H ;第一行显示起始地址 A
ACALL ENABLE
MOV A,59H
MOVC A, @A+DPTR
call write2
;.....................
MOV 5eh,#0cH
MOV p1,#0ceH ;第一行显示起始地址 w
ACALL ENABLE
MOV A,5eH
MOVC A, @A+DPTR
call write2
;.....................
setb p2.4
CALL DISPLAYv
call DISPLAYi
nop
nop
; call DELAY_10MS
; call DELAY_10MS
nop
nop
setb p2.2
call DISPLAY_read_i
call DISPLAY_to_count_w
call key
clr p2.4
ajmp v
;..............................................................................
key_start:
cpl p2.4
;call from_two_DATE_i
; call DISPLAY_to_count_w
; call DISPLAY_read_i
call from_two
; call from_two_2
;call test_loop
call to_count_v
; call nmul_to_count_w
jb p2.2,chicke_keystoke
setb p2.4
call key ;调用键盘扫描程序
jmp v
chicke_keystoke:
jmp key_start
;..........................................
v:
cjne a,#0bh,chick_i ; 是否有按v,有,继续,无,检查I
lcall key
loop_number1:
cjne a,#0dh,fore_v
jmp key_start ;是否有按ESC,是,退出,不是,送数字到千位
fore_v:
;........................
/*
MOV p1,#00111000B ;设置16*2显示,5*7点阵8位数据口
ACALL ENABLE
MOV p1,#00001101B */
;..........................
mov 3ah,a ;千位
clr p2.4
call DISPLAYv_fore ; 送千位显示
lcall key
cjne a,#0dh,three_v
jmp key_start ;是否有按ESC,是,退出,不是,送数字到百位
three_v:
mov 3bh,a ;百位
call DISPLAYv_three ; 送百位显示
lcall key
cjne a,#0dh,two_v
jmp key_start ;是否有按ESC,是,退出,不是,送数字到十位
two_v:
mov 3ch,a ;十位
call DISPLAYv_two ; 送十位显示
lcall key
cjne a,#0dh,one_v
jmp key_start ;是否有按ESC,是,退出,不是,送数字到个位
one_v:
mov 3dh,a ;个位
call DISPLAYv_one ; 送个位显示
lcall key
cjne a,#0dh,ok_v
jmp key_start ;是否有按ESC,是,退出,不是,向下
ok_v:
cjne a,#0ah,loop_number1 ;是否有按Ok,是,发送,不是,循环千位
setb p2.4
;///////////////////////////////
mov mtd,#2bh ;写器件地址
mov 74h,3aH
mov 75h,3bh
MOV 76H,3cH
MOV 77H,3dH
/* mov 78h,50H
mov 79h,51h
MOV 7aH,52H
MOV 7bH,53H*/
mov numbyt,#5 ;读的字节数
mov sla,#slaw ;写命令
lcall wrnbyt ;调用写子程序
;///////////////////////////////
call to_count_v
call to_v
jmp key_start
;.................................................................................
chick_i:
cjne a,#0ch,key_start ; 是否有按I,没退出,循环检查按键,有,向下继续
lcall key
loop_number2:
cjne a,#0dh,fore_i
jmp key_start ;是否有按ESC,是,退出,不是,送数字到千位
fore_i:
mov 50h,a ;千位
call DISPLAYi_fore ; 送千位显示
lcall key
cjne a,#0dh,three_i
jmp key_start ;是否有按ESC,是,退出,不是,送数字到百位
three_i:
mov 51h,a ;百位
call DISPLAYi_three ; 送百位显示
lcall key
cjne a,#0dh,two_i
jmp key_start ;是否有按ESC,是,退出,不是,送数字到百位
two_i:
mov 52h,a ;十位
call DISPLAYi_two ; 送十位显示
lcall key
cjne a,#0dh,one_i
jmp key_start ;是否有按ESC,是,退出,不是,送数字到百位
one_i:
mov 53h,a ;个位
call DISPLAYi_one ; 送个位显示
lcall key
cjne a,#0dh,ok_i
jmp key_start ;是否有按ESC,是,退出,不是,向下
ok_i:
cjne a,#0ah,loop_number2 ;是否有按Ok,是,送I2C保存和显示,不是,循环千位
call to_count_i
call to_i
jmp key_start
;.................................................................................
KEY:
LCALL KS ;调用检测按键子程序
JNZ K1 ;有键按下继续,累加器非0转移
LCALL DELAY2 ;无键按下调用延时去抖动程序
AJMP KEY ;返回继续检测有无按键按下
K1: LCALL DELAY2
LCALL DELAY2 ;有键按下继续延时去抖动
LCALL KS ;再一次调用检测按键程序
JNZ K2 ;确认有按下进行下一步
JMP KEY ;无键按下返回继续检测
K2:
MOV R7,#0EFH ;将扫描值送入 R7暂存
MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3:
MOV P0,R7 ;将R7的值送入P1口
L6:
JB P0.0,L1 ;P1.0等于1跳转到L1
MOV A,#00H ;将第一行的行值00H送入ACC
AJMP LK ;跳转到键值处理程序
L1:
JB P0.1,L2 ;P1.1等于1跳转到L2
MOV A,#04H ;将第二行的行值送入ACC
AJMP LK ;跳转到键值理程序进行键值处理
L2:
JB P0.2,L3 ;P1.2等于1跳转到L3
MOV A,#08H ;将第三行的行值送入ACC
AJMP LK ;跳转到键值处理程序
L3:
JB P0.3,NEXT ;P1.3等于1跳转到NEXT处
MOV A,#0cH ;将第四行的行值送入ACC
LK:
ADD A,R4 ;行值与列值相加后的键值送入A
PUSH ACC ;将A中的值送入堆栈暂存
K4: LCALL DELAY2 ;调用延时去抖动程序
LCALL KS ;调用按键检测程序
JNZ K4 ;按键没有松开继续返回检测
POP ACC ;将堆栈的值送入ACC
RET
NEXT:
INC R4 ;将列值加一
MOV A,R7 ;将R7的值送入A
JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描,直接寻址为0转移
RL A ;扫描未完成将A中的值右移一位进行下一列的扫描
MOV R7,A ;将ACC的值送入R7暂存
AJMP K3 ;跳转到K3继续
KS:
MOV P0,#0FH ;将P1口高四位置0低四位值1
MOV A,P0 ;读P1口
XRL A,#0FH ;将A中的值与A中的值相异或,相异为1,相同为0
RET ;子程序返回
;..................................................................................................
DISPLAYv:
MOV p1,#081H ;千位
ACALL ENABLE
MOV A,3aH
MOVC A, @A+DPTR
CALL write2
;.....................................................................................................
MOV p1,#082H ;百位
ACALL ENABLE
MOV A,3bH
MOVC A, @A+DPTR
CALL write2
;......................................................
MOV p1,#084H ;十位
ACALL ENABLE
MOV A,3cH
MOVC A, @A+DPTR
CALL write2
;.......................................................
MOV p1,#085H ;个位
ACALL ENABLE
MOV A,3dH
MOVC A, @A+DPTR
CALL write2
ret
;///////////////////////////////////////////////////////
;.......................................................
DISPLAYv_fore:
MOV p1,#081H ;千位
ACALL ENABLE
MOV A,3aH
MOVC A, @A+DPTR
CALL write2
ret
;.........................................................
DISPLAYv_three:
MOV p1,#082H ;百位
ACALL ENABLE
MOV A,3bH
MOVC A, @A+DPTR
CALL write2
ret
;..........................................................
DISPLAYv_two:
MOV p1,#084H ;十位
ACALL ENABLE
MOV A,3cH
MOVC A, @A+DPTR
CALL write2
ret
;.............................................
DISPLAYv_one:
MOV p1,#085H ;个位
ACALL ENABLE
MOV A,3dH
MOVC A, @A+DPTR
CALL write2
ret
;................................................
; //////////////////////////////////发送v区
to_v:
/* clr c ;设定电压,由于硬件放大2倍,所以发送时候要/2,用RRC指令一次,即/2
mov 78h,66h
mov a,78h
rrc a
mov 78h,a
mov 79h,67h
mov a,79h
rrc a
mov 79h,a
clr c*/
;............................
MOV A,#0a9h ; 发送通信头a9
MOV SBUF,a
loop18:
jbc ti,next18
ljmp loop18
next18:
; ANL A,#0FH
MOV A,#06H ; 发送字节数量06
MOV SBUF,a
loop19:
jbc ti,next19
ljmp loop19
next19:
MOV A,#01H ; 发送电压标识01
MOV SBUF,a
loop192:
jbc ti,next192
ljmp loop192
next192:
;.............................
MOV A,66h ; 发送电压实际值
MOV SBUF,a
loop20:
jbc ti,next20
ljmp loop20
next20:
; ANL A,#0FH
MOV A,67H
MOV SBUF,a
loop21:
jbc ti,next21
ljmp loop21
next21:
;*************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -