?? 16
字號:
;===CH452顯示+按鍵程序,用CH452兩線顯示=======
;Modified by Hefanghua.
;MCU:STC89C58. DISPLAY:CH452,4位一體共陰數碼管(共8位). USB DOWNLOAD:
; CH341. 軟件:偉福6000, STC-ISP
; 22.1184MHz(正常速度),11.0592MHZ(較慢顯示)
;CH452_ADDR為1(默認拉高)
;目前已測過的鍵值(HEX值): 40H~47H ,78H~7FH
;無按鍵按下時為00H(HEX值)。
LEDA BIT P1.2 ;紅色LED
LEDB BIT P1.3 ;綠色LED
CH452_CMD DATA 31H
SDA BIT P2.1 ;定義IIC串行數據線,CH452_SDA數碼管顯示
SCL BIT P2.0 ;定義IIC串行時鐘線,CH452_SCL數碼管顯示
STACK EQU 0FH ;鍵盤顯示的堆棧區棧頂(向上延伸)
;---------------
LED0 EQU 62H ;第0位,最右邊的個位
LED1 EQU 63H ;第1位
LED2 EQU 64H ;第2位
LED3 EQU 65H ;第3位
LED4 EQU 66H ;第4位
LED5 EQU 67H ;第5位
LED6 EQU 68H ;第6位
LED7 EQU 69H ;第7位,最高位
KEYBUF EQU 6AH ;存一個按鍵值
ONEBYTEHEX EQU 6BH
BCDH EQU 6CH
BCDL EQU 6DH
ISP_CONTR EQU 0E7h
ORG 0000H ;復位后單片機入口
JMP MAIN ;進入主程序MAIN
;====================主程序開始===============================
ORG 0100H
MAIN:
CLR EA ;關中斷
MOV SP, #7FH ;設置堆棧指針
mov led7,#8
mov led6,#8
mov led5,#8
mov led4,#8
mov led3,#8
mov led2,#8
mov led1,#8
mov led0,#8
LCALL DELAY1s ;等待CH452完全復位
;----------
; 啟動CH452的顯示驅動和鍵盤掃描,2線接口,兼容IIC時序
MOV CH452_CMD,#04H ;設置系統參數命令
MOV A,#03H ;01H ;禁止看門狗、鍵盤功能,使能顯示驅動,
CALL CH452_WRITE ;發出命令
MOV CH452_CMD,#05H ;設置顯示參數
MOV A,#80H ;BCD譯碼方式,掃描極限為8. #11000000b為掃描極限是4
CALL CH452_WRITE ;發出命令
MOV A,PCON ;+++++++++++++++
ANL A,#10H ;+++++++++++++++
JZ RUN_ISP ;判POF是否為1 ;+++++++++++++++
Initiate: ;POF=1, 是冷啟動--上電復位
ANL PCON,#0EFH ;將POF清0 ;+++++++++++++++
;...... ;初始化
MOV A,#0FFH
MOV P0,A
MOV P1,A ;清端口狀態
MOV P2,A
MOV P3,A
CLR A
MOV ONEBYTEHEX,#0FFH
CALL DISPLAY452
CALL cleardisplay
SETB LEDA
SETB LEDB
LCALL DELAY1s
CLR LEDA
CLR LEDB
LCALL DELAY1s
SETB LEDA
SETB LEDB
CALL CH452_READ
LCALL DELAY1s
AGAIN:
;clr leda
SETB LEDB
CALL CH452_READ ;查詢式讀取按鍵的值
MOV KEYBUF,A
MOV ONEBYTEHEX,A
call ONEBYTE2BCD ;拆開
mov led3,BCDH
mov led2,BCDL
MOV LED1,#17H ;H
CALL DISPLAY452 ;送CH452顯示
;SETB LEDA
CLR LEDB
call KEYSjudge ;判斷按鍵的值,并執行對應程序
CALL cleardisplay
Lcall delay
JMP AGAIN
RUN_ISP:
;軟件實現系統復位到ISP區.POF=0, 是熱重啟--外部手動復位或看門狗復位
ORL PCON,#10H ;將POF置1 ;+++++++++++++++
MOV ISP_CONTR, #11100000B ;復位并進ISP,#01100000B 只是軟復位 ;++++++++++
CALL DELAY1S ;++++++++++
JMP Initiate ;ISP結束后自動恢復運行
;==========================================
;==========主程序結束======================
;==========================================
KEYSjudge: ;處理KEYBUF中的鍵值
CLR EA
CLR C ;清進位標志
MOV A,KEYBUF
jz endkeyscan ;未按按鍵的處理
SUBB A,#96 ;數據的一半值 20h+40H
JC smaller96 ;若小于60H,則轉
larger96: ;≥96
CLR C ;必須先清零,否則計算的結果不正確
MOV A,KEYBUF
SUBB A,#112 ;數據的一半值
JC smaller112
larger112: ;≥112
CLR C
MOV A,KEYBUF
SUBB A,#120 ;數據的一半值
JC smaller120
larger120: ;處理120~127
MOV A,KEYBUF
SUBB A,#120
JZ KEYis120 ;120?
MOV A,KEYBUF
SUBB A,#121
JZ KEYis121 ;121?
MOV A,KEYBUF
SUBB A,#122
JZ KEYis122 ;122?
MOV A,KEYBUF
SUBB A,#123
JZ KEYis123 ;123?
MOV A,KEYBUF
SUBB A,#124
JZ KEYis124 ;124?
MOV A,KEYBUF
SUBB A,#125
JZ KEYis125 ;125?
MOV A,KEYBUF
SUBB A,#126
JZ KEYis126 ;126?
MOV A,KEYBUF
SUBB A,#127
JZ KEYis127 ;127?
jmp errorkey ;其它為錯誤
;RET
;中間跳轉
smaller112: ljmp smallerthan112
smaller120: ljmp smallerthan120
KEYis120: ljmp KEY120
KEYis121: ljmp KEY121
KEYis122: ljmp KEY122
KEYis123: ljmp KEY123
KEYis124: ljmp KEY124
KEYis125: ljmp KEY125
KEYis126: ljmp KEY126
KEYis127: ljmp KEY127
endkeyscan:
nop
ret
;
smaller96:
CLR C
MOV A,KEYBUF
SUBB A,#80 ;數據的一半值
JNC larger80
smaller80:
CLR C
MOV A,KEYBUF
SUBB A,#72 ;數據的一半值
JNC larger72
smaller72: ;處理64~71
CLR C
MOV A,KEYBUF
SUBB A,#64
JZ KEYis64 ;64?
MOV A,KEYBUF
SUBB A,#65
JZ KEYis65 ;65?
MOV A,KEYBUF
SUBB A,#66
JZ KEYis66 ;66?
MOV A,KEYBUF
SUBB A,#67
JZ KEYis67 ;67?
MOV A,KEYBUF
SUBB A,#68
JZ KEYis68 ;68?
MOV A,KEYBUF
SUBB A,#69
JZ KEYis69 ;69?
MOV A,KEYBUF
SUBB A,#70
JZ KEYis70 ;70?
MOV A,KEYBUF
SUBB A,#71
JZ KEYis71 ;71?
jmp errorkey ;錯誤
;
KEYis64: ljmp KEY64
KEYis65: ljmp KEY65
KEYis66: ljmp KEY66
KEYis67: ljmp KEY67
KEYis68: ljmp KEY68
KEYis69: ljmp KEY69
KEYis70: ljmp KEY70
KEYis71: ljmp KEY71
;
larger80: ;≥80
CLR C
MOV A,KEYBUF
SUBB A,#88
JC smaller88
larger88: ;處理88~95
;......
jmp errorkey
smaller88: ;處理80~87
;......
jmp errorkey
larger72 : ;處理72~79
;......
jmp errorkey
smallerthan112:
CLR C
MOV A,KEYBUF
SUBB A,#104
JC smaller104
larger104: ;處理104~111
;......
jmp errorkey
smaller104: ;處理96~103
;......
jmp errorkey
smallerthan120: ;處理112~119
;......
jmp errorkey
;
;---------------
KEY64:
call run_key01
jmp endkeyscan
KEY65:
call run_key02
jmp endkeyscan
KEY66:
call run_key03
jmp endkeyscan
KEY67:
call run_key04
jmp endkeyscan
KEY68:
call run_key05
jmp endkeyscan
KEY69:
call run_key06
jmp endkeyscan
KEY70:
call run_key07
jmp endkeyscan
KEY71:
call run_key08
jmp endkeyscan
;......
;......
KEY120:
call run_key09
jmp endkeyscan
KEY121:
call run_key10
jmp endkeyscan
KEY122:
call run_key11
jmp endkeyscan
KEY123:
call run_key12
jmp endkeyscan
KEY124:
call run_key13
jmp endkeyscan
KEY125:
call run_key14
jmp endkeyscan
KEY126:
call run_key15
jmp endkeyscan
KEY127:
call run_key16
jmp endkeyscan
RUN_KEY01:
MOV LED7,#10H
MOV LED6,#1
CALL DISPLAY452
RET
RUN_KEY02:
MOV LED7,#10H
MOV LED6,#2
CALL DISPLAY452
RET
RUN_KEY03:
MOV LED7,#10H
MOV LED6,#3
CALL DISPLAY452
RET
RUN_KEY04:
MOV LED7,#10H
MOV LED6,#4
CALL DISPLAY452
RET
RUN_KEY05:
MOV LED7,#10H
MOV LED6,#5
CALL DISPLAY452
RET
RUN_KEY06:
MOV LED7,#10H
MOV LED6,#6
CALL DISPLAY452
RET
RUN_KEY07:
MOV LED7,#10H
MOV LED6,#7
CALL DISPLAY452
RET
RUN_KEY08:
MOV LED7,#10H
MOV LED6,#8
CALL DISPLAY452
RET
RUN_KEY09:
MOV LED7,#10H
MOV LED6,#9
CALL DISPLAY452
RET
RUN_KEY10:
MOV LED7,#1
MOV LED6,#0
CALL DISPLAY452
RET
RUN_KEY11:
MOV LED7,#1
MOV LED6,#1
CALL DISPLAY452
RET
RUN_KEY12:
MOV LED7,#1
MOV LED6,#2
CALL DISPLAY452
RET
RUN_KEY13:
MOV LED7,#1
MOV LED6,#3
CALL DISPLAY452
RET
RUN_KEY14:
MOV LED7,#1
MOV LED6,#4
CALL DISPLAY452
RET
RUN_KEY15:
MOV LED7,#1
MOV LED6,#5
CALL DISPLAY452
RET
RUN_KEY16:
MOV LED7,#1
MOV LED6,#6
CALL DISPLAY452
RET
errorkey:
mov ONEBYTEHEX,keybuf
call ONEBYTE2BCD ;拆開
mov led5,BCDH
mov led4,BCDL
mov led7,#0eh
MOV LED6,#10H
mov led3,#10h
mov led2,#10h
MOV LED1,#10H
MOV LED0,#10H
CALL DISPLAY452 ;送CH452顯示
clr leda
SETB LEDB
jmp $ ;停機
;---------------------------------
CH452_I2C_START: SETB SDA
CLR SCL ;通知CH452,將要對其操作,此段時間不要再產生按鍵中斷
CH452_I2C_START1: NOP
NOP ;保留足夠的時間給CH452產生中斷
NOP
JNB SDA,CH452_I2C_START1 ;CH452正在請求中斷?
NOP
NOP
CLR EX1 ;禁止鍵盤中斷,防止開始時被CH452中斷而進入中斷服務程序中的START
SETB SDA
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL ;鉗住總線,準備發數據
RET
;結束總線子程序
CH452_I2C_STOP: CLR SDA
NOP
NOP
SETB SCL ;發送結束條件的時鐘信號
NOP
NOP
SETB SDA ;結束總線
CLR IE1 ;清除中斷標志,因為通過SDA輸出數據所以會誤中斷
SETB EX1
RET
;發送字節子程序
;字節數據放入ACC
CH452_IIC_WR: MOV R7,#08H
CH452_IIC_WR1: RLC A ;取數據位
MOV SDA,C
SETB SCL
NOP
NOP
NOP
CLR SCL
DJNZ R7,CH452_IIC_WR1
NOP
SETB SDA
SETB SCL
NOP
NOP
NOP
CLR SCL
RET
;
;讀取字節子程序
;讀出的值在ACC
CH452_IIC_RD: MOV R7,#08H
CH452_IIC_RD1: SETB SDA
SETB SCL ;時鐘線為高,接收數據位
NOP
NOP
MOV C,SDA ;讀取數據位
CLR SCL
RLC A ;進行數據位的處理
DJNZ R7,CH452_IIC_RD1 ;未夠8位,再來一次
SETB SDA
SETB SCL
NOP
NOP
NOP
CLR SCL
RET
; 無子地址器件寫字節數據
; 入口參數: CH452_CMD命令高字節, ACC命令低字節
CH452_WRITE: PUSH ACC
CH452_WRITE1: LCALL CH452_I2C_START ;起動總線
MOV A,CH452_CMD
RLC A
ANL A,#3EH
ORL A,#60H ;當ADDR=0時此值為40H,當ADDR=1時此值為60H
LCALL CH452_IIC_WR ;發送命令高字節
POP ACC ;寫數據
LCALL CH452_IIC_WR
LCALL CH452_I2C_STOP
RET
; 讀取按鍵值.返回按鍵值在ACC中:
CH452_READ: LCALL CH452_I2C_START
MOV A,#6FH ;發送讀鍵盤命令,
;當ADDR=0時此值為4FH,當ADDR=1時此值為6FH
LCALL CH452_IIC_WR ;發送命令高字節
LCALL CH452_IIC_RD ;進行讀字節操作
LCALL CH452_I2C_STOP ;結束總線
RET
;---------------------------------
;-------顯示----------------------
display452:
MOV CH452_CMD,#0FH
MOV A,LED7 ;7位顯示
CALL CH452_WRITE
MOV CH452_CMD,#0EH
MOV A,LED6 ;6位顯示
CALL CH452_WRITE
MOV CH452_CMD,#0DH
MOV A,LED5 ;5位顯示
CALL CH452_WRITE
MOV CH452_CMD,#0CH
MOV A,LED4 ;4位顯示
CALL CH452_WRITE
MOV CH452_CMD,#0BH
MOV A,led3 ;3位顯示
CALL CH452_WRITE
MOV CH452_CMD,#0AH
MOV A,led2 ;2位顯示
CALL CH452_WRITE
MOV CH452_CMD,#09H
MOV A,led1 ;1位顯示
CALL CH452_WRITE
MOV CH452_CMD,#08H
MOV A,led0 ;0位顯示
CALL CH452_WRITE
;CH452支持特殊的BCD碼:
;11H -| -1 或加號
;12H - 負號減號
;13H = 等于號
;14H [ 左方括號
;15H ] 右方括號
;16H _ 下劃線
;17H H 字母 H
;18H L 字母 L
;19H P 字母 P
;1AH . 小數點
;1EH 自定義字符
;其余 空格
ret
cleardisplay: ;BCD譯碼模式清屏
mov led7,#10H ;7位顯示空格
mov led6,#10H ;6位顯示空格
mov led5,#10H ;5位顯示空格
mov led4,#10H ;4位顯示空格
mov led3,#10H ;3位顯示空格
mov led2,#10H ;2位顯示空格
mov led1,#10H ;1位顯示空格
mov led0,#10H ;0位顯示空格
ret
ONEBYTE2BCD:
MOV A,ONEBYTEHEX
ANL A,#0F0H
SWAP A
MOV BCDH,A ;得高4位
MOV A,ONEBYTEHEX
ANL A,#0FH
MOV BCDL,A ;得低4位
RET
;----------延時子程序-------------
DELAY1S: MOV R7,#181 ;1秒,22.1184MHz ;#98 ;約1秒,12MHz ,11.0592MHz
LOOP7: MOV R6,#100
LOOP6: NOP
mov R5,#49
DJNZ R5,$
DJNZ R6,LOOP6
DJNZ R7,LOOP7
RET
DELAY: MOV R3,#100
LOOP2: MOV R2,#55
LOOP1: NOP
mov R1,#55
DJNZ R1,$
DJNZ R2,LOOP1
DJNZ R3,LOOP2
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -