?? fantest.asm
字號:
T2CON EQU 0C8H ; SFR reg addr for T2 control word, TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2
T2MOD EQU 0C9H ; SFR reg addr for T2 setup word, GATE C/T M1 M2
TL2 EQU 0CCH ; SFR reg addr
TH2 EQU 0CDH ; SFR reg addr
ET2 BIT 0A8H.5 ; ET2 for T2 intrrupt bit ET2=1 set intrrupt
DADDR EQU 0A0H ;fixed addr for 24cxx '10100000' write '0'
PADDR EQU 0 ;programable addr from 0~7 for 24c02
FILL EQU 53H ; save data address for 24c02
RS BIT P1.2 ; LCD RS=0 for send instruction, RS=1 for send data
R_W BIT P3.6 ; LCD RW=1 for read, RW=0 for write
E BIT P3.7 ; LCD ENABLE
DP BIT P3.3 ; LCD BACKLIGHT
INP BIT P3.2 ; KEY IN port
BTN BIT P1.0 ; START BUTTON port
SCL BIT P1.1 ; 24c02 scl pin
SDA BIT P1.3 ; 24c02 sda pin
DB0_DB7 DATA 0A0H ; P1=90H, P2=A0H
ORG 0B0H ; stack origin (high 128 byte for at89c52)
stack: DS 40H ; stack depth
ORG 0000H
LJMP START0
ORG 000BH ; T0 intrrupt
LJMP TIM0
ORG 0023H ; for RS232 intrrrupt
LJMP UART
ORG 002BH ; T2 interrupt
LJMP TIM2
START0:MOV SP, #(stack-1) ; stack pointer
CLR P0.0 ; LED1 off
CLR P0.1 ; LED2 off
CLR P0.2 ; LED3 off
/**********************************************************************/
CLEAR: MOV R4, #7FH
MOV R0, #00H ; clear Reg buf become #00H from 00H to 7FH.
CLS1: MOV @R0, #00H
INC R0
DJNZ R4, CLS1
/************************************************************/
CLR DP ; Backlight display on
LCALL Initial ; LCD INIT
LCALL CLS ; LCD CLEAR
MOV A,#80H ; set the address
LCALL Write_instruction ; INSTRUCTION
MOV DPTR,#LINE1 ; Display "FREQ:"
LCALL PR_STRING
MOV A,#8AH ; set the address
LCALL Write_instruction
MOV DPTR,#LINE2 ; Display "."
LCALL PR_STRING
/*************** Display last display freq value ********************/
LCALL I2CINIT
LCALL VERIFY_PAGE_SAVE
MOV A,#85H ; set the address
LCALL Write_instruction
MOV R1, #68H
MOV R2, #05
PLAB: MOV A, @R1
ORL A, #30H
LCALL WriteLCDData
DEC R1
DJNZ R2, PLAB
/*************** Display last display freq value (dot) **************/
LCALL I2CINIT
LCALL VERIFY_PAGE_SAVE1
MOV A, #8BH ; display freq
LCALL Write_instruction
MOV A, 2DH
ORL A, #30H
LCALL WriteLCDData
MOV A, 2CH
ORL A, #30H
LCALL WriteLCDData
/*************** Display rpm *****************************************/
MOV A,#8DH ; set the address
LCALL Write_instruction
MOV DPTR,#LINE8 ; Display "rpm"
LCALL PR_STRING
MOV A,#85H ; set the address, CUROR POINTER TO #85H
LCALL Write_instruction
/*************** Display H limit value *******************************/
LCALL I2CINIT
LCALL VERIFY_PAGE_HI
MOV A, #0C0H ; DISPLAY "H Limit"
LCALL Write_instruction
MOV DPTR, #LINE6
LCALL PR_STRING
MOV A, #0C8H ; DISPLAY 48H--44H
LCALL Write_instruction
MOV R0, #48H
MOV R2, #5
SCREEN: MOV A, @R0
ORL A, #30H
LCALL WriteLCDData
DEC R0
DJNZ R2, SCREEN
MOV A, #0CDH ; DISPLAY "rpm"
LCALL Write_instruction
MOV DPTR, #LINE8
LCALL PR_STRING
LCALL DELAY2
MOV A, #0C0H
LCALL Write_instruction
MOV DPTR, #LINE11
LCALL PR_STRING
/*************** Display L limit value *******************************/
LCALL VERIFY_PAGE_LO
MOV A, #0C0H ; DISPLAY "L Limit"
LCALL Write_instruction
MOV DPTR, #LINE5
LCALL PR_STRING
MOV A, #0C8H ; DISPLAY 4DH--49H
LCALL Write_instruction
MOV R0, #4DH
MOV R2, #5
SCREN1: MOV A, @R0
ORL A, #30H
LCALL WriteLCDData
DEC R0
DJNZ R2, SCREN1
MOV A, #0CDH ; DISPLAY "rpm"
LCALL Write_instruction
MOV DPTR, #LINE8
LCALL PR_STRING
LCALL DELAY2
MOV A, #0C0H
LCALL Write_instruction
MOV DPTR, #LINE11
LCALL PR_STRING
/*************** Display Fan Q'ty value ******************************/
LCALL I2CINIT
LCALL VERIFY_BYTE_FILL
MOV A, #0C0H ; DISPLAY "FAN Q'TY"
LCALL Write_instruction
MOV DPTR, #LINE7
LCALL PR_STRING
MOV A, #0C9H ; DISPLAY 4FH unit value
LCALL Write_instruction
MOV A, 4FH
ORL A, #30H
LCALL WriteLCDData
MOV A, #0CAH ; DISPLAY "PCS"
LCALL Write_instruction
MOV DPTR, #LINE9
LCALL PR_STRING
LCALL DELAY2
MOV A, #0C0H
LCALL Write_instruction
MOV DPTR, #LINE11
LCALL PR_STRING
/*************** initial *************************************************************************/
SETUP: LCALL I2CINIT
LCALL VERIFY_BYTE_FILL
MOV A, 4FH
MOV DPTR, #TABLE1
MOVC A, @A+DPTR
MOV 4EH, A ; TL0 SBUF
MOV 32H, #0FFH ; Key Buff
MOV 2EH, #35H ; UART BUFF
SETB 20H.0 ; Enter & Quit Key and Fun & Num control bit
CLR 20H.1 ; Fun Key & Num Key control bit
MOV SCON, #50H ; set rs232 mode 1, 10 bit transfer, receive REN interrupt enable
MOV TMOD, #25H ; set T0 for extenral counting, T1 mode2 for rs232 baud generator, 8 bit auto-reload
MOV TL1, #0FDH ; rs232 baud rate 9600
MOV TH1, #0FDH
MOV T2CON, #01H ; T2 for 16 bit timer for interrupt display
MOV T2MOD, #00H ; T2 for upper timer
MOV TL2, #(65536-46080) MOD 256 ; T2 50 ms timer #(65536-46080) mod 256, (50ms=1.0850694*46080)
MOV TH2, #(65536-46080)/256 ; T2 50 ms timer #(65536-46080) / 256
MOV A, 4EH
MOV TL0, A ; input 7 time/count
MOV TH0, #0FFH
ANL PCON, #7FH ; baud rate not double
; MOV IP, #20H ; T2 port interrupt prior
MOV IP, #10H ; RS232 port interrupt prior
MOV 55H, #20 ; TIMER=50*20=1000ms
MOV 26H, #10 ; counter 10 times
MOV 27H, #70H ; save 10 pcs TL0 value
SETB EA ; EA
SETB ES ; ES rs232 interrupt enable
SETB TR1 ; START T1, serial baud generator start
SETB ET0 ; T0 interrupt enable
SETB ET2 ; T2 interrupt enable
SETB T2CON.2 ; START T2, 1 s timer start, TR2
SETB TR0 ; START T0, counting start
/*************** main programing start ***********************************************************/
MAIN: MOV A, 35H ; SERIAL RECEIVE
CJNE A, #0A5H, MAIN0
MOV A, 36H
CJNE A, #5AH, MAIN0
MOV A, 37H ; SERIAL RECEIVE
CJNE A, #55H, MAIN0
MOV A, 38H
CJNE A, #5AH, MAIN0
MOV A, 39H
CJNE A, #0A5H, MAIN0
JMP MAIN1
MAIN0: JB BTN, MAIN ; WHETHER START?
LCALL DELAY0
JNB BTN, $ ; eliminate brounce
MAIN1: LCALL HANDE
LCALL RANGE
LCALL DISP
LCALL GETKEY
LCALL PRESS
LCALL HILIMIT
LCALL LOLIMIT
LCALL GREENLED
LCALL SEND ; SEND count value
LJMP MAIN1
/*************** Data acquisition math (57h58h*28cycle)*******************************************/
HANDE: MOV A, 57H ; 57h58h*28+56h/4Fh=42h41h40h.43h
MOV B, #28 ; if vane=9, then 1 times T0 interrupt, stand for 252/9=28 cycle
MUL AB ; 28*57h=cycle
MOV 40H, A
MOV 41H, B
MOV A, 58H
MOV B, #28
MUL AB
ADD A, 41H
MOV 41H, A
MOV A, B
ADDC A, #0
MOV 42H, A
/*************** (40h41h42h*60cycle/minute)******************************************************/
MUL60: MOV A,40H
MOV B, #60
MUL AB
MOV 6CH, A
MOV 6DH, B
MOV A, 41H
MOV B, #60
MUL AB
ADD A, 6DH
MOV 6DH, A
MOV A, B
ADDC A, #0
MOV 6EH, A
MOV A, 42H
MOV B, #60
MUL AB
ADD A, 6EH
MOV 6EH, A
MOV A, B
ADDC A, #0
MOV 6FH, A ;LOST 6FH
MOV A, 6CH
MOV 40H, A
MOV A, 6DH
MOV 41H, A
MOV A, 6EH
MOV 42H, A
MOV A, 6FH
MOV 44H, A ; LOST 44H
/*************** Data process from TL0 (70h-79h=0?)*******************************************/
/* MOV R0, #70H
MOV R3, #10
SUMAD0:MOV A, @R0
CJNE A, #00H, SUMADD
INC R0
DJNZ R3, SUMAD0
MOV 43H, #00H
LJMP SUMADD1 */
/*************** Data process from TL0 (70h+71h+72h...79h=21h22h)*****************************/
SUMADD:MOV 21H, #00H
MOV 22H, #00H
CLR C
MOV R0, #70H ;TL0=70H
MOV R4, #10
ADD0: MOV A, @R0
ADD A, 21H
MOV 21H, A
JNC ADD1
MOV A, 22H
ADD A, #01H
MOV 22H, A
ADD1: INC R0
DJNZ R4, ADD0
/*************** Data process from TL0 (21h22h*60=28h29h2ah)*********************************/
MOV A, 21H ; 57h58h*28+56h/4Fh=42h41h40h.43h
MOV B, #60 ; if vane=9, then 1 times T0 interrupt, stand for 252/9=28 cycle
MUL AB ; 28*57h=cycle
MOV 28H, A
MOV 29H, B
MOV A, 22H
MOV B, #60
MUL AB
ADD A, 29H
MOV 29H, A
MOV A, B
ADDC A, #0
MOV 2AH, A
/*************** Data process from TL0 {28h29h2ah/(4fh*10)=23h24h25h}商為三字節 **************/
MOV R0, 28H
MOV R1, 29H
MOV R2, 2AH
MOV A, 4FH
MOV B, #10
MUL AB
MOV R4, A
;MOV 2FH, B ; LOST NO USED
MOV R3, #00H ; R3存放被除數擴充位,也是余數存放數
MOV 23H, #00H ; LSB 商
MOV 24H, #00H
MOV 25H, #00H ; MSB 商
MOV R7, #18H
CHU6: MOV A, R0
ADD A, R0 ; 被除數左移,包括擴充位
MOV R0, A
MOV A, R1
ADDC A, R1
MOV R1, A
MOV A, R2
ADDC A, R2
MOV R2, A
MOV A, R3
ADDC A, R3
MOV R3, A
MOV A, 23H; 商數左移
RLC A
MOV 23H, A
MOV A, 24H
RLC A
MOV 24H, A
MOV A, 25H
RLC A
MOV 25H, A
MOV A, R3
SUBB A, R4
JC CHU61
MOV R3, A
INC 23H
AJMP CHU62
CHU61: ADD A, R4
CHU62: DJNZ R7, CHU6
MOV 43H, R3 ; 存入余數
/*************** Data process from TL0 43h*10/10+ 小數處理***********************?*************/
MOV A, 43H
MOV B, 4FH
DIV AB
SWAP A
ANL A, #0F0H
MOV 43H, A
MOV A, B
MOV B, #10
MUL AB
MOV B, 4FH
DIV AB
ANL A, #0FH
ORL A, 43H
MOV 43H, A
/*************** Data process 23h+40h,24h+41h,25h+42h ***************/
SUMADD1:MOV A, 23H
ADD A, 40H
MOV 40H, A
MOV A, 24H
ADDC A, 41H
MOV 41H, A
MOV A, 25H
ADDC A, 42H
MOV 42H, A
MOV A, 44H
ADDC A, #0
MOV 44H, A ;44H LOST, NO USED
/*************** Data process from 2 BIN trans to 3 BCD *************/
BIN3BCD4: MOV R0, #60H
MOV R6, #4
CLR A
BCD0: MOV @R0, A
INC R0
DJNZ R6, BCD0
MOV R6, #24
BCD1: MOV R1, #40H
MOV R5, #3
CLR C
BCD2: MOV A, @R1
RLC A
MOV @R1, A
INC R1
DJNZ R5, BCD2
MOV R4, #4
MOV R0, #60H
BCD3: MOV A, @R0
ADDC A, @R0
DA A
MOV @R0, A
INC R0
DJNZ R4, BCD3
DJNZ R6, BCD1
MOV R0, #00H
MOV R1, #00H
MOV R1, #64H ;64h--68h display value
MOV A, 60H
MOV B, #10H
DIV AB
MOV @R1, B ;64H
INC R1
MOV @R1, A ;65H
INC R1
MOV A, 61H
MOV B, #10H
DIV AB
MOV @R1, B ;66H
INC R1
MOV @R1, A ;67H
INC R1
MOV A, 62H
MOV B, #10H
DIV AB
MOV @R1, B ; 68H
INC R1
MOV @R1, A ; 69H
INC R1
MOV A, 63H
MOV B, #10H
DIV AB
MOV @R1, B ; 6AH
INC R1
MOV @R1, A ; 6BH
MOV A, 43H
MOV B, #10H
DIV AB
MOV 2CH, B ; 2CH
MOV 2DH, A ; 2DH
RET
/*************** check if over ranage *************************************/
RANGE: MOV R1, #6BH
MOV R3, #3
RANG1: MOV A, @R1
CJNE A, #00H, UPPER
DEC R1
DJNZ R3, RANG1
JMP RANG2
UPPER: MOV A,#0C0H ; set the address
LCALL Write_instruction ; INSTRUCTION
MOV DPTR,#LINE3 ; Display "Over Test Range!"
LCALL PR_STRING
MOV R0, #67H ; display "9999.99"
MOV R4, #04
MOV A, #09H
MOV 2CH, A
MOV 2DH, A
RANG3: MOV @R0, A
DEC R0
DJNZ R4, RANG3
RANG2: RET
/*************** display read value*****************************************/
DISP: MOV A, #8BH ; display freq
LCALL Write_instruction
MOV A, 2DH
ORL A, #30H
LCALL WriteLCDData
MOV A, 2CH
ORL A, #30H
LCALL WriteLCDData
MOV A, #85H ; display freq
LCALL Write_instruction
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -