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
|