台灣最大程式設計社群網站
線上人數
977
 
會員總數:238866
討論主題:185385
歡迎您免費加入會員
討論區列表 >> 其他語言 >> 求解 4x4鍵盤+LCM 發生的問題
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
求解 4x4鍵盤+LCM 發生的問題
價值 : 50 QP  點閱數:267 回應數:0

樓主

Syuhiro
門外漢
0 6
61 1
發送站內信

請教各位
現在我利用4x4鍵盤 keyin 2組數值,分別為要控制LED亮滅的時間
由於之前計時是以秒為單位,所以在控制上並無什麼問題
但現在我要變成時間要能計數到0.1,現在倘諾當我keyin了「5.0」時並不會是5秒而是50秒
不知道哪位高手能告知我的code哪裡出了錯
以下是小弟的code,凡請各位


;控制器
KEYPAD EQU P1 ;定義4x4鍵盤位置
KEYBUF EQU 30H
LCD_DATA EQU P2 ;定義LCD接線位置
LCD_RS EQU P3.0
;LCD_RW EQU P3.1
LCD_E EQU P3.1
ON_TIME EQU R1
OFF_TIME EQU R2
TIMETEMP EQU 20H
TOTALTIME EQU R5
KEYVALUE EQU R6

ORG 00H
INITAL:
CLR A
MOV KEYVALUE,#0
MOV ON_TIME,#0
MOV OFF_TIME,#0
MOV TOTALTIME,#0

START:
CALL DELAY5MS ;Wait for LCD Power-on Ready
MOV A,#00111111B ;設定LCD介面為8位元, 2行, 5x7字型
CALL WRIR
MOV A,#00001110B ;設定要LCD顯示, 要有游標, 要閃爍
CALL WRIR
MOV A,#00000100B ;設定寫資料進入LCD時, 顯示器不要動, 游標向右移一格
CALL WRIR
MOV A,#1 ;清除LCD
CALL WRIR
CALL DELAY5MS
MES0_SHOW:
MOV A,#010000000B ;設定DD RAM位址為0(第一行)
CALL WRIR
MOV DPTR,#MES0
MES0_LOOP:
CLR A
MOVC A,@A+DPTR
JZ ENDMES0
CALL WRDR
INC DPTR
JMP MES0_LOOP
ENDMES0:
JMP ONKEYSCAN
MES1_SHOW:
MOV A,#011000000B ;設定DD RAM位址為40h(第二行)
;MOV A,#010000000B ;設定DD RAM位址為0(第一行)
CALL WRIR
MOV DPTR,#MES1
MES1_LOOP:
CLR A
MOVC A,@A+DPTR
JZ ENDMES1
CALL WRDR
INC DPTR
JMP MES1_LOOP
ENDMES1:
JMP OFFKEYSCAN

ONKEYSCAN:
MOV R7,#4
MOV KEYBUF,#11111110B ;掃描鍵盤訊號
ONKEYBUF:
MOV KEYPAD,KEYBUF
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,ONKEYCHECK
MOV A,KEYBUF
RL A
MOV KEYBUF,A
DJNZ R7,ONKEYBUF
JMP ONKEYSCAN
ONKEYCHECK:
CALL DELAY5MS
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,ONKEYIN
JMP ONKEYSCAN
ONKEYIN:
MOV A,KEYPAD
CALL KEYDATA
ONKEYWAIT:
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,ONKEYWAIT
MOV A,ON_TIME
MOV B,#10
MUL AB
ADD A,KEYVALUE
MOV ON_TIME,A
JMP ONKEYSCAN
OFFKEYSCAN:
MOV R7,#4
MOV KEYBUF,#11111110B ;掃描鍵盤訊號
OFFKEYBUF:
MOV KEYPAD,KEYBUF
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,OFFKEYCHECK
MOV A,KEYBUF
RL A
MOV KEYBUF,A
DJNZ R7,OFFKEYBUF
JMP OFFKEYSCAN
OFFKEYCHECK:
CALL DELAY5MS
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,OFFKEYIN
JMP OFFKEYSCAN
OFFKEYIN:
MOV A,KEYPAD
CALL KEYDATA
OFFKEYWAIT:
MOV A,KEYPAD
ANL A,#11110000B
CJNE A,#11110000B,OFFKEYWAIT
MOV A,OFF_TIME
MOV B,#10
MUL AB
ADD A,KEYVALUE
MOV OFF_TIME,A
JMP OFFKEYSCAN

SWITCHLOOP:
MOV A,#010000000B ;設定DD RAM位址為0(第一行)
CALL WRIR
MOV DPTR,#MES3
MES3_LOOP:
CLR A
MOVC A,@A+DPTR
JZ ENDMES3
CALL WRDR
INC DPTR
JMP MES3_LOOP
ENDMES3:
MOV A,#011000000B ;設定DD RAM位址為40h(第二行)
CALL WRIR
MOV DPTR,#MES4
ONMES:
CLR A
MOVC A,@A+DPTR
JZ ENDONMES
CALL WRDR
INC DPTR
JMP ONMES
ENDONMES:
JMP SWITCH_ON
SWITCH_ON:
MOV A,ON_TIME
MOV TIMETEMP,A
CLR P3.7
ON_LOOP: CALL DELAY1S
DJNZ TIMETEMP,ON_LOOP

MOV A,#011000000B ;設定DD RAM位址為40h(第二行)
CALL WRIR
MOV DPTR,#MES5
OFFMES:
CLR A
MOVC A,@A+DPTR
JZ ENDOFFMES
CALL WRDR
INC DPTR
JMP OFFMES
ENDOFFMES:
JMP SWITCH_OFF
SWITCH_OFF:
MOV A,OFF_TIME
MOV TIMETEMP,A
SETB P3.7
OFF_LOOP: CALL DELAY1S
DJNZ TIMETEMP,OFF_LOOP
JMP SWITCHLOOP
;=============================================================
KEYDATA: CJNE A,#11101110B,S1
MOV A,#'7'
MOV KEYVALUE,#7
CALL WRDR
RET
S1: CJNE A,#11101101B,S2
MOV A,#'8'
MOV KEYVALUE,#8
CALL WRDR
RET
S2: CJNE A,#11101011B,S3
MOV A,#'9'
MOV KEYVALUE,#9
CALL WRDR
RET
S3: CJNE A,#11100111B,S4
JMP MES1_SHOW
RET
S4: CJNE A,#11011110B,S5
MOV A,#'4'
MOV KEYVALUE,#4
CALL WRDR
RET
S5: CJNE A,#11011101B,S6
MOV A,#'5'
MOV KEYVALUE,#5
CALL WRDR
RET
S6: CJNE A,#11011011B,S7
MOV A,#'6'
MOV KEYVALUE,#6
CALL WRDR
RET
S7: CJNE A,#11010111B,S8
MOV A,#'.'
CALL WRDR
RET
S8: CJNE A,#10111110B,S9
MOV A,#'1'
MOV KEYVALUE,#1
CALL WRDR
RET
S9: CJNE A,#10111101B,S10
MOV A,#'2'
MOV KEYVALUE,#2
CALL WRDR
RET
S10: CJNE A,#10111011B,S11
MOV A,#'3'
MOV KEYVALUE,#3
CALL WRDR
RET
S11: CJNE A,#10110111B,S12
RET
S12: CJNE A,#01111110B,S13
CALL INITAL
JMP START
RET
S13: CJNE A,#01111101B,S14
MOV A,#'0'
MOV KEYVALUE,#0
CALL WRDR
RET
S14: CJNE A,#01111011B,S15
JMP SWITCHLOOP
RET
S15: CJNE A,#01110111B,SEND
SEND:
RET

WRIR: CLR LCD_RS ;寫命令到LCD副程式,E=1,RW=0,RS=0
SETB LCD_E
MOV LCD_DATA,A
CALL DELAY5MS
CLR LCD_E ;寫命令到LCD副程式,E=0,RW=0,RS=0
CALL DELAY5MS
RET
WRDR: SETB LCD_RS ;寫資料到LCD副程式,E=1,RW=0,RS=1
SETB LCD_E
MOV LCD_DATA,A
CALL DELAY5MS
CLR LCD_E ;寫資料到LCD副程式,E=0,RW=0,RS=1
CALL DELAY5MS
RET

DELAY5MS:
MOV R0,#1
JMP DELAY
DELAY100MS:
MOV R0,#20
JMP DELAY
DELAY1S:
MOV R0,#200
JMP DELAY
DELAY:
MOV TMOD,#00000001B
LOOPDY: MOV TH0,#>(65536-5000*11/12)
MOV TL0,#<(65536-5000*11/12)
SETB TR0
WAIT: JNB TF0,WAIT
CLR TF0
CLR TR0
DJNZ R0,LOOPDY
RET

MES0: DB "ON-TIME:",0
MES1: DB "OFF-TIME:",0
MES2: DB "TOTAL TIME:",0
MES3: DB "GOLD CHOICE",0
MES4: DB "Status:ON...",0
MES5: DB "Status:OFF...",0
END



搜尋相關Tags的文章: [ 4x4鍵盤 ] , [ 計時 ] , [ 時間 ] ,
本篇文章發表於2016-11-15 16:06
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
[ 變換順序 ]   

回覆
如要回應,請先登入.