找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 506|回复: 23
打印 上一主题 下一主题
收起左侧

LCD12864显示不清晰,是什么原因,小白求教

  [复制链接]
跳转到指定楼层
楼主

求教LCD12864如何调节 代码如下:.h文件》》

#ifndef __lcd12864_H_
#define __lcd12864_H_

#include "sys.h"

#define WRITE_CMD 0xF8 // 写命令
#define WRITE_DAT 0xFA // 写数据

// 接口(SID: PB1  SCLK: PB0)
#define SID PBout(9)
#define SCLK PBout(8)

void lcd_GPIO_init(void);
void Lcd_Init(void);

void SendByte(u8 Dbyte);
void LCD_Clear(void);
void LCD_Display_Words(uint8_t x, uint8_t y, uint8_t *str);
void LCD_Display_Picture(uint8_t *img);

void Lcd_WriteData(u8 Dat);
void Lcd_WriteCmd(u8 Cmd);

#endif



.c》》
#include "lcd.H"
#include "delay.h"

/*!
*  @brief      GPIO_init
*  @since      v1.0
*  @param  None
*/

void lcd_GPIO_init()
{

        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能PB,PE端口时钟

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8; // LED0-->PB.5 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           // 推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           // IO口速度为50MHz

        GPIO_Init(GPIOB, &GPIO_InitStructure); // 根据设定参数初始化GPIOB.5
        // GPIO_SetBits(GPIOB, GPIO_Pin_5);           // PB.5 输出高
        SID = 1;
        SCLK = 1;
}

/* 字符显示RAM地址    4行8列 */
u8 LCD_addr[4][8] = {
        {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87}, // 第一行
        {0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97}, // 第二行
        {0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, // 第三行
        {0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F}  // 第四行
};

/*!
*  @brief      LCD串行发送一个字节
*  @since      v1.0
*  @param  byte   写入字节
*  @author     Z小旋
*/
void SendByte(u8 byte)
{
        u8 i;
        for (i = 0; i < 8; i++)
        {
                if ((byte << i) & 0x80) // 0x80(1000 0000)  只会保留最高位
                {
                        SID = 1; // 引脚输出高电平,代表发送1
                }
                else
                {
                        SID = 0; // 引脚输出低电平,代表发送0
                }
                /*或
                        SID =        (Dbyte << i) & 0x80;

                        上面那样为了方便理解
                */
                SCLK = 0;         // 时钟线置低  允许SID变化
                delay_us(5); // 延时使数据写入
                SCLK = 1;         // 拉高时钟,让从机读SID
        }
}

/*!
*  @brief      LCD写指令
*  @since      v1.0
*  @param  Cmd   要写入的指令
*  @author     Z小旋
*/
void Lcd_WriteCmd(u8 Cmd)
{
        delay_ms(1);                  // 由于我们没有写LCD正忙的检测,所以直接延时1ms,使每次写入数据或指令间隔大于1ms 便可不用写忙状态检测
        SendByte(WRITE_CMD);  // 11111,RW(0),RS(0),0
        SendByte(0xf0 & Cmd); // 高四位
        SendByte(Cmd << 4);          // 低四位(先执行<<)
}

/*!
*  @brief      LCD写数据
*  @since      v1.0
*  @param  Dat   要写入的数据
*  @author     Z小旋
*/
void Lcd_WriteData(u8 Dat)
{
        delay_ms(1);
        SendByte(WRITE_DAT);  // 11111,RW(0),RS(1),0
        SendByte(0xf0 & Dat); // 高四位
        SendByte(Dat << 4);          // 低四位(先执行<<)
}
/*!
*  @brief      LCD初始化
*  @since      v1.0
*  @param  None
*  @author     Z小旋
*/
void Lcd_Init(void)
{
        delay_ms(50);                // 等待液晶自检(延时>40ms)
        Lcd_WriteCmd(0x30); // 功能设定:选择基本指令集
        delay_ms(1);                // 延时>100us
        Lcd_WriteCmd(0x30); // 功能设定:选择8bit数据流
        delay_ms(1);                // 延时>37us
        Lcd_WriteCmd(0x0c); // 开显示
        delay_ms(1);                // 延时>100us
        Lcd_WriteCmd(0x01); // 清除显示,并且设定地址指针为00H
        delay_ms(30);                // 延时>10ms
        Lcd_WriteCmd(0x06); // 进入设定点,初始化完成
}

/*!
*  @brief      显示字符或汉字
*  @since      v1.0
*  @param  x: row(0~3)
*  @param  y: line(0~7)
*  @param         str: 要显示的字符或汉字
*  @author     Z小旋
*/
void LCD_Display_Words(uint8_t x, uint8_t y, uint8_t *str)
{
        Lcd_WriteCmd(LCD_addr[x][y]); // 写初始光标位置
        while (*str > 0)
        {
                Lcd_WriteData(*str); // 写数据
                str++;
        }
}
/*!
*  @brief      显示图片
*  @since      v1.0
*  @param  *pic   图片地址
*  @author
*/
void LCD_Display_Picture(uint8_t *img)
{
        uint8_t x, y, i;
        Lcd_WriteCmd(0x34);                // 切换到扩充指令
        Lcd_WriteCmd(0x34);                // 关闭图形显示
        for (i = 0; i < 1; i++) // 上下屏写入
        {
                for (y = 0; y < 32; y++) // 垂直Y写32次
                {
                        for (x = 0; x < 8; x++) // 横向X写8次
                        {
                                Lcd_WriteCmd(0x80 + y);                // 行地址
                                Lcd_WriteCmd(0x80 + x + i); // 列地址
                                Lcd_WriteData(*img++);                // 写高位字节数据 D15-D8
                                Lcd_WriteData(*img++);                // 写低位字节数据 D7-D0
                        }
                }
        }
        Lcd_WriteCmd(0x36); // 打开图形显示
        Lcd_WriteCmd(0x30); // 切换回基本指令
}
/*!
*  @brief      清屏函数
*  @since      v1.0
*  @param  None
*  @author     Z小旋
*/
void LCD_Clear(void)
{
        Lcd_WriteCmd(0x01); // 清屏指令
        delay_ms(2);                // 延时以待液晶稳定【至少1.6ms】
}


main》》

#include "stm32f10x.h"
#include "sys.h"
#include "lcd.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"

int main(void)
{
    uart_init(115200);
    delay_init();
    lcd_GPIO_init();
    Lcd_Init();

    while (1) {
        /*汉字显示*/
        LCD_Display_Words(0, 0, "清时明月汉时关");
        LCD_Display_Words(1, 0, "万里长征人未还");
        LCD_Display_Words(2, 0, "但使龙城飞将在");
        LCD_Display_Words(3, 0, "不教胡马度阴山");
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:993578 发表于 2024-4-1 15:14 | 只看该作者
VO口接了一个电位器,调整了下,显示正常了,感谢各位
回复

使用道具 举报

板凳
ID:149451 发表于 2024-3-28 16:01 | 只看该作者
调节负压,使对比度满意为止。另背光如果暗,那得换背光板
回复

使用道具 举报

地板
ID:540100 发表于 2024-3-28 16:03 | 只看该作者
液晶屏对比度过高,在屏背部找一个金属电位器调节一下
回复

使用道具 举报

5#
ID:866313 发表于 2024-3-28 16:21 | 只看该作者
模组背面一般有一个调节液晶偏压的电位器,可以使用一字螺丝批缓慢调节、边调节边从液晶的可视角度(好像手册中有说明)观察,不同角度观察到的显示效果是不同的,实在不清楚询问一下模组的卖家最佳可视角度是什么再来调节偏压

回复

使用道具 举报

6#
ID:993578 发表于 2024-3-28 16:25 | 只看该作者
winwor 发表于 2024-3-28 16:03
液晶屏对比度过高,在屏背部找一个金属电位器调节一下

没有金属电位器,这个是需要买一个么
回复

使用道具 举报

7#
ID:993578 发表于 2024-3-28 16:27 | 只看该作者
winwor 发表于 2024-3-28 16:03
液晶屏对比度过高,在屏背部找一个金属电位器调节一下

背部有一个旋钮,我用螺丝刀转动,会清晰,但是旁边的两个电阻以及那个旋钮特别烫,我买的这个lcd12864 三十多元,是不是太便宜了,大概要多少钱的好用些?
回复

使用道具 举报

8#
ID:993578 发表于 2024-3-28 16:30 | 只看该作者
cedtek 发表于 2024-3-28 16:21
模组背面一般有一个调节液晶偏压的电位器,可以使用一字螺丝批缓慢调节、边调节边从液晶的可视角度(好像手 ...

我调节完之后,有变清晰,但是旁边的两个电阻以及这个旋钮特别烫,上电就烫,是不是lcd12864有问题,我tb上三十多元买的,另外这个一般多少钱的lcd12864好用呢
回复

使用道具 举报

9#
ID:993578 发表于 2024-3-28 16:31 | 只看该作者
背部有一个旋钮,我用螺丝刀转动,会清晰,但是旁边的两个电阻以及那个旋钮特别烫,这是什么原因呢,我买的这个lcd12864 三十多元,是不是太便宜了,大概要多少钱的好用些?
回复

使用道具 举报

10#
ID:88256 发表于 2024-3-28 16:34 | 只看该作者
a1592608215 发表于 2024-3-28 16:25
没有金属电位器,这个是需要买一个么

很多的液晶屏对比度调节需要外接,取一个10K的微调电阻,中心脚接液晶屏的VO引脚,两端直接并在液晶屏的电源上,让VO有0到5V的可调电压即可(有个别的液晶屏还需要负的电压)。
回复

使用道具 举报

11#
ID:161164 发表于 2024-3-28 16:45 | 只看该作者
a1592608215 发表于 2024-3-28 16:31
背部有一个旋钮,我用螺丝刀转动,会清晰,但是旁边的两个电阻以及那个旋钮特别烫,这是什么原因呢,我买的 ...

太贵了
回复

使用道具 举报

12#
ID:69038 发表于 2024-3-28 16:50 | 只看该作者
如要没有特定需求,不如买彩屏。分辩率更高,显示更好,能显示的内容也更多,价格还更低。
回复

使用道具 举报

受到警告 13#
ID:961114 发表于 2024-3-28 16:51 | 只看该作者
下图 P2.4控制显示外设 OLED12864复位,
左边的 SPI-OLED12864有拉出外界控制复位PIN, 正确思维,显示只管降成本,STC保证系统可靠就行
中间的 I2C-OLED12864有拉出外界控制复位PIN, 正确思维,显示只管降成本,STC保证系统可靠就行
右边的不将复位受控管脚引出的 I2C-OLED12864某一个宝应用工程师是太稚

1.jpg (67.29 KB, 下载次数: 17)

1.jpg
回复

使用道具 举报

14#
ID:993578 发表于 2024-3-28 16:57 | 只看该作者

一般买多少钱的?12864LCD带中文字库
回复

使用道具 举报

15#
ID:993578 发表于 2024-3-28 16:58 | 只看该作者
hhdsdy 发表于 2024-3-28 16:34
很多的液晶屏对比度调节需要外接,取一个10K的微调电阻,中心脚接液晶屏的VO引脚,两端直接并在液晶屏的 ...

我没有微调电阻,可以用普通电阻替代么
回复

使用道具 举报

16#
ID:993578 发表于 2024-3-28 17:07 | 只看该作者
zhuls 发表于 2024-3-28 16:50
如要没有特定需求,不如买彩屏。分辩率更高,显示更好,能显示的内容也更多,价格还更低。

大佬彩屏可以推荐个型号么,我是stm32f103c8t6
回复

使用道具 举报

17#
ID:195496 发表于 2024-3-28 17:52 | 只看该作者
对比度过重了,要调整一下
回复

使用道具 举报

18#
ID:149451 发表于 2024-3-29 07:19 | 只看该作者
a1592608215 发表于 2024-3-28 16:31
背部有一个旋钮,我用螺丝刀转动,会清晰,但是旁边的两个电阻以及那个旋钮特别烫,这是什么原因呢,我买的 ...

三十几还便宜,您可真豪横!也就几元的东西
回复

使用道具 举报

19#
ID:517951 发表于 2024-3-29 08:00 | 只看该作者
a1592608215 发表于 2024-3-28 16:58
我没有微调电阻,可以用普通电阻替代么

可以先用电位器调整负压, 调到合适的值以后, 再换用对应的普通电阻就可以了.
回复

使用道具 举报

20#
ID:1109356 发表于 2024-3-29 09:48 | 只看该作者
确实是对比度太高。
看接线是用SPI串口,也可以换成LCD屏(st7735驱动,SPI串口)或OLED屏 (1306驱动,IIC),都蛮便宜的(1元到十几元不等),可在程序中做初始化时设置对比度和亮度。
回复

使用道具 举报

21#
ID:1074206 发表于 2024-3-29 18:31 来自手机 | 只看该作者
调一下背光就可以解决
回复

使用道具 举报

22#
ID:883242 发表于 2024-3-29 19:33 | 只看该作者
发烫的话,应该是亮度调节,电流很大。对比度调节电位器电流非常微弱,不会发烫。
回复

使用道具 举报

23#
ID:106977 发表于 2024-3-31 18:51 | 只看该作者
现在4寸,分辨率800×480的TFT彩屏价格60元左右,还带触摸。你这个屏还花三十多元,想想是买便宜了还是买贵了?
回复

使用道具 举报

24#
ID:1034262 发表于 2024-3-31 19:18 | 只看该作者
调整偏压!调整偏压!调整偏压!说3遍。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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