?? 7290jt.asm
字號(hào):
SDA BIT P1.7 ;I2C總線定義
SCL BIT P1.6
MTD EQU 30H ;發(fā)送數(shù)據(jù)緩沖器
MRD EQU 40H ;接收數(shù)據(jù)緩沖區(qū)
;定義器件地址,變量
ZLG7290 EQU 70H ;ZLG7290的器件地址
ACK BIT 10H ;應(yīng)答標(biāo)志位
KEYON BIT 11H ;有鍵按下的標(biāo)志位
K1_ON BIT 12H ;已經(jīng)按下過k1的標(biāo)志位
SLA DATA 50H ;器件的從地址
SUBA DATA 51H ;器件的子地址
NUMBYTE DATA 52H ;讀/寫的字節(jié)數(shù)變量
BLINK DATA 53H ;控制閃爍的變量
NUM DATA 54H ;指向DISP_BUF的值的變量
DISP_BUF EQU 60H ;顯示緩沖區(qū)
ORG 8000H
AJMP MAIN
ORG 8003H
AJMP KEYINT0
ORG 8100H
MAIN: MOV R4,#0F0H ;延時(shí),等待芯片復(fù)位
DJNZ R4,$
MOV BLINK,#01H ;給閃爍控制變量賦初值
MOV NUM,#00H ;給要指向的變量賦初值
CLR KEYON ;有鍵按下的標(biāo)志位清零
CLR K1_ON ;按下過k1的標(biāo)志位清零
SETB IT0 ;設(shè)置外部中斷為邊沿觸發(fā)方式
SETB EX0 ;開放外部中斷0
SETB EA ;開放總中斷
;給顯示緩沖區(qū)賦值0~8
MOV R0,#DISP_BUF ;取顯示緩沖區(qū)地址
MOV A,#00H ;賦初值
MOV R1,#08H ;循環(huán)8次
WRDISP_BUF: MOV @R0,A ;將值送入顯示緩沖區(qū)
INC R0 ;地址加1
INC A ;數(shù)值加1
DJNZ R1,WRDISP_BUF ;循環(huán)8次了嗎?
;在LED上顯示數(shù)字0~8,
;入口參數(shù):R6:復(fù)合命令的第一個(gè)字節(jié),R7:復(fù)合命令的第二個(gè)字節(jié)。R2:要顯示的LED數(shù)
MOV R6,#60H ;復(fù)合命令第一個(gè)字節(jié)的初值,是按位下載數(shù)據(jù)并譯碼的指令代碼
MOV R7,#00H ;復(fù)合命令的第二個(gè)字節(jié),是要顯示的數(shù)值
MOV R2,#08H ;循環(huán)8次,即顯示8位
LOOP1: MOV MTD,R6 ;將復(fù)合命令的第一個(gè)字節(jié)送發(fā)送數(shù)據(jù)緩沖區(qū)
MOV MTD+1,R7 ;將復(fù)合命令的第二個(gè)字節(jié)送發(fā)送數(shù)據(jù)緩沖區(qū)
INC R6 ;顯示下一個(gè)位
INC R7 ;數(shù)值加1
LCALL SENDCMD ;調(diào)用發(fā)送命令函數(shù)
ACALL DELAY ;延遲
DJNZ R2,LOOP1 ;循環(huán)8次了嗎?
;鍵盤處理程序
;K1鍵:閃爍,表示可以修改閃爍位的值,每按一次K1,閃爍向左移動(dòng)一位.
;K2鍵:增加,按一次顯示值加1
;K3鍵:減少,按一次顯示值減1
;K4鍵:確定,停止所有閃爍
KEYHANDLE: SETB EA
JNB KEYON,KEYHANDLE ;判斷KEYON(有鍵按下)標(biāo)志是否有被置位,沒有則在此處循環(huán)
CLR EA
CLR KEYON ;如果標(biāo)志被置位,KEYON標(biāo)志清零
LCALL SCANKEY ;調(diào)用鍵盤掃描函數(shù),讀出鍵值
MOV A,MRD ;將接收數(shù)據(jù)緩沖區(qū)的內(nèi)容送A
CJNE A,#01H,KEY2_HANDLE ;如果按下了K1鍵,即鍵值為01,就執(zhí)行KEY1_HANDLE程序,如果不是跳轉(zhuǎn)到KEY2_HANDLE
KEY1_HANDLE: SETB K1_ON ;置位K1_ON(按下K1)標(biāo)志位
MOV MTD,#70H ;發(fā)送閃爍命令,復(fù)合命令的第一個(gè)字節(jié)是07H
MOV MTD+1,BLINK ;復(fù)合命令的第二字節(jié),指出要閃爍的位
MOV A,BLINK ;將要閃爍的位左移一位,在下一次按下K1時(shí),閃爍會(huì)左移一位
RL A
MOV BLINK,A
INC NUM ;現(xiàn)在顯示第NUM個(gè)數(shù)
MOV A,NUM
CJNE A,#09H,NEXT1 ;如果NUM大于8,要將它重新設(shè)置為0
MOV NUM,#01H
NEXT1: LCALL SENDCMD ;調(diào)用發(fā)送命令函數(shù)
AJMP KEYHANDLE ;跳轉(zhuǎn)到KEYHANDLE
;K2的處理程序
KEY2_HANDLE: CJNE A,#02H,KEY3_HANDLE ;如果按下的鍵是K2
JNB K1_ON,KEYHANDLE ;如果已經(jīng)按下了K1,則可以繼續(xù)執(zhí)行
MOV A,NUM
DEC A
ORL A,#60H ;復(fù)合命令第一字節(jié),表示要下載數(shù)據(jù)的DpRam(0~7)
MOV MTD,A ;送發(fā)送數(shù)據(jù)緩沖區(qū)
MOV R0,A ;指向顯示緩沖區(qū)
INC @R0 ;所指向的值加1,即顯示值加1
CJNE @R0,#1FH,NEXT2 ;如果得到的值大于1FH(超過可以顯示的值),要將它重新設(shè)置為00H
MOV @R0,#00H
NEXT2: MOV MTD+1,@R0 ;作為復(fù)合命令的第二字節(jié)發(fā)送到發(fā)送緩沖區(qū)
ORL MTD+1,#40H ;該位閃爍
LCALL SENDCMD ;調(diào)用發(fā)送命令函數(shù)
AJMP KEYHANDLE ;跳轉(zhuǎn)到KEYHANDLE
;K3的處理程序
KEY3_HANDLE: CJNE A,#03H,KEY4_HANDLE
JNB K1_ON,KEYHANDLE
MOV A,NUM
DEC A
ORL A,#60H
MOV MTD,A
MOV R0,A
DEC @R0 ;所指向的值加1,即顯示值加1
CJNE @R0,#0FFH,NEXT3 ;如果得到的值小于0(0減1為FFH),要將它重新設(shè)置為1EH
MOV @R0,#1EH
NEXT3: MOV MTD+1,@R0
ORL MTD+1,#40H
LCALL SENDCMD
AJMP KEYHANDLE
;K4的處理程序
KEY4_HANDLE: CJNE A,#04H,OTHERKEY_HANDLE
MOV MTD,#70H ;發(fā)送所有位不閃爍命令
MOV MTD+1,#00H
LCALL SENDCMD
MOV BLINK,#01H ;將控制閃爍的變量設(shè)置為初值
MOV NUM,#00H ;將指向顯示緩沖區(qū)的變量設(shè)置為初值
CLR K1_ON ;清除K1_ON標(biāo)志
AJMP KEYHANDLE
;其他鍵的處理程序
OTHERKEY_HANDLE: ;如果按下的是K5~K8,跳轉(zhuǎn)到KEYHANDLE,無操作
AJMP KEYHANDLE
;鍵盤中斷程序
KEYINT0: PUSH PSW ;保護(hù)現(xiàn)場(chǎng)
PUSH ACC
CLR EX0 ;禁止中斷
SETB KEYON ;置位KEYON標(biāo)志
SETB EX0 ;開放中斷
POP ACC ;出棧
POP PSW
RETI ;中斷返回
;延時(shí)子程序
DELAY: MOV R5,#10H
DELAY0: MOV R4,#0F0H
DELAY1: DJNZ R4,DELAY1
DJNZ R5,DELAY0
RET
$INCLUDE(ZLG7290.INC) ;包含ZLG7290軟件包
$INCLUDE(VI2C_ASM.INC) ;包含VIIC軟件包
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -