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