12864做顯示屏,串口顯示,定義P0.7,RS;P0.6,RW;P0.5,E;P0.4PSB;P0.3,RST。P1.0加熱繼電器,P1.1電機正轉,P1.2電機反轉,P1.3進水電磁閥,P1,4排水,P1.5門鎖,定義P3.2為程序鍵(短按切換清洗和燙染程序長按設置工作時間,電機旋轉時間,溫度,燙染是否排水),p3,3為加鍵,p3.2為減鍵,p3.5為啟動暫停鍵。p3.0,為水位開關鍵,p3.7接18b20溫度傳感器,程序可以選擇(燙染/清洗),燙染(進水,加熱,攪拌,排水)
清洗(進水,攪拌,排水)
設置的參數要保存
各位大佬看看這個程序是啥問題,現在12864不顯示,硬件沒有問題歡迎指導
; 定義 12864 引腳
sbit RS = P0^7; ; 寄存器選擇引腳
sbit RW = P0^6; ; 讀寫選擇引腳
sbit E = P0^5; ; 使能引腳
sbit PSB = P0^4; ; 并行/串行選擇引腳(設為并行)
sbit RST = P0^3; ; 復位引腳
; 定義控制引腳
sbit Heating_Relay = P1^0; ; 加熱繼電器
sbit Motor_Forward = P1^1; ; 電機正轉
sbit Motor_Reverse = P1^2; ; 電機反轉
sbit Water_Intake = P1^3; ; 進水電磁閥
sbit Water_Drain = P1^4; ; 排水
sbit Door_Lock = P1^5; ; 門鎖
; 定義按鍵引腳
sbit Program_Key = P3^2; ; 程序鍵
sbit Inc_Key = P3^3; ; 加鍵
sbit Dec_Key = P3^4; ; 減鍵
sbit Start_Pause_Key = P3^5; ; 啟動暫停鍵
sbit Water_Level_Key = P3^0; ; 水位開關鍵
; 定義 18B20 引腳
sbit DS18B20 = P3^7;
; 定義狀態和參數變量
STATUS EQU 30H ; 工作狀態,0:待機,1:清洗,2:燙染
WORK_TIME EQU 31H ; 工作時間
MOTOR_TIME EQU 32H ; 電機旋轉時間
TEMP_SET EQU 33H ; 設置溫度
DRAIN_FLAG EQU 34H ; 燙染是否排水標志,0:不排水,1:排水
; 12864 命令
CLEAR_SCREEN EQU 00H
RETURN_HOME EQU 02H
ENTRY_MODE_SET EQU 04H
DISPLAY_CONTROL EQU 08H
CURSOR_SHIFT EQU 10H
FUNCTION_SET EQU 30H
SET_CGRAM_ADDR EQU 40H
SET_DDRAM_ADDR EQU 80H
; 串口相關定義
SMOD EQU 87H
REN EQU 99H
TI EQU 99H
RI EQU 98H
; 初始化 12864
INIT_12864:
SETB PSB ; 并行模式
CLR RST ; 復位
CALL DELAY
SETB RST ; 結束復位
MOV A, #FUNCTION_SET
CALL WRITE_COMMAND_12864
MOV A, #DISPLAY_CONTROL + 04H ; 顯示開,光標關
CALL WRITE_COMMAND_12864
MOV A, #ENTRY_MODE_SET + 02H ; 增量模式,不移動光標
CALL WRITE_COMMAND_12864
MOV A, #CLEAR_SCREEN
CALL WRITE_COMMAND_12864
RET
; 向 12864 寫命令
WRITE_COMMAND_12864:
CLR RS
CLR RW
MOV P0, A
SETB E
CALL DELAY
CLR E
RET
; 向 12864 寫數據
WRITE_DATA_12864:
SETB RS
CLR RW
MOV P0, A
SETB E
CALL DELAY
CLR E
RET
; 初始化串口
INIT_UART:
MOV SCON, #50H ; 工作方式 1,8 位異步,允許接收
MOV TMOD, #20H ; 定時器 1 工作方式 2
MOV TH1, #0FDH ; 波特率 9600
MOV TL1, #0FDH
SETB TR1
SETB EA
SETB ES
RET
; 讀取 18B20 溫度(簡化,實際需復雜時序)
READ_DS18B20:
; 此處省略 18B20 讀取時序代碼
RET
; 模擬 EEPROM 保存參數(實際可使用外部 EEPROM)
SAVE_PARAMETERS:
MOV DPTR, #PARAM_ADDR
MOV A, WORK_TIME
MOVX @DPTR, A
INC DPTR
MOV A, MOTOR_TIME
MOVX @DPTR, A
INC DPTR
MOV A, TEMP_SET
MOVX @DPTR, A
INC DPTR
MOV A, DRAIN_FLAG
MOVX @DPTR, A
RET
; 模擬 EEPROM 讀取參數(實際可使用外部 EEPROM)
LOAD_PARAMETERS:
MOV DPTR, #PARAM_ADDR
MOVX A, @DPTR
MOV WORK_TIME, A
INC DPTR
MOVX A, @DPTR
MOV MOTOR_TIME, A
INC DPTR
MOVX A, @DPTR
MOV TEMP_SET, A
INC DPTR
MOVX A, @DPTR
MOV DRAIN_FLAG, A
RET
; 按鍵掃描及處理
KEY_SCAN:
MOV A, P3
ANL A, #0FCH ; 屏蔽無關位
CJNE A, #0FCH, KEY_PRESSED
RET
KEY_PRESSED:
CALL DELAY
MOV A, P3
ANL A, #0FCH
CJNE A, #0FCH, KEY_HANDLING
RET
KEY_HANDLING:
JB Program_Key, CHECK_OTHER_KEYS
LCALL DELAY_LONG ; 檢測長按
MOV A, P3
ANL A, #0FCH
CJNE A, #0FCH, LONG_PRESS_PROGRAM_KEY
SHORT_PRESS_PROGRAM_KEY:
MOV A, STATUS
CJNE A, #0, CHECK_STATUS_1
MOV STATUS, #1 ; 切換到清洗
SJMP KEY_EXIT
CHECK_STATUS_1:
CJNE A, #1, CHECK_STATUS_2
MOV STATUS, #2 ; 切換到燙染
SJMP KEY_EXIT
CHECK_STATUS_2:
MOV STATUS, #0 ; 切換到待機
SJMP KEY_EXIT
LONG_PRESS_PROGRAM_KEY:
; 進入參數設置模式,此處省略具體設置代碼
SJMP KEY_EXIT
CHECK_OTHER_KEYS:
JB Inc_Key, CHECK_DEC_KEY
; 加鍵處理
MOV A, WORK_TIME
ADD A, #1
MOV WORK_TIME, A
SJMP KEY_EXIT
CHECK_DEC_KEY:
JB Dec_Key, CHECK_START_PAUSE_KEY
; 減鍵處理
MOV A, WORK_TIME
CLR C
SUBB A, #1
MOV WORK_TIME, A
SJMP KEY_EXIT
CHECK_START_PAUSE_KEY:
JB Start_Pause_Key, CHECK_WATER_LEVEL_KEY
; 啟動暫停鍵處理
SJMP KEY_EXIT
CHECK_WATER_LEVEL_KEY:
JB Water_Level_Key, KEY_EXIT
; 水位開關鍵處理
SJMP KEY_EXIT
KEY_EXIT:
RET
; 主程序
MAIN:
CALL INIT_12864
CALL INIT_UART
CALL LOAD_PARAMETERS
MAIN_LOOP:
CALL KEY_SCAN
MOV A, STATUS
CJNE A, #0, CHECK_WORK_STATUS
; 待機狀態
SJMP MAIN_LOOP
CHECK_WORK_STATUS:
CJNE A, #1, CHECK_TANG_RAN
; 清洗程序
SETB Water_Intake
CALL DELAY
CLR Water_Intake
SETB Motor_Forward
CALL DELAY
CLR Motor_Forward
SETB Water_Drain
CALL DELAY
CLR Water_Drain
SJMP MAIN_LOOP
CHECK_TANG_RAN:
; 燙染程序
SETB Water_Intake
CALL DELAY
CLR Water_Intake
SETB Heating_Relay
CALL DELAY
CLR Heating_Relay
SETB Motor_Forward
CALL DELAY
CLR Motor_Forward
JB DRAIN_FLAG, DRAIN_TANG_RAN
SJMP MAIN_LOOP
DRAIN_TANG_RAN:
SETB Water_Drain
CALL DELAY
CLR Water_Drain
SJMP MAIN_LOOP
; 簡單延時函數
DELAY:
MOV R5, #250
DELAY_LOOP1:
MOV R6, #250
DELAY_LOOP2:
MOV R7, #250
DELAY_LOOP3:
DJNZ R7, DELAY_LOOP3
DJNZ R6, DELAY_LOOP2
DJNZ R5, DELAY_LOOP1
RET
; 較長時間延時函數
DELAY_LONG:
MOV R4, #100
DELAY_LONG_LOOP1:
MOV R5, #250
DELAY_LONG_LOOP2:
MOV R6, #250
DELAY_LONG_LOOP3:
MOV R7, #250
DELAY_LONG_LOOP4:
DJNZ R7, DELAY_LONG_LOOP4
DJNZ R6, DELAY_LONG_LOOP3
DJNZ R5, DELAY_LONG_LOOP2
DJNZ R4, DELAY_LONG_LOOP1
RET
; 串口中斷服務程序
SERIAL_ISR:
PUSH ACC
PUSH PSW
JNB RI, SEND_DATA
; 接收數據處理
CLR RI
SJMP SERIAL_EXIT
SEND_DATA:
; 發送數據處理
CLR TI
SERIAL_EXIT:
POP PSW
POP ACC
RETI
; 模擬 EEPROM 地址
PARAM_ADDR EQU 4000H
END
|