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

📄 程序.asm

📁 AT89C52单片机为核心
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;----------------------------------------------------------------------------------------
;标志位常量定义区(占用空间为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 + -