美文网首页
LCD屏及ST7571驱动芯片使用

LCD屏及ST7571驱动芯片使用

作者: Mr_Michael | 来源:发表于2020-12-21 11:06 被阅读0次

    一、ST7571底层驱动

    image

    4线串行通信,只写不读。

    1.写命令操作

    void Write_Command(uint8_t cmd)
    {
        uint8_t i;
        
        LINE4_CSB_L();
        LINE4_SCLK_H();
        LINE4_SID_H();
        LINE4_A0_L();//дÃüÁî
        LINE4_delay(30);
    
        for(i=8;i>0;i--)
        {
            if(cmd&0x80)
            {
                LINE4_SID_H();
            }
            else{
                LINE4_SID_L();
            }
            cmd<<=1;
            LINE4_delay(1);
            LINE4_SCLK_L();
            LINE4_delay(2);
            LINE4_SCLK_H();
            LINE4_delay(1);
        }
        LINE4_SID_H();
        LINE4_CSB_H();
        LINE4_delay(30);
    }
    

    2.写数据操作

    void Write_Data(uint8_t data)
    {
        uint8_t i;
        
        LINE4_CSB_L();
        LINE4_SCLK_H();
        LINE4_SID_H();
        LINE4_A0_H();//дÊý¾Ý
        LINE4_delay(20);
        
        for(i=8;i>0;i--)
        {
            if(data&0x80)
            {
                LINE4_SID_H();
            }
            else{
                LINE4_SID_L();
            }
            data<<=1;
            LINE4_delay(1);
            LINE4_SCLK_L();
            LINE4_delay(2);
            LINE4_SCLK_H();
            LINE4_delay(1);
        }
        LINE4_SID_H();
        LINE4_CSB_H();
        LINE4_delay(20);
    }
    

    二、命令操作

    1.指令表

    image image

    每一项指令对应唯一的一个字节,所以直接写该命令即可。

    2.初始化函数

    void Initial_ST7571(void)
    {
        LINE4_RST_L();
        nrf_delay_ms(10);
        LINE4_RST_H();
        nrf_delay_ms(100);
        Write_Command(0xAE);//显示关闭
        Write_Command(0x38);// MODE SET
        Write_Command(0xB8);// FR = 1011 => 85Hz的   BE [1:0] = 1,0 =>增压器效率3级
        Write_Command(0xA1);// ADC选择,ADC = 1 =>相反的方向
        Write_Command(0xC8);// SHL选择,SHL = 1 =>相反的方向
        Write_Command(0x44);//设置初始COM0寄存器
        Write_Command(0x00);
        Write_Command(0x40);//设置初始显示行寄存器
        Write_Command(0x00);
    
        Write_Command(0xAB);// OSC ON
        Write_Command(0x67);// DC-DC升压,8倍升压电路
        Write_Command(0x25);//选择调节器寄存器(1+(RA + RB))
        Write_Command(0x81);//设置参考电压
        Write_Command(0x23);// EV = 35 => Vop的= 10.556V
        Write_Command(0x54);//设置LCD偏置=九分之一V0
        Write_Command(0xF3);//分离偏压省电模式
        Write_Command(0x04);
        
        Write_Command(0xA6);    //颜色正显
        Write_Command(0xC0);    //行地址从上到下行扫描
        Write_Command(0xA0);    //列地址从左到右扫描
    
        Write_Command(0x93);//设置FRC和PWM模式(4FRC&15PWM)
        Write_Command(0x2C);//功率控制,VC:ON VR:OFF VF:OFF
        nrf_delay_ms(100);
        Write_Command(0x2E);//功率控制,VC:ON VR:ON VF:OFF
        nrf_delay_ms(100);
        Write_Command(0x2F);//功率控制,VC:ON VR:ON VF:ON
        nrf_delay_ms(10);
        Write_Command(0xAF);//显示ON
    
    }
    

    三、LCD显示字符

    1.DDRAM寄存器配置

    字符的显示是根据DDRRAM存储的内容决定的。

    1)行地址

    对应第一行的线地址COM0,通过重复设置行地址,就可以实现屏幕滚动和页面切换不改变片内RAM的内容。

    2)页地址

    当前点阵数量:128*128,每页8Bytes,所以分为16页。

    image
    • 设置页地址:Write_Command(0xB0 + Page);

    3)列地址

    当前点阵数量:128*128,所以一个128列。

    image image

    设置列地址:

    • Write_Command(((Column >> 4) & 0x0f) + 0x10);列地址MSB

    • Write_Command(Column & 0x0f);//列地址LSB

    当向点写入数据,列地址会自动递增1

    4)段控制

    页地址和列地址当前写入点的位置

    2.字符与程序编写关系

    1)字摸生成软件

    在文字输入区输入文字,按下CTRL+ENTER键输入文字。

    image

    字体选择

    image

    生成点阵

    image

    默认配置

    image
    • 横向取模:宽度需要为8的倍数,如宽x高=16x32,则每两个bytes为一行(16个点),一共32行。(Z字走法)
    • 纵向取模:高度需要为8的倍数,如宽x高=16x32,则每四个bytes为一列(32个点),一共16列。(倒N字走法)

    不同字体产生的字模点阵的大小是不同的,例如1332和1024,不同的点阵大小,不同的取模方式,程序编写的方式也会不同。

    如:13*32,13对应列的数量,32对应页的长度,即4页。

    // 如:13*32,13对应列的数量,32对应页的长度,即4页。
    /*--  文字:  1  --*/
    /*--  宋体16;  此字体下对应的点阵为:宽x高=13x26   --*/
    /*--  高度不是8的倍数,现调整为:宽度x高度=13x32  --*/
    0x00,0x00,0x80,0x80,0x80,0xC0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x3F,
    0x3F,0x3F,0x30,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,
    
    /*--  文字:  1  --*/
    /*--  楷体12;  此字体下对应的点阵为:宽x高=10x20   --*/
    /*--  高度不是8的倍数,现调整为:宽度x高度=10x24  --*/
    0x00, 0xC0, 0xE0, 0x70, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
    0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
    

    3.程序编写

    1)字模点阵定义

    const uint8_t testfont2[][52] =
    {
    /*--  文字:  1  --*/
    /*--  宋体16;  此字体下对应的点阵为:宽x高=13x26   --*/
    /*--  高度不是8的倍数,现调整为:宽度x高度=13x32  --*/
    0x00,0x00,0x80,0x80,0x80,0xC0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x3F,
    0x3F,0x3F,0x30,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,
    
    /*--  文字:  2  --*/
    /*--  宋体16;  此字体下对应的点阵为:宽x高=13x26   --*/
    /*--  高度不是8的倍数,现调整为:宽度x高度=13x32  --*/
    0x00,0x80,0xC0,0xE0,0x60,0x20,0x20,0x60,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x07,0x07,
    0x07,0x06,0x80,0xC0,0xE0,0x78,0x3F,0x1F,0x07,0x00,0x00,0x38,0x3C,0x3E,0x33,0x31,
    0x31,0x30,0x30,0x38,0x3E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,
    
    /*--  文字:  3  --*/
    /*--  宋体16;  此字体下对应的点阵为:宽x高=13x26   --*/
    /*--  高度不是8的倍数,现调整为:宽度x高度=13x32  --*/
    0x00,0x80,0xC0,0xE0,0x60,0x20,0x20,0x60,0xE0,0xC0,0xC0,0x00,0x00,0x00,0x03,0x03,
    0x03,0x13,0x10,0x10,0x38,0x7F,0xEF,0xE7,0x80,0x00,0x00,0x0E,0x1E,0x3E,0x34,0x20,
    0x20,0x30,0x38,0x1F,0x1F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,
    
    };
    

    2)设置页地址和列地址

    /* *  设置页与列的位置 *  决定点阵显示的起始位置 */
    void LCD_Address(uint8_t page, uint8_t column)
    {    
        uint8_t Page, Column;   
        Page = page - 1;    
        Column = column;    
        Write_Command(0xB0 + Page);  
        Write_Command(((Column >> 4) & 0x0f) + 0x10); //列地址MSB    
        Write_Command(Column & 0x0f); //列地址LSB
    }
    

    3)清屏

    void Clean_Screen(void)
    {    
        uint8_t i, j;    
        for(j = 0; j < 16; j++)    
        {        
            LCD_Address(j + 1, 0);        
            for(i = 0; i < 128; i++)       
            {           
                Write_Data(0x00);//一个点要连续写入两次相同数据            
                Write_Data(0x00);        
            }    
        }
    }
    

    4)显示字符串

    void display_string_13x32(uint8_t page, uint8_t column, uint8_t *text)
    {
        uint8_t i = 0, j, k, n;
    
        while(text[i] > 0x00)
        {
            if((text[i] >= 0x20) && (text[i] <= 0x7e))
            {
                j = text[i] - 0x20;
                for(n = 0; n < 4; n++) //4页即32bytes
                {
                    LCD_Address(page + n, column);
                    for(k = 0; k < 13; k++)//13列即13bytes
                    {
                        Write_Data(testfont2[i][k + 13 * n]);//一个点要连续写入两次相同数据
                        Write_Data(testfont2[i][k + 13 * n]);
                    }
                }
                i++;
                column += 13;
            }
            else
                i++;
            if(column > 127)
            {
                column = 0;
                page += 2;
            }
        }
    }
    

    4.可显字符

    https://blog.csdn.net/Solo_two/article/details/51577076

    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~

    相关文章

      网友评论

          本文标题:LCD屏及ST7571驱动芯片使用

          本文链接:https://www.haomeiwen.com/subject/udkrnktx.html