找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 283|回复: 3
收起左侧

各位大佬看看这个程序是啥问题,现在12864不显示,硬件没有问题 欢迎指导

[复制链接]
ID:604763 发表于 2025-4-15 10:55 | 显示全部楼层 |阅读模式
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



回复

使用道具 举报

ID:592807 发表于 2025-4-15 11:34 | 显示全部楼层
汇编语言啊,抱歉不会。用汇编写代码就要有自己解决问题的觉悟,汇编你操作的是寄存器地址,我们没空去看你单片机的的地址。
回复

使用道具 举报

ID:604763 发表于 2025-4-15 20:48 | 显示全部楼层
黄youhui 发表于 2025-4-15 11:34
汇编语言啊,抱歉不会。用汇编写代码就要有自己解决问题的觉悟,汇编你操作的是寄存器地址,我们没空去看你 ...

好的,我明天用c写个试试
回复

使用道具 举报

ID:275826 发表于 2025-4-16 10:16 | 显示全部楼层
两个子程序,写命令和写数据都错误,用串行显示,不是这样写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表