📄 led500.asm
字号:
HBEN EQU P1.4
ISDA EQU P1.5
ISCL EQU P1.7
Current_Value EQU 048H
MinValue EQU 049H
MaxValue EQU 04AH
ORG 0000H
SJMP START
ORG 0013H
LJMP INTERRUPT1
ORG 0050H
START:
CLR_ERAM:
MOV DPTR,#2000H
CLR A
CLR_C00:MOVX @DPTR,A
INC DPTR
MOV A,DPH
CJNE A,#2FH,CLR_C00
CLR_IRAM:
MOV R0,#030H
CLR A
CLR_C01: MOV @R0,A
INC R0
CJNE R0,#0FFH,CLR_C01
INI_8255:
MOV DPTR,#4003H
MOV A,#098H ;A口输入,B口。C口输出,工作方式0
MOVX @DPTR,A
INI_6959:
;***********************************************
;*********需要数据输入接口设计******************
MOV R5,#08H
MOV R4,#30H
MOV 30H,#70H
MOV 31H,#01H
MOV 32H,#0FH
MOV 33H,#05H
MOV 34H,#03H
MOV 35H,#23H
MOV 36H,#0FFH
MOV 37H,#058H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CSTOP
DISPLAR_AI0:
;***********************************************
;*********需要数据输入接口设计******************
MOV R5,#06H
MOV R4,#30H
MOV 30H,#70H
MOV 31H,#20H
MOV 32H,#01H
MOV 33H,#02H
MOV 34H,#03H
MOV 35H,#04H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CSTOP
INI_PELICAN:
;************暂时空缺,CAN***************************
;************以上通过,2004.09.14
ITERRUPT_CONF:
SETB EX1
SETB IT1
SETB EA;*************到此运行不下去了 09.14.16:08时通过******************88
;******************中断的其他设置暂时空缺*****************
;**********************************************************
;**********************************************************
MOV R0,#80H
MOV @R0,#0FFH
INC R0
MOV @R0,#0FH
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0AH
INC R0
MOV @R0,#0AAH
INC R0
MOV @R0,#0FH
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#0AAH
INC R0
MOV @R0,#0FH
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0AH
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#0FH
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0AH
LCALL PRO_AI
INPUT_SCAN:
SCAN_8255:
MOV DPTR,#4000H ;A口
MOVX A,@DPTR
MOV 3BH,A
;SCAN_197:
; MOV A,PSW
; ORL A,#08H
; MOV PSW,A
; MOV R7,#50H
; MOV R0,#080H ;存放197采集的数据共8组
; SCAN_197_CYCL:
; CLR HBEN
; MOV DPTR,#6000H
; MOV A,R7
; MOVX @DPTR,A
; SETB F0
; JUDGEF0:
; JB F0,JUDGEF0
; INC R7
; INC R0
;*********存储数据接口设计************
; CJNE R7,#58H,SCAN_197_CYCL
; MOV A,PSW
; ANL A,#0E7H
; MOV PSW,A
LJMP INPUT_SCAN
;***********************************************************
;************************************************************
INTERRUPT1:
CLR EA
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
MOV A,PSW
ANL A,#0E7H
MOV PSW,A
MOV A,P1
JB ACC.6,INRPT_6959 ;P1.6=1则是6959的中断
INRPT_197:
MOV DPTR,#6000H
MOVX A,@DPTR
MOV @R0,A
INC R0
SETB HBEN
NOP
MOVX A,@DPTR
MOV @R0,A
CLR HBEN
CLR F0
SETB EA
LJMP INRPT_QUIT ;***************2004.09.14,,,16:08通过
INRPT_6959:
;*****************键盘显示处理程序,暂时空缺***************************
MOV R5,#02H
MOV R4,#30H
MOV 30H,#70H
MOV 31H,#0CH
LCALL I2CSTART
LCALL I2CWRITE
MOV R5,#01H
MOV R4,#39H
MOV 39H,#71H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CREC_BYTE
LCALL READ_ACK1
LCALL I2CSTOP
;判断哪一个键被按下
KEY1:
MOV A,R7;***********把读出来的字节R7中的数据存放在3EH****************
MOV 3EH,A
JNB ACC.0,KEY2
MOV A,40H
CJNE A,#00H,KEY_CLR
MOV 40H,#08H
LJMP DIS_CHANGE
KEY_CLR:
ANL 40H,#00H
DIS_CHANGE:
MOV 41H,#00H
MOV 42H,#00H
MOV R1,#070H
LCALL DISPLAY
LJMP KEY_QUIT;;;;;;;;;;;;;;;;;
KEY2:
MOV A,3EH
JNB ACC.1,KEY3
MOV A,41H
CJNE A,#07H,KEY2ADD
MOV 41H,#00H
LJMP LED_KEY2
KEY2ADD:
INC 41H
LED_KEY2: ;用INC 51H代替
MOV 42H,#00H ;清52H
LCALL DISPLAY_KEY2 ;显示
LJMP KEY_QUIT
KEY3:
MOV A,3EH
JNB ACC.3,KEY6
MOV A,42H
CJNE A,#07H,KEY3ADD
MOV 42H,#00H
LJMP LED_KEY3
KEY3ADD:
INC 42H
LED_KEY3:
LCALL DISPLAY_KEY3 ;显示
LJMP KEY_QUIT
KEY6:
MOV A,3EH
JNB ACC.7,KEY4
CLR A
MOV 40H,A
MOV 41H,A
MOV 42H,A
MOV R1,#070H
LCALL DISPLAY ;;显示AI0
LJMP KEY_QUIT
KEY4:
MOV A,40H
JZ KEY_QUIT0 ;判断KEY1是否处于更改状态
MOV A,3EH
JNB ACC.4,KEY5
;读出KEY2/3对应寄存器的置查表得到相应的地址并加1
MOV A,41H ;KEY2的值
CJNE A,#00H,CHANGE_AO ;改变AI
KEY_QUIT0:
LJMP KEY_QUIT
CHANGE_AO:
CJNE A,#01H,CHANGE_DI ;改变AO
MOV A,42H ;KEY3的值
ADD A,#0A0H
MOV R1,A
INC @R1 ;R1存放要改变数据所在地址
LCALL OUTPUT_521
LCALL DISPLAY ;跳到显示模块
LJMP KEY_QUIT
CHANGE_DI:
CJNE A,#02H,CHANGE_DO ;改变DI
LJMP KEY_QUIT
CHANGE_DO:
CJNE A,#03H,CHANGE_PID1 ;改变DO
MOV A,42H
ADD A,#0B0H
MOV R1,A
MOV @R1,#0AH
LCALL OUTPUT_8255
LCALL DISPLAY_DO
LJMP KEY_QUIT
CHANGE_PID1:
CJNE A,#04H,CHANGE_PID2
MOV A,42H
ADD A,#0C0H
MOV R1,A
INC @R1
LCALL DISPLAY
LJMP KEY_QUIT
CHANGE_PID2:
CJNE A,#05H,KEY_QUIT
MOV A,42H
ADD A,#0C8H
MOV R1,A
INC @R1
LCALL DISPLAY
LJMP KEY_QUIT
KEY5:
;读出KEY2/3对应寄存器的置查表得到相应的地址并减1
MOV A,41H ;KEY2的值
CJNE A,#00H,CHANGE_AOD ;改变AI
LJMP KEY_QUIT
CHANGE_AOD:
CJNE A,#01H,CHANGE_DID ;改变AO
MOV A,42H ;KEY3的值
ADD A,#0A0H
MOV R1,A
DEC @R1 ;R1存放要改变数据所在地址
LCALL DISPLAY ;跳到显示模块
LCALL OUTPUT_521
LJMP KEY_QUIT
CHANGE_DID:
CJNE A,#02H,CHANGE_DOD ;改变DI
LJMP KEY_QUIT
CHANGE_DOD:
CJNE A,#03H,CHANGE_PID1D ;改变DO
MOV A,42H
ADD A,#0B0H
MOV R1,A
MOV @R1,#00H
LCALL OUTPUT_8255
LCALL DISPLAY_DO
LJMP KEY_QUIT
CHANGE_PID1D:
CJNE A,#04H,CHANGE_PID2D
MOV A,42H
ADD A,#0C0H
MOV R1,A
DEC @R1
LCALL DISPLAY
LJMP KEY_QUIT
CHANGE_PID2D:
CJNE A,#05H,KEY_QUIT
MOV A,42H
ADD A,#0C8H
MOV R1,A
DEC @R1
LCALL DISPLAY
KEY_QUIT:
;****************读弹起寄存器,消除中断***********************************
MOV R5,#02H
MOV R4,#39H
MOV 39H,#70H
MOV 3AH,#08H
LCALL I2CSTART
LCALL I2CWRITE
MOV R5,#01H
MOV R4,#3CH
MOV 3CH,#71H
LCALL I2CSTART
LCALL I2CWRITE
LCALL I2CREC_BYTE
LCALL READ_ACK1
LCALL I2CSTOP
MOV A,R7
MOV 3FH,A ;***********把读出来的字节存放在3FH****************
INRPT_QUIT:
POP PSW
POP DPL
POP DPH
POP B
POP ACC
SETB EA
RETI
;************************************************************************************************************
;*****************子程序******子程序******子程序********子程序*******子程序**********************************
I2CSTART: ;START信号
SETB ISDA ;设置空闲是都为高电平
SETB ISCL
LCALL I2CWAIT
CLR ISDA
LCALL I2CWAIT
CLR ISCL
NOP ;ISCL低平持续至少4us
NOP
RET
I2CSTOP:
CLR ISDA ;STOP信号
LCALL I2CWAIT
SETB ISCL
LCALL I2CWAIT
SETB ISDA
RET
ACK:
SETB ISCL ;响应信号时钟
NOP
NOP
NOP
CLR ISCL
NOP
NOP
SETB ISDA
RET
I2CWRITE:
MOV A,R4
MOV R0,A
CYCLE_W:
MOV A,@R0
MOV R7,#08H
WRITE_BYTE:
RL A
JNB ACC.0,C008
LCALL WRITE_1
LJMP C007
C008:
LCALL WRITE_0
C007:
DJNZ R7,WRITE_BYTE
LCALL ACK
INC R0
DJNZ R5,CYCLE_W
RET
WRITE_0:
CLR ISDA ;写0
NOP ;ISDA须在ISCL转变为高电平之前至少0.25us
SETB ISCL
NOP ;ISCL的高电平至少维持4us
NOP
NOP
CLR ISCL
NOP ;ISCL降低后SDA至少维持5us
NOP
NOP
RET
WRITE_1:
SETB ISDA
NOP
SETB ISCL
NOP
NOP
NOP
CLR ISCL
RET
I2CWAIT:
NOP
NOP
RET
READ_ACK0:
NOP
CLR ISDA
NOP
SETB ISCL
NOP
NOP
NOP
CLR ISCL
SETB ISDA
RET
READ_ACK1:
NOP
SETB ISDA
NOP
SETB ISCL
NOP
NOP
NOP
CLR ISCL
SETB ISDA
RET
;读取6959的数据存放在R7中
I2CREC_BYTE:
CLR A
MOV R7,A
MOV R6,A
C0017:
SETB ISCL
LCALL I2CWAIT
MOV A,R7
RL A
MOV R7,A
JNB ISDA,C0020
XCH A,R7
ORL A,#01H
XCH A,R7
C0020:
CLR ISCL
LCALL I2CWAIT
INC R6
CJNE R6,#08H,C0017
RET
;读取的数据存放在R7中
;;;;;;;;;;;;;;;;;;KEY2显示******************************************
DISPLAY_KEY2:
MOV A,41H
CJNE A,#00H,LED_AO
LED_AI:
MOV R1,#070H
LCALL DISPLAY
LJMP DISPLAY_KEY2_QUIT
; ***********************AI 的显示程序,暂时空缺******************************************
LED_AO:
CJNE A,#01H,LED_DI
MOV R1,#0A0H ;存放AO 数据的首地址
LCALL DISPLAY
LJMP DISPLAY_KEY2_QUIT
LED_DI:
CJNE A,#02H,LED_DO
; MOV 42H,#00H
LCALL DISPLAY_DI
LJMP DISPLAY_KEY2_QUIT
LED_DO:
CJNE A,#03H,LED_PID1
MOV R1,#0B0H
;MOV 42H,#00H
LCALL DISPLAY_DO
LJMP DISPLAY_KEY2_QUIT
LED_PID1:
CJNE A,#04H,LED_PID2
MOV R1,#0C0H
; MOV 42H,#00H
LCALL DISPLAY
LJMP DISPLAY_KEY2_QUIT
LED_PID2:
MOV R1,#0C8H
; MOV 42H,#00H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -