|
- ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- ;原理:通過改變加熱管通電和斷電時間比達到控制溫度作用。
- ;可以獨立設置21路加熱管通斷的百分比值。
- ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- ;設置參數方法:同時按下主機面板上的“區域”和“上調”(或“下調”)鍵,
- ;調到需要設定參數的區域后,停止按按鍵,然后再同時按下“參數”和“上調”(或“下調”)鍵,
- ;設定該區域的參數,參數設定范圍0~100%,當設定參數為0%時關閉加熱管,
- ;當設定參數為100%時加熱管常通電,當設定參數為50%時加熱管通斷時間比為1:1(即各50%),
- ;其他參數以此類推。
- ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- SC01# EQU P0.0 ;1#輸出
- SC02# EQU P0.1 ;2#輸出,以下雷同,共24路輸出
- SC03# EQU P0.2
- SC04# EQU P0.3
- SC05# EQU P0.4
- SC06# EQU P0.5
- SC07# EQU P0.6
- SC08# EQU P0.7
- SC09# EQU P1.0
- SC10# EQU P1.1
- SC11# EQU P1.2
- SC12# EQU P1.3
- SC13# EQU P1.4
- SC14# EQU P1.5
- SC15# EQU P1.6
- SC16# EQU P1.7
- SC17# EQU P2.0
- SC18# EQU P2.1
- SC19# EQU P2.2
- SC20# EQU P2.3
- SC21# EQU P2.4
- SC22# EQU P2.5
- SC23# EQU P2.6
- SC24# EQU P2.7
- XS1A2 EQU P3.0 ;RXD,P3.0接74LS164 1A2端,用于顯示,不能改變
- XSCLK EQU P3.1 ;TXD,P3.1接74LS164 CLK端,用于顯示,不能改變
- AJQUY EQU P3.2 ;設置區域的按鍵,要同時按下區域鍵和上調或下調鍵方可調節
- AJCSH EQU P3.3 ;設置參數的按鍵,要同時按下參數鍵和上調或下調鍵方可調節
- AJSHT EQU P3.4 ;上調按鍵
- AJXIT EQU P3.5 ;下調按鍵
- SDA EQU P3.6 ;EEPROM數據傳送口,必須接上拉電阻,否則有時開機不正常
- SCL EQU P3.7 ;EEPROM時鐘傳送口,必須接上拉電阻,否則有時開機不正常
- KMWDT EQU 0E1H ;看門狗地址
- ORG 0000H ;程序執行開始地址
- LJMP KS ;跳至KS
- ORG 0003H ;外中斷0中斷程序入口
- RETI ;跳至INT_0中斷服務程序
- ORG 000BH ;定時器T0中斷程序入口
- LJMP INTT0 ;中斷返回
- ORG 0013H ;外中斷1中斷入口
- RETI ;中斷返回
- ORG 001BH ;定時器T1中斷程序入口
- RETI ;跳至INTT1中斷服務程序
- ORG 0023H ;串口中斷入口地址
- RETI
- ORG 0200H
- ;------------------------------------
- ;開機初始化
- ;------------------------------------
- KS: MOV KMWDT,#00111100B ;設置看門狗
- MOV R0,#0FFH ;延時,待電源正常后系統才開始工作
- DJNZ R0,$
- MOV P0,#0FFH
- MOV P1,#0FFH
- MOV P2,#0FFH
- MOV P3,#0FFH
- MOV SP,#70H
- MOV TMOD,#01H ;設置T0為16位定時器,方式1
- MOV TH0,#0D8H ;設定T0的定時初值,12M晶振,定時為10ms,
- MOV TL0,#0F0H ;通斷總時間周期=10ms×100(因為分成100%)=1s
- SETB ET0 ;允許T0中斷
- SETB EA ;開中斷
- MOV 6FH,#00H ;6FH為10mS時間到標志,現置零
- ;開始運行,調用存儲器保存的數據
- ;------------------------------------
- LCALL READ_DATA ;將EEPROM中原里程數據調入內存
- ;------------------------------------
- MOV 48H,#1 ;設定開機后顯示屏顯示1#區域的參數
- LCALL LEDXS1 ;調用顯示程序
- ;------------------------------------
- ;把各區域內的參數值提取用于控制和顯示
- MOV 50H,30H ;50H為1#輸出時間參數值緩存區
- MOV 51H,31H ;51H為2#輸出時間參數值緩存區
- MOV 52H,32H ;以下以此類推
- MOV 53H,33H
- MOV 54H,34H
- MOV 55H,35H
- MOV 56H,36H
- MOV 57H,37H
- MOV 58H,38H
- MOV 59H,39H
- MOV 5AH,3AH
- MOV 5BH,3BH
- MOV 5CH,3CH
- MOV 5DH,3DH
- MOV 5EH,3EH
- MOV 5FH,3FH
- MOV 60H,40H
- MOV 61H,41H
- MOV 62H,42H
- MOV 63H,43H
- MOV 64H,44H
- MOV 65H,45H
- MOV 66H,46H
- MOV 67H,47H
- ;------------------------------------
- ;各輸出運行狀態標志置零
- CLR 01H ;01H為1#輸出運行狀態標志(區分輸出是高電平還是低電平)
- CLR 02H ;02H為2#輸出運行狀態標志(區分輸出是高電平還是低電平)
- CLR 03H ;以下以此類推
- CLR 04H
- CLR 05H
- CLR 06H
- CLR 07H
- CLR 08H
- CLR 09H
- CLR 0AH
- CLR 0BH
- CLR 0CH
- CLR 0DH
- CLR 0EH
- CLR 0FH
- CLR 10H
- CLR 11H
- CLR 12H
- CLR 13H
- CLR 14H
- CLR 15H
- CLR 16H
- CLR 17H
- CLR 18H
- SETB TR0 ;啟動T0
- ;------------------------------------
- ;按鍵處理程序
- ;------------------------------------
- L1: JB AJQUY,L5 ;設置區域值
- MOV P0,#0FFH ;設置區域時關閉所有輸出口
- MOV P1,#0FFH
- MOV P2,#0FFH
- JB AJSHT,L3 ;上調區域,此時同時顯示該區域的參數
- MOV A,48H
- CJNE A,#24,L2 ;檢查調節區域值是否到達24區
- SJMP L0 ;到達24區的停止
- L2: INC 48H ;調節區域值步進加1
- SJMP L0
- L3: JB AJXIT,L1 ;下調區域,此時同時顯示該區域的參數
- MOV A,48H
- CJNE A,#1,L4 ;檢查調節區域值是否到達1區
- SJMP L0 ;到達1區的停止
- L4: DEC 48H ;調節區域值步進減1
- L0: MOV A,#2FH ;30H起開始放參數值,1區對應30H,2區對應31H,其他雷同
- ADD A,48H ;48H放當前區域值
- MOV R1,0E0H ;0E0H即為A的地址
- MOV 49H,@R1 ;49H放當前區域的參數值
- LCALL LEDXS1 ;調用顯示子程序
- LCALL YS1 ;延時
- SJMP L1 ;返回再執行
- ;_____________________________________
- L5: JB AJCSH,L00 ;設置參數值
- MOV P0,#0FFH ;設置區域時關閉所有輸出口
- MOV P1,#0FFH
- MOV P2,#0FFH
- MOV A,#2FH ;30H起開始放參數值,因為以下要加1,所以從2FH開始
- ADD A,48H
- MOV R1,0E0H ;0E0H即為A的地址
- MOV 49H,@R1
- JB AJSHT,L7 ;上調參數
- MOV A,49H
- CJNE A,#100,L6 ;參數等于100%不能再調
- SJMP L0
- L6: INC 49H ;參數調節步進加1
- SJMP L9
- L7: JB AJXIT,L1 ;下調參數
- MOV A,49H
- CJNE A,#0,L8 ;參數等于0%不能再調
- SJMP L0
- L8: DEC 49H ;參數調節步進減1
- L9: MOV @R1,49H
- LCALL LEDXS1 ;調用顯示子程序
- LCALL WRITE_DATA ;把參數值數據存入EEPROM,防止掉電數據丟失
- LCALL YS1 ;延時
- SJMP L1 ;返回再執行
-
- ;------------------------------------
- ;輸出
- ;------------------------------------
- L00: MOV A,30H ;檢查1#參數是否為0%
- JNZ L01 ;1#參數不為0%時繼續檢測
- SETB SC01# ;1#參數為0%時關閉1#輸出
- SJMP L10 ;關閉1#輸出后轉檢測2#端口
- L01: CJNE A,#100,L02 ;檢查1#參數是否為100%
- CLR SC01# ;1#參數為100%時1#有輸出
- SJMP L10 ;接通1#輸出后轉檢測2#端口
- L02: JB 01H,L03 ;判斷1#輸出是高電平還是低電平
- CLR SC01# ;1#輸出是高電平的且不為0%或100#的按參數運行
- DEC 50H ;參數減法,直到為0
- MOV A,50H
- JNZ L10 ;參數減到0,未到0的轉檢測2#端口
- CLR C ;參數減到0,開始轉為關閉,清空C
- MOV A,#100 ;關閉的時間參數=100-原設定的參數
- SUBB A,30H ;原設定的參數放在30H
- MOV 50H,A ;關閉的時間參數放在50H
- SETB 01H ;置位,為1表示輸出狀態由高電平轉為低電平
- L03: SETB SC01# ;按設定的時間參數高電平輸出完后轉為低電平輸出
- DEC 50H ;參數減法,直到為0
- MOV A,50H
- JNZ L10 ;參數減到0,未到0的轉檢測2#端口
- MOV 50H,30H ;低電平按設定的時間參數輸出完后返回轉為高電平輸出
- CLR 01H ;清標志位,為0表示輸出狀態由低電平轉為高電平
- L10: MOV A,31H ;以下以此類推
- JNZ L11
- SETB SC02#
- SJMP L20
- L11: CJNE A,#100,L12
- CLR SC02#
- SJMP L20
- L12: JB 02H,L13
- CLR SC02#
- DEC 51H
- MOV A,51H
- JNZ L20
- CLR C
- MOV A,#100
- SUBB A,31H
- MOV 51H,A
- SETB 02H
- L13: SETB SC02#
- DEC 51H
- MOV A,51H
- JNZ L20
- MOV 51H,31H
- CLR 02H
- L20: MOV A,32H
- JNZ L21
- SETB SC03#
- SJMP L30
- L21: CJNE A,#100,L22
- CLR SC03#
- SJMP L30
- L22: JB 03H,L23
- CLR SC03#
- DEC 52H
- MOV A,52H
- JNZ L30
- CLR C
- MOV A,#100
- SUBB A,32H
- MOV 52H,A
- SETB 03H
- L23: SETB SC03#
- DEC 52H
- MOV A,52H
- JNZ L30
- MOV 52H,32H
- CLR 03H
- L30: MOV A,33H
- JNZ L31
- SETB SC04#
- SJMP L40
- L31: CJNE A,#100,L32
- CLR SC04#
- SJMP L40
- L32: JB 04H,L33
- CLR SC04#
- DEC 53H
- MOV A,53H
- JNZ L40
- CLR C
- MOV A,#100
- SUBB A,33H
- MOV 53H,A
- SETB 04H
- L33: SETB SC04#
- DEC 53H
- MOV A,53H
- JNZ L40
- MOV 53H,33H
- CLR 04H
- L40: MOV A,34H
- JNZ L41
- SETB SC05#
- SJMP L50
- L41: CJNE A,#100,L42
- CLR SC05#
- SJMP L50
- L42: JB 05H,L43
- CLR SC05#
- DEC 54H
- MOV A,54H
- JNZ L50
- CLR C
- MOV A,#100
- SUBB A,34H
- MOV 54H,A
- SETB 05H
- L43: SETB SC05#
- DEC 54H
- MOV A,54H
- JNZ L50
- MOV 54H,34H
- CLR 05H
- L50: MOV A,35H
- JNZ L51
- SETB SC06#
- SJMP L60
- L51: CJNE A,#100,L52
- CLR SC06#
- SJMP L60
- L52: JB 06H,L53
- CLR SC06#
- DEC 55H
- MOV A,55H
- JNZ L60
- CLR C
- MOV A,#100
- SUBB A,35H
- MOV 55H,A
- SETB 06H
- L53: SETB SC06#
- DEC 55H
- MOV A,55H
- JNZ L60
- MOV 55H,35H
- CLR 06H
- L60: MOV A,36H
- JNZ L61
- SETB SC07#
- SJMP L70
- L61: CJNE A,#100,L62
- CLR SC07#
- SJMP L70
- L62: JB 07H,L63
- CLR SC07#
- DEC 56H
- MOV A,56H
- JNZ L70
- CLR C
- MOV A,#100
- SUBB A,36H
- MOV 56H,A
- SETB 07H
- L63: SETB SC07#
- DEC 56H
- MOV A,56H
- JNZ L70
- MOV 56H,36H
- CLR 07H
- L70: MOV A,37H
- JNZ L71
- SETB SC08#
- SJMP L80
- L71: CJNE A,#100,L72
- CLR SC08#
- SJMP L80
- L72: JB 08H,L73
- CLR SC08#
- DEC 57H
- MOV A,57H
- JNZ L80
- CLR C
- MOV A,#100
- SUBB A,37H
- MOV 57H,A
- SETB 08H
- L73: SETB SC08#
- DEC 57H
- MOV A,57H
- JNZ L80
- MOV 57H,37H
- CLR 08H
- L80: MOV A,38H
- JNZ L81
- SETB SC09#
- SJMP L90
- L81: CJNE A,#100,L82
- CLR SC09#
- SJMP L90
- L82: JB 09H,L83
- CLR SC09#
- DEC 58H
- MOV A,58H
- JNZ L90
- CLR C
- MOV A,#100
- SUBB A,38H
- MOV 58H,A
- SETB 09H
- L83: SETB SC09#
- DEC 58H
- MOV A,58H
- JNZ L90
- MOV 58H,38H
- CLR 09H
- L90: MOV A,39H
- JNZ L91
- SETB SC10#
- SJMP LA0
- L91: CJNE A,#100,L92
- CLR SC10#
- SJMP LA0
- L92: JB 0AH,L93
- CLR SC10#
- DEC 59H
- MOV A,59H
- JNZ LA0
- CLR C
- MOV A,#100
- SUBB A,39H
- MOV 59H,A
- SETB 0AH
- L93: SETB SC10#
- DEC 59H
- MOV A,59H
- JNZ LA0
- MOV 59H,39H
- CLR 0AH
- LA0: MOV A,3AH
- JNZ LA1
- SETB SC11#
- SJMP LB0
- LA1: CJNE A,#100,LA2
- CLR SC11#
- SJMP LB0
- LA2: JB 0BH,LA3
- CLR SC11#
- DEC 5AH
- MOV A,5AH
- JNZ LB0
- CLR C
- MOV A,#100
- SUBB A,3AH
- MOV 5AH,A
- SETB 0BH
- LA3: SETB SC11#
- DEC 5AH
- MOV A,5AH
- JNZ LB0
- MOV 5AH,3AH
- CLR 0BH
- LB0: MOV A,3BH
- JNZ LB1
- SETB SC12#
- SJMP LC0
- LB1: CJNE A,#100,LB2
- CLR SC12#
- SJMP LC0
- LB2: JB 0CH,LB3
- CLR SC12#
- DEC 5BH
- MOV A,5BH
- JNZ LC0
- CLR C
- MOV A,#100
- SUBB A,3BH
- MOV 5BH,A
- SETB 0CH
- LB3: SETB SC12#
- DEC 5BH
- MOV A,5BH
- JNZ LC0
- MOV 5BH,3BH
- CLR 0CH
- LC0: MOV A,3CH
- JNZ LC1
- SETB SC13#
- SJMP LD0
- LC1: CJNE A,#100,LC2
- CLR SC13#
- SJMP LD0
- LC2: JB 0DH,LC3
- CLR SC13#
- DEC 5CH
- MOV A,5CH
- JNZ LD0
- CLR C
- MOV A,#100
- SUBB A,3CH
- MOV 5CH,A
- SETB 0DH
- LC3: SETB SC13#
- DEC 5CH
- MOV A,5CH
- JNZ LD0
- MOV 5CH,3CH
- CLR 0DH
- LD0: MOV A,3DH
- JNZ LD1
- SETB SC14#
- SJMP LE0
- LD1: CJNE A,#100,LD2
- CLR SC14#
- SJMP LE0
- LD2: JB 0EH,LD3
- CLR SC14#
- DEC 5DH
- MOV A,5DH
- JNZ LE0
- CLR C
- MOV A,#100
- SUBB A,3DH
- MOV 5DH,A
- SETB 0EH
- LD3: SETB SC14#
- DEC 5DH
- MOV A,5DH
- JNZ LE0
- MOV 5DH,3DH
- CLR 0EH
- LE0: MOV A,3EH
- JNZ LE1
- SETB SC15#
- SJMP LF0
- LE1: CJNE A,#100,LE2
- CLR SC15#
- SJMP LF0
- LE2: JB 0FH,LE3
- CLR SC15#
- DEC 5EH
- MOV A,5EH
- JNZ LF0
- CLR C
- MOV A,#100
- SUBB A,3EH
- MOV 5EH,A
- SETB 0FH
- LE3: SETB SC15#
- DEC 5EH
- MOV A,5EH
- JNZ LF0
- MOV 5EH,3EH
- CLR 0FH
- LF0: MOV A,3FH
- JNZ LF1
- SETB SC16#
- SJMP LFA
- LF1: CJNE A,#100,LF2
- CLR SC16#
- SJMP LFA
- LF2: JB 10H,LF3
- CLR SC16#
- DEC 5FH
- MOV A,5FH
- JNZ LFA
- CLR C
- MOV A,#100
- SUBB A,3FH
- MOV 5FH,A
- SETB 10H
- LF3: SETB SC16#
- DEC 5FH
- MOV A,5FH
- JNZ LFA
- MOV 5FH,3FH
- CLR 10H
- LFA: MOV A,40H
- JNZ LF10
- SETB SC17#
- SJMP LFB
- LF10: CJNE A,#100,LF11
- CLR SC17#
- SJMP LFB
- LF11: JB 11H,LF12
- CLR SC17#
- DEC 60H
- MOV A,60H
- JNZ LFB
- CLR C
- MOV A,#100
- SUBB A,40H
- MOV 60H,A
- SETB 11H
- LF12: SETB SC17#
- DEC 60H
- MOV A,60H
- JNZ LFB
- MOV 60H,40H
- CLR 11H
- LFB: MOV A,41H
- JNZ LF20
- SETB SC18#
- SJMP LFC
- LF20: CJNE A,#100,LF21
- CLR SC18#
- SJMP LFC
- LF21: JB 12H,LF22
- CLR SC18#
- DEC 61H
- MOV A,61H
- JNZ LFC
- CLR C
- MOV A,#100
- SUBB A,41H
- MOV 61H,A
- SETB 12H
- LF22: SETB SC18#
- DEC 61H
- MOV A,61H
- JNZ LFC
- MOV 61H,41H
- CLR 12H
- LFC: MOV A,42H
- JNZ LF30
- SETB SC19#
- SJMP LFD
- LF30: CJNE A,#100,LF31
- CLR SC19#
- SJMP LFD
- LF31: JB 13H,LF32
- CLR SC19#
- DEC 62H
- MOV A,62H
- JNZ LFD
- CLR C
- MOV A,#100
- SUBB A,42H
- MOV 62H,A
- SETB 13H
- LF32: SETB SC19#
- DEC 62H
- MOV A,62H
- JNZ LFD
- MOV 62H,42H
- CLR 13H
- LFD: MOV A,43H
- JNZ LF40
- SETB SC20#
- SJMP LFE
- LF40: CJNE A,#100,LF41
- CLR SC20#
- SJMP LFE
- LF41: JB 14H,LF42
- CLR SC20#
- DEC 63H
- MOV A,63H
- JNZ LFE
- CLR C
- MOV A,#100
- SUBB A,43H
- MOV 63H,A
- SETB 14H
- LF42: SETB SC20#
- DEC 63H
- MOV A,63H
- JNZ LFE
- MOV 63H,43H
- CLR 14H
- LFE: MOV A,44H
- JNZ LF50
- SETB SC21#
- SJMP LFF
- LF50: CJNE A,#100,LF51
- CLR SC21#
- SJMP LFF
- LF51: JB 15H,LF52
- CLR SC21#
- DEC 64H
- MOV A,64H
- JNZ LFF
- CLR C
- MOV A,#100
- SUBB A,44H
- MOV 64H,A
- SETB 15H
- LF52: SETB SC21#
- DEC 64H
- MOV A,64H
- JNZ LFF
- MOV 64H,44H
- CLR 15H
- LFF: MOV A,45H
- JNZ LF60
- SETB SC22#
- SJMP LFG
- LF60: CJNE A,#100,LF61
- CLR SC22#
- SJMP LFG
- LF61: JB 16H,LF62
- CLR SC22#
- DEC 65H
- MOV A,65H
- JNZ LFG
- CLR C
- MOV A,#100
- SUBB A,45H
- MOV 65H,A
- SETB 16H
- LF62: SETB SC22#
- DEC 65H
- MOV A,65H
- JNZ LFG
- MOV 65H,45H
- CLR 16H
- LFG: MOV A,46H
- JNZ LF70
- SETB SC23#
- SJMP LFH
- LF70: CJNE A,#100,LF71
- CLR SC23#
- SJMP LFH
- LF71: JB 17H,LF72
- CLR SC23#
- DEC 66H
- MOV A,66H
- JNZ LFH
- CLR C
- MOV A,#100
- SUBB A,46H
- MOV 66H,A
- SETB 17H
- LF72: SETB SC23#
- DEC 66H
- MOV A,66H
- JNZ LFH
- MOV 66H,46H
- CLR 17H
- LFH: MOV A,47H
- JNZ LF80
- SETB SC24#
- SJMP LFI
- LF80: CJNE A,#100,LF81
- CLR SC24#
- SJMP LFI
- LF81: JB 18H,LF82
- CLR SC24#
- DEC 67H
- MOV A,67H
- JNZ LFI
- CLR C
- MOV A,#100
- SUBB A,47H
- MOV 67H,A
- SETB 18H
- LF82: SETB SC24#
- DEC 67H
- MOV A,67H
- JNZ LFI
- MOV 67H,47H
- CLR 18H
- ;------------------------------------
- ;等待10mS到
- ;------------------------------------
- LFI: LCALL DISP ;調用顯示程序
- L123: MOV A,6FH
- MOV KMWDT,#00111100B;設置看門狗
- CJNE A,#01H,L123
- MOV 6FH,#00H
- LJMP L1
- ;------------------------------------
- z;顯示轉化程序,48H放區域值,49H放到參數值,轉換后6AH放區域值高位,
- ;6BH放區域值低位,6CH、6DH、6EH放參數值,
- ;------------------------------------
- LEDXS1:MOV B,#10 ;顯示程序,為拆分計數值送顯示器作準備
- MOV A,48H ;余數作個位
- DIV AB ;將計數值除以10,高位進A,余數進B
- MOV 6BH,B
- JNZ LOOP1
- MOV 6AH,#10
- SJMP LOOP2
- LOOP1:MOV 6AH,A
- LOOP2:MOV A,#2FH
- ADD A,48H
- MOV R1,0E0H
- MOV 49H,@R1
- MOV B,#10 ;顯示程序,為拆分計數值送顯示器作準備
- MOV A,49H ;余數作個位
- DIV AB ;將計數值除以10,高位進A,余數進B
- MOV 6EH,B
- MOV B,#10
- DIV AB
- MOV 6DH,B
- JNZ LOOP3
- MOV 6CH,#10
- SJMP LOOP4
- LOOP3:MOV 6CH,A
- LOOP4:LCALL DISP
- RET
- ;------------------------------------
- ;顯示程序
- ;------------------------------------
- DISP: SETB XS1A2 ;P3.0端口置1
- SETB XSCLK ;P3.1端口置1
- MOV SCON,#00H ;初始化串行口方式0
- MOV R2,#05H ;顯示5位數
- MOV R1,#6EH ;60H-65H為顯示緩沖區
- MOV DPTR,#SETTAB ;字形表的入口地址
- L00P: MOV A,@R1 ;取最高位的待顯示數據
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV SBUF,A ;送串口顯示
- DELAY:JNB TI,DELAY ;等待發送完畢
- CLR TI ;清發送標志
- DEC R1 ;指針下移一位,準備取下一個待顯示數
- DJNZ R2,L00P ;直到6個數據全顯示完。
- CLR XS1A2 ;P3.0端口置0
- CLR XSCLK ;P3.1端口置0
- RET
- SETTAB:DB 03H 9FH 25H 0DH 99H 49H 41H 1FH 01H 09H 0FFH
- ; 0 1 2 3 4 5 6 7 8 9 消隱碼
- ;------------------------------------
- ;10mS時間中斷
- ;------------------------------------
- INTT0:PUSH ACC ;10mS時間中斷
- PUSH PSW
- MOV TH0,#0D8H ;重置時間參數為10mS(晶振為12M)
- MOV TL0,#0F0H
- MOV KMWDT,#00111100B;設置看門狗
- MOV 6FH,#01H ;6FH為10mS時間到標志
- POP PSW
- POP ACC
- RETI
- YS1: MOV R6,#70H ;延時子程序
- Y10: MOV R7,#0FFH
- Y11: NOP
- NOP
- NOP
- DJNZ R7,Y11
- MOV KMWDT,#00111100B;設置看門狗
- DJNZ R6,Y10
- RET
- ;------------------------------------
- ;EEPROM操作程序
- ;------------------------------------
- ;-----------------------------------------------------
- ;寫N字節數據子程序
- ;-----------------------------------------------------
- WRITE_DATA:
- MOV R0,#00H ;數據寫入首地址
- MOV R1,#30H ;
- WR_LOOP: MOV B,@R1
- LCALL WRITE_BYTE ;將查表結果寫入24C02
- INC R0 ;地址+1
- INC R1
- MOV KMWDT,#00111100B;設置看門狗
- CJNE R1,#48H,WR_LOOP;24個數寫入完畢?
- RET
- ;-----------------------------------------------------
- ;讀N字節數據子程序
- ;從24C02讀出數據
- ;-----------------------------------------------------
- READ_DATA:
- MOV R0,#00H ;設定讀取的初始地址
- MOV R1,#30H ;
- RE_LOOP: LCALL READ_BYTE ;讀EEPROM
- MOV KMWDT,#00111100B;設置看門狗
- LCALL STOP
- MOV @R1,A
- INC R0 ;地址+1
- INC R1
- CJNE R1,#48H,RE_LOOP;24個數寫入完畢?
- RET
- ;----------------------------------------------------
- ;寫操作子程序
- ;輸入參數: R0---要寫入的地址,B---要寫入的數據
- ;----------------------------------------------------
- WRITE_BYTE:
- LCALL START
- MOV A,#0A0H
- LCALL SENDBYTE
- LCALL WAITACK
- MOV KMWDT,#00111100B ;設置看門狗
- MOV A,R0
- LCALL SENDBYTE
- LCALL WAITACK
- MOV A,B
- LCALL SENDBYTE
- LCALL WAITACK
- LCALL STOP
- LCALL DELAY_5MS ;每寫入1個字節,延時若干MS
- RET
- ;----------------------------------------------------
- ;讀操作子程序
- ;輸入參數:R0---要讀的字節地址,
- ;輸出參數: A---結果
- ;----------------------------------------------------
- READ_BYTE:
- LCALL START
- MOV A,#0A0H
- LCALL SENDBYTE
- LCALL WAITACK
- MOV A,R0
- LCALL SENDBYTE
- LCALL WAITACK
- LCALL START
- MOV A,#0A1H
- LCALL SENDBYTE
- LCALL WAITACK
- LCALL RCVBYTE
- RET
- ;-----------------------------------------------------
- ;從IIC總線上接收一個字節數據
- ;出口參數:A---接收數據存放在A中
- ;-----------------------------------------------------
- RCVBYTE:
- MOV R7,#08 ;一個字節共接收8位數據
- CLR A
- SETB SDA ;釋放SDA數據線
- R_BYTE:
- CLR SCL
- NOP
- NOP
- NOP
- NOP
- SETB SCL ;啟動一個時鐘周期,讀總線
- NOP
- NOP
- NOP
- NOP
- MOV C,SDA ;將SDA狀態讀入C
- RLC A ;結果移入A
- SETB SDA ;釋放SDA數據線
- DJNZ R7,R_BYTE ;判斷8位數據是否接收完全?
- RET
- ;----------------------------------------------------
- ;向IIC總線發送一個字節數據
- ;入口參數:A---待發送數據存放在A中
- ;----------------------------------------------------
- SENDBYTE:
- MOV R7,#08
- S_BYTE:
- RLC A
- MOV SDA,C
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- DJNZ R7,S_BYTE ;8位發送完畢?
- RET
- ;-----------------------------------------------------
- ;等待應答信號
- ;等待從機返回一個響應信號
- ;-----------------------------------------------------
- WAITACK:
- CLR SCL
- SETB SDA ;釋放SDA信號線
- NOP
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- MOV C,SDA
- JC WAITACK ;SDA為低電平,返回了響應信號
- CLR SDA
- CLR SCL
- RET
- ;----------------------------------------------------
- ;啟動信號子程序
- ;----------------------------------------------------
- START:
- SETB SDA
- SETB SCL
- NOP
- CLR SDA
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- RET
- ;----------------------------------------------------
- ;停止信號子程序
- ;----------------------------------------------------
- STOP: MOV KMWDT,#00111100B;設置看門狗
- CLR SDA
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- SETB SDA
- NOP
- NOP
- CLR SCL
- CLR SDA
- RET
- ;----------------------------------------------------
- ;延時5MS子程序
- ;輸入參數:5MS
- ;輸出參數: 無
- ;影響資源: R5,R6等
- ;----------------------------------------------------
- DELAY_5MS:
- MOV R6,#10
- DE_LP:
- MOV R5,#250
- DJNZ R5,$
- MOV KMWDT,#00111100B;設置看門狗
- DJNZ R6,DE_LP
- RET
- ;------------------------------------
- ;軟件陷阱
- ;------------------------------------
- ORG 0B00H ;軟件陷阱
- NOP
- NOP
- NOP
- LJMP KS
- END
復制代碼
|
|