LCD屏及ST7571驱动芯片使用

2020-12-21  本文已影响0人  Mr_Michael

一、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

3)列地址

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

image image

设置列地址:

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

4)段控制

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

2.字符与程序编写关系

1)字摸生成软件

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

image

字体选择

image

生成点阵

image

默认配置

image

不同字体产生的字模点阵的大小是不同的,例如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{|}~

上一篇下一篇

猜你喜欢

热点阅读