标题: 单片机LCD1602串口可以显示,并口试过很多次都显示不了? [打印本页]

作者: 21111111111112    时间: 2023-10-2 01:01
标题: 单片机LCD1602串口可以显示,并口试过很多次都显示不了?

大佬们,看看小弟这个怎么搞呀,串口可以显示,并口试过很多次都显示不了这是我的代码:

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "string.h"

#define u8 unsigned char
#define u16 unsigned int
#define LCD12864_DATA P0
sbit LCD12864_PSB = P1^3;
sbit LCD12864_RS = P1^0;
sbit LCD12864_RW = P1^1;
sbit LCD12864_EN = P1^2;
//sbit LCD12864_RST = P5^4;


void Delay1us(u16 count)     //@11.0592MHz
{
    while(count-- != 0)
    {
        _nop_();
        _nop_();
        _nop_();
    }
}

u8 lcd12864_check_busy()//检测是否空闲
{
    u8 temp;
    LCD12864_DATA = 0xff;
    LCD12864_RS = 0;//并行的指令
    LCD12864_RW = 1;//并行读写选择信号,1为读,0为写
    LCD12864_EN = 1;//使能信号,1为有效
    Delay1us(1000);
    temp = LCD12864_DATA;
    LCD12864_EN = 0;
    return temp&0x80;
}

void lcd12864_write_command(u8 cmd)//写命令
{
    while(lcd12864_check_busy());
    LCD12864_RS = 0;
    LCD12864_RW = 0;
    LCD12864_EN = 1;
    Delay1us(1000);
    LCD12864_DATA = cmd;
    LCD12864_EN = 0;
}

void lcd12864_write_data(u8 dat)//写数据
{
    while(lcd12864_check_busy());
    LCD12864_RS = 1;
    LCD12864_RW = 0;
    LCD12864_EN = 1;
    Delay1us(1000);
    LCD12864_DATA = dat;
    LCD12864_EN = 0;
}

void lcd12864_init()
{
    LCD12864_PSB = 1;
    lcd12864_write_command(0x01);//1.清屏命令
    Delay1us(1000);
    lcd12864_write_command(0x02);//2.位址归位
    Delay1us(1000);
    lcd12864_write_command(0x0C);//4.显示状态 开
    Delay1us(1000);
    lcd12864_write_command(0x80);//8.设定DDRAM位址
    Delay1us(1000);
    lcd12864_write_command(0x34);//扩充功能设定——扩充指令集动作
    Delay1us(1000);
    lcd12864_write_command(0x30);//扩充功能设定——基本指令集动作
    Delay1us(1000);
}

void lcd12864_display_pos(u8 X , u8 Y)//选择第几行Y;第几列X(则加上X)
{
    u8 addr;
    if(Y == 0)
    {
        addr = 0x80;
    }
    if(Y == 1)
    {
        addr = 0x90;
    }
    if(Y == 2)
    {
        addr = 0x88;
    }
    if(Y == 3)
    {
        addr = 0x98;
    }
    addr = addr+X;
    lcd12864_write_command(addr);
}

void lcd12864_show_char(u8 X , u8 Y , char sign)//显示一个字符
{
    lcd12864_display_pos(X,Y);
    lcd12864_write_data(sign);
}

void lcd12864_show_string(u8 X , u8 Y , char string[])//显示一个字符串
{
    lcd12864_display_pos(X,Y);
    while(*string != '\0')
    {
        lcd12864_write_data(*string++);
    }
}

void main()
{
    P1M1 = 0; P1M0 = 0;
    //P5M0 = 0;
    lcd12864_init();
    lcd12864_show_string(0,0,"某某某某大学");
    lcd12864_show_string(0,1,"地球科学学院");
    lcd12864_show_string(0,2,"21环境01班");
    lcd12864_show_char(0,3,0x02);
    lcd12864_show_string(1,3,"小明呀");
    lcd12864_show_char(7,3,0x02);
    while(1);
}


作者: gongnn    时间: 2023-10-2 08:05
先查查液晶模块的对比度电位器,啥?没有电位器?
作者: a185980800    时间: 2023-10-2 09:08
人家串口可以显示跟硬件还有啥关系啊
作者: hy47566398    时间: 2023-10-2 10:53
1.去掉所有CheckBusy检查,可能会死循环导致开机黑屏
2.初始化等命令错误

include.zip

3.78 KB, 下载次数: 4

参考程序


作者: chenmingwu    时间: 2023-10-2 11:08
屏后面有个选择串、并的设置,看一下
作者: Ppp0011010    时间: 2023-10-2 11:30
线有没有漏接,多接的;我也有一块12864屏,按开发板的图接不行,后来按说明书重接就好了
作者: cnfloatleaf    时间: 2023-10-2 12:33
查查并口时序对不对?仔细看手册。
还有,我用的液晶有INTEL和MOTOROLA两种接口,请看看是不是接口选择不对?
作者: 21111111111112    时间: 2023-10-2 13:12
hy47566398 发表于 2023-10-2 10:53
1.去掉所有CheckBusy检查,可能会死循环导致开机黑屏
2.初始化等命令错误

哥,我屏蔽了,但还是没有显示。

572957ae46dd69bdee13ce87736149e.png (45.16 KB, 下载次数: 43)

572957ae46dd69bdee13ce87736149e.png

b528edd5aab14cf60c8686bb353aa9e.jpg (246.01 KB, 下载次数: 36)

b528edd5aab14cf60c8686bb353aa9e.jpg

作者: 21111111111112    时间: 2023-10-2 13:13
Ppp0011010 发表于 2023-10-2 11:30
线有没有漏接,多接的;我也有一块12864屏,按开发板的图接不行,后来按说明书重接就好了

需要接的都接上了,但是,还是没有显示,,我的代码应该没问题吧
作者: XLinliY.Zhang    时间: 2023-10-2 16:26
不要检测BUSY,PSB要根据手册选择相对应的电平
作者: jialishoushi    时间: 2023-10-3 01:41
可能这个屏默认串口  并口要改动下串并选择的那个电阻  你也可以量下PSB引脚电压  如果串是低电平 那么并就要高电平  排除这个就是程序了 或许延时不对  试试
作者: 大漠落日    时间: 2023-10-3 07:54
屏的模式要改一下才能用
作者: 213608    时间: 2023-10-3 14:02
在选择串并口时可以通过程序选择高低电平来完成。
第一种通过PSC口高低电平来选择
第二种也可以通过液晶屏背面 PCB 上面丝印 S 短接为串口,P 点短接为并口
作者: jlslwh    时间: 2023-10-3 18:07
第6脚DB0的状态是串口和并口的设置,应该检查设置一下。有的屏在电路板上有用焊锡连接的焊盘用于切换串口或并口




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1