📄 程序.asm
字号:
;----------------------------------------------------------------------------------------
;标志位常量定义区(占用空间为20H~3FH)
;----------------------------------------------------------------------------------------
EEPROM2 EQU 0A0H
FLAG DATA 20H ;辅助工作标志字节
CXB BIT FLAG.0 ;查询状态标志位
JIAB BIT FLAG.1 ;加法状态标志位
JIANB BIT FLAG.2 ;减法状态标志位
JIAD BIT FLAG.3 ;甲队大比分键标志位
JIAX BIT FLAG.4 ;甲队小比分键标志位
YID BIT FLAG.5 ;乙队大比分键标志位
YIX BIT FLAG.6 ;乙队小比分键标志位
KEYP BIT FLAG.7 ;响应标志
BZHI DATA 21H ;辅助工作标志字节
BZ BIT BZHI.0 ;闪烁标志位,当此位为1的时候灭0的时候正常显示
sZ BIT BZHI.1 ;翻动键标志位,用于所选比赛队伍分数闪烁
dz bit bzhi.2 ;数字缓冲区显示标志位
ACK BIT bzhi.3 ;接收数据非应答标志
jies data 24h ;结束按键次数存储单元
chax data 25h ;查询按键次数存储单元
subadr1 data 26h ;24C64读或者写单元first地址
subadr2 data 27h ;24C64读或者写单元second地址
rdsubadr1 data 28h ;24C64读单元first地址
rdsubadr2 data 29h ;24C64读单元second地址
wTSUBADR1 DATA 2dH ;24C64写单元first地址
wTSUBADR2 DATA 2cH ;24C64写单元second地址
BYTECNT DATA 2bH ;I2C 数据字节计数器
SLVADR DATA 2aH ;被控器地址
BUF7 DATA 2eH ;用于选择操作对象
BUF8 DATA 2fH ;用于数码管判断是否到达了500ms
BUFSZ EQU 30H ;数字键输入缓冲区首地址30H~32H
BUF1 DATA 30H ;第3个数字输入存储区
BUF2 DATA 31H ;第2个数字输入存储区
BUF3 DATA 32H ;第1个数字输入存储区
KEYC DATA 33H ;键码保存单元
DPBUF1 DATA 34H ;数码管显示单元缓冲区34H~3BH,甲队小比分显示缓冲单元
DPBUF2 DATA 37H ;乙队小比分显示缓冲单元
DPBUF3 DATA 3AH ;甲队大比分显示缓冲单元
DPBUF4 DATA 3BH ;乙队大比分显示缓冲单元
KEYC1 DATA 3CH ;顺序码保存单元
UU DATA 3DH ;bcd码转换指针存放单元
RCVDAT DATA 60H ;接收数据缓冲区
XMTDAT DATA 50H ;发送数据缓冲区
SDA BIT P0.3 ;模拟I2C 数据传送位
SCL BIT P0.4 ;模拟I2C 时钟控制状态标志
;----------------------------------------------------------------------------------------
;主程序
;----------------------------------------------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP JKONG
ORG 0030H
MAIN: MOV A,#09H
MOV R4,#0FFH
ACALL WRITE7219 ;写译码方式采用BCD码
MOV A,#0BH
MOV R4,#07H
ACALL WRITE7219 ;8个数码管显示
MOV A,#0FH
MOV R4,#00H
ACALL WRITE7219 ;正常显示
MOV A,#09H
MOV R4,#0FFH
ACALL WRITE7219 ;写译码方式采用BCD码
mov a,#0ch
mov r4,#01h
lcall write7219
MOV A,#0Ah
MOV R4,#07h
ACALL WRITE7219 ;写7219数码管亮度控制寄存器
mov 23h,#00h
mov 25h,#08h
mov 24h,#34h
mov r5,#0ah
test: mov r2,25h
test1: mov a,23h
mov r1,24h
mov @r1,a
inc 24h
djnz r2,test1
lcall display
lcall wait1
mov 24h,#34h
inc 23h
djnz r5,test
mov a,#00h
mov r0,#00h
ll: mov @r0,a
inc r0
CJNE R0,#80H,LL ;片内00h~80H数据缓冲器清零
mov chax,#0ffh ;查询键被按下次数
mov jies,#0ffh ;结束键被按下次数
MOV SLVADR,#EEPROM2 ;AT24C64器件地址
mov rdsubadr1,#00h
mov rdsUbadr2,#00h ;常数量赋初值
LCALL DISPLAY
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H ;定时器计数器赋初值
SETB EA
SETB TR0
SETB ET0
SLP: anl pcon,#01h ;进入休眠方式
LJMP SLP
;----------------------------------------------------------------------------------------
;键盘监控处理程序
;----------------------------------------------------------------------------------------
jKONG: MOV TH0,#3CH
MOV TL0,#0B0H ;重新给计数器赋初值
SETB TR0
mov a,#0ch
mov r4,#01h
lcall write7219
MOV A,#0BH
MOV R4,#07H
ACALL WRITE7219 ;使7219退出掉电模式(因为MCU进入休眠状态相当于掉电模式)
LCALL KEYIN
CJNE A,#0FFH,KEY2 ;有键按下?
KEY0: CLR KEYP ;没有键被按下清除工作响应标志位
JB CXB,KEY1 ;判断是否处于查询状态
jb dz,key1 ;数字显示标志位,判断是否有从键盘输入的数字要显示
JB SZ,SHAN ;没有就闪烁
LJMP KEY1
;*******************************************************************************************
;闪烁程序用于使使用者明了是对那个对象进行操作
;*******************************************************************************************
SHAN: INC BUF8
MOV R1,BUF8
CJNE R1,#0AH,KEY1 ;定时500MS用于数码管闪烁
CPL BZ ;到了500MS时对标志为进行翻转用于数码管闪烁
MOV BUF8,#0H
JB JIAX,SHAN1
JB YIX,SHAN2
JB JIAD,SHAN3
JB YID,SHAN4
SHAN1: JB bz,shani1
lcall display
ljmp key1 ;对甲队小分进行操作
shani1: mov a,#01h
mov r4,#0fh
lcall ss
ljmp key1
shan2: jb bz,shani2
lcall display ;对乙队小分进行操作
ljmp key1
shani2: mov a,#04h
mov r4,#0fh
lcall ss
ljmp key1
shan3: jb bz,shani3 ;对甲队大分进行操作
lcall display
ljmp key1
shani3: mov a,#07h
mov r4,#0fh
lcall write7219
ljmp key1
shan4: jb bz,shani4 ;对乙队大分进行操作
lcall display
ljmp key1
shani4: mov a,#08h
mov r4,#0fh
lcall write7219
KEY1: LJMP KOFF
KEY2: LCALL WAIT ;延时去抖动
LCALL KEYIN ;重新读取键码
MOV KEYC,A ;保存键码
JB KEYP,KEY1 ;判断是否响应过了
SETB KEYP ;置标志位
LCALL CHA ;查找键码对应的顺序码
MOV A,KEYC1 ;保存顺序码
CJNE A, #0AH,WK1 ;是+被按下?顺序码0AH代表"加"键
SETB JIAB ;置加法标志位
clr jianb
clr cxb
LCALL CLEAR ;清除数字缓冲区内容
LJMP KOFF
WK1: mov a,keyc1
CJNE A,#0BH,WK2 ;键码0BH代表"减"键
SETB JIANB ;置减法标志位
clr jiab
clr cxb
LCALL CLEAR
LJMP KOFF
WK2: mov a,keyc1
CJNE A,#0CH,WK7 ;顺序码0CH代表"翻动"键
setb sz
WK3: MOV R0,BUF7 ;用于选择对那个对象进行操作
INC R0
MOV BUF7,R0
CJNE R0,#01H,WK4 ;当R0中的内容为1时,选择的是甲队小分
CLR JIAD
CLR YID
CLR YIX
SETB JIAX
LJMP KOFF
WK4: CJNE R0,#02H,WK5 ;当R0中的内容为2时,选择的是乙队小分
SETB YIX
CLR JIAD
CLR JIAX
CLR YID
LJMP KOFF
WK5: CJNE R0,#03H,WK6 ;当R0中的内容为3时,选择的是甲队大分
SETB JIAD
CLR JIAX
CLR YID
CLR YIX
LJMP KOFF
WK6: CJNE R0,#04H,WKT ;当R0中的内容为4时,选择的是乙队大分
CLR JIAD
CLR JIAX
CLR YIX
SETB YID
MOV BUF7,#0H
WKT: LJMP KOFF
WK7: mov a,keyc1
CJNE A,#0DH,WK8 ;键码7DH代表"查询键"
SETB CXB ;
inc chax ;每按下一次CHAX加一为了改变查询24C64的单元地址
mov a,chax
cjne a,#06h,ff ;判断查询键被按下是否超过结束存储的次数
lcall reserch
mov chax,#0ffh ;查询的次数和结束的次数相等时重新赋值
mov rdsubadr1,#00h
mov rdsubadr2,#00h
ljmp koff
ff: LCALL RESERCH
LJMP KOFF
WK8: mov a,keyc1
CJNE A,#0EH,WK9 ;键码7BH代表"确定键"
ljmp wk11
WK9: LJMP WK91
WK11: JB JIAB, WK13 ;WK13为加法处理子程序
JB JIANB, WK14 ;WK14为减法处理子程序
LJMP KeyOFF
WK14: LJMP WK141
WK13: JB JIAX,J1
JB YIX,J2
JB JIAD, J3
JB YID,J4
J1: MOV R0,#32H
MOV R1,#45H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#36H
MOV R1,#47H
MOV R7,#03H
LCALL ZHUAN
MOV R1,#44H
MOV R0,#46H
MOV R7,#02H
LCALL BCDA
MOV R0,#46H
MOV R1,#34H
MOV R7,#02H
LCALL ZHUAN2
LCALL DISPLAY
LJMP kEYoff
J2: MOV R0,#32H
MOV R1,#45H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#39H
MOV R1,#47H
MOV R7,#03H
LCALL ZHUAN
MOV R1,#44H
MOV R0,#46H
MOV R7,#02H
LCALL BCDA
MOV R0,#46H
MOV R1,#37H
MOV R7,#02H
LCALL ZHUAN2
LCALL DISPLAY
LJMP kEYoff
J3: MOV A,buf3
MOV R7,DPBUF3
ADD A,R7
DA A
MOV DPBUF3,A
LCALL DISPLAY
LJMP kEYoff
J4: MOV A,buf3
MOV R7,DPBUF4
ADD A,R7
DA A
MOV DPBUF4,A
LCALL DISPLAY
LJMP kEYoff
WK141: JB JIAX,J5
JB YIX,J6
JB JIAD,J7
JB YID,J8
LJMP koff
J5: MOV R0,#32H
MOV R1,#45H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#36H
MOV R1,#47H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#46H
MOV R1,#44H
MOV R7,#2H
LCALL BCDB
MOV R0,#46H
MOV R1,#34H
MOV R7,#02H
LCALL ZHUAN2
LCALL DISPLAY
LJMP kEYoff
J6: MOV R0,#32H
MOV R1,#45H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#39H
MOV R1,#47H
MOV R7,#03H
LCALL ZHUAN
MOV R0,#46H
MOV R1,#44H
MOV R7,#2H
LCALL BCDB
MOV R0,#46H
MOV R1,#37H
MOV R7,#02H
LCALL ZHUAN2
LCALL DISPLAY
LJMP kEYoff
J7: MOV A,DPBUF3
MOV R7,buf3
SUBB A,R7
MOV DPBUF3,A
LCALL DISPLAY
LJMP kEYoff
J8: MOV A,DPBUF4
MOV R7,buf3
SUBB A,R7
MOV DPBUF4,A
LCALL DISPLAY
LJMP kEYoff
WK91: mov a,keyc1
CJNE A,#0FH,WK10 ;键码77H代表"结束键"
LCALL JIESHU ;JIESHU子程序为把比赛结果放入AT24C64中。
LJMP kEYoff
WK10: JB JIAB, RESTORE ;数字键处理程序,只有按下了加,减,查询才存储数据
JB JIANB, RESTORE
LJMP KOFF
RESTORE:mov buf1,buf2 ;数字键存储程序
mov buf2,buf3
MOV buf3,KEYC1
setb dz
jb jiax,jia1
jb yix,yi1
jb jiad,jia2
jb yid,yi2
ljmp koff
jia1: mov a,#03h
lcall sdp
ljmp koff
yi1: mov a,#06h
lcall sdp
ljmp koff
jia2: mov a,#07h
mov r4,32h
lcall write7219
ljmp koff
yi2: mov a,#08h
mov r4,32h
lcall write7219
ljmp koff
KEYOFF: lcall clear
CLR DZ
clr cxb
setb sz
KOFF: NOP
RETI
;***************************************子程序*******************************************
;查询子程序
;使用资源:A,R0,R7,R1
;****************************************************************************************
reserch:mov a,chax
MOV B,#03h
MUL AB
add a,rdsubadr2
mov rdsubadr2,a ;调整指针
mov subadr1,rdsubadr1
mov subadr2,rdsubadr2 ;
MOV BYTECNT,#3
MOV SLVADR,#EEPROM2
LCALL RCVDATA
mov r0,#60h
mov r7,#03h
mov r1,#72h ;转换后的BCD码放在70~75H中
lcall zhuan2
;显示查询结果
MOV R0,#70H
MOV R1,#01H
MOV R3,#06H
DP: MOV A,@R0
MOV R4,A
MOV A,R1
ACALL WRITE7219 ;将数据→7219
INC R0
INC R1
DJNZ R3,DP
RET
;**********************************************************************************************
;结束键处理程序
;**********************************************************************************************
jieshu: mov r0,#39h
mov r7,#06h
mov r1,#52h
lcall zhuan
inc jies ;每按下一次进行存储,并改变指针
mov a,jies
cjne a,#07h,oo
mov jies,#00h
mov wtsubadr1,#00h
mov wtsubadr2,#00h
oo: mov a,jies
MOV B,#03H
mul aB
add a,wTsubadr2 ;重新改变寄存器单元地址
mov wTsubadr2,a
MOV SLVADR,#EEPROM2
MOV SUBADR1,WTSUBADR1
MOV SUBADR2,WTSUBADR2
MOV BYTECNT,#03h
LCALL SENDDATA
qch1: MOV A,#00H
MOV R3,#08H
MOV R0,#34H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -