LCD屏及ST7571驱动芯片使用
2020-12-21 本文已影响0人
Mr_Michael
一、ST7571底层驱动
image4线串行通信,只写不读。
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{|}~