将文件夹ZLG_GUI复制到TN810_SF102\src\oled_screen_display\sdk_project\oled_screen_display\application下,刷新
PAGE对应二维数组的下标0~3, COL对应二维i数组的下表0~127.
#include <stdint.h>
#include "./inc/gpio_controler.h"
#include "./inc/oled_display.h"
#include <machine/_default_types.h>
volatile static uint8_t oled_display_data[4][128];
void oled_set_pixel(uint8_t x,uint8_t y,uint8_t color)
{
uint8_t rcolor = oled_display_data[y>>3][x];
uint8_t offset = y&0x07;
if(color)
{
oled_display_data[y>>3][x] |= ((uint8_t)1<<offset);
}
else
{
oled_display_data[y>>3][x] &= (~((uint8_t)1<<offset));
}
}
uint8_t oled_get_pixel(uint8_t x,uint8_t y)
{
uint8_t rcolor = oled_display_data[y>>3][x];
uint8_t offset = y&0x07;
if(oled_display_data[y>>3][x] & ((uint8_t)1<<offset))
{
return 1;
}
else
{
return 0;
}
}
uint8_t oled_draw(void)
{
OLED_Frame(oled_display_data); //写入图像
}
uint8_t oled_fill(uint8_t color)
{
for(int i=0; i<4; i++)
{
for(int j=0; j<128; j++)
{
oled_display_data[j] = (color==0)?0:0xFF;
}
}
}
void anlogic_log_display(void)
{
int index=0;
#if 0
static int anlogic_log_data[512] = {0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0xf0, 0x0f, 0x80, 0x00, 0xf8, 0x0f, 0x80, 0x00, 0x78,
0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78,
0x03, 0xe0, 0x00, 0x78, 0x03, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0xf8,
0x00, 0x7f, 0xc7, 0xf0, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xc0,
0x00, 0x03, 0xff, 0x80, 0x07, 0x00, 0x18, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00,
0x07, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xf8,
0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00,
0x07, 0xc1, 0xe0, 0x00, 0x07, 0xc0, 0xff, 0x00, 0x07, 0x80, 0xff, 0xf0, 0x07, 0x80, 0xff, 0xf0,
0x07, 0x80, 0x7f, 0xf0, 0x07, 0x80, 0x71, 0xf8, 0x07, 0x80, 0x20, 0xf8, 0x07, 0x80, 0x20, 0x78,
0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x78, 0x03, 0xe0, 0x00, 0xf8,
0x03, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x7f, 0x87, 0xf0,
0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x03, 0xff, 0x80,
0x00, 0x00, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0xff, 0xf8, 0x00,
0x01, 0xff, 0xfe, 0x00, 0x03, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x07, 0xf0, 0x3f, 0xe0,
0x0f, 0xc0, 0x0f, 0xe0, 0x0f, 0x80, 0x03, 0xf0, 0x0f, 0x80, 0x01, 0xf0, 0x0f, 0x80, 0x00, 0xf8,
0x0f, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78,
0x03, 0xe0, 0x00, 0x78, 0x03, 0xf8, 0x00, 0xf8, 0x01, 0xfe, 0x01, 0xf8, 0x00, 0xff, 0x07, 0xf8,
0x00, 0x7f, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x07, 0xff, 0xc0,
0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78,
0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x78,
0x07, 0xf0, 0x00, 0x78, 0x07, 0xff, 0x80, 0x78, 0x07, 0xff, 0xf8, 0x78, 0x07, 0xff, 0xff, 0xf8,
0x07, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xf8,
0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00,
0x09, 0x24, 0x00, 0x00, 0x09, 0x24, 0x00, 0x00, 0x09, 0x24, 0x80, 0x00, 0x09, 0x24, 0x90, 0x00,
0x09, 0x24, 0x90, 0x00, 0x09, 0x24, 0x94, 0x00, 0x09, 0x24, 0x94, 0x80, 0x09, 0x24, 0x94, 0x90,
0x09, 0x24, 0x94, 0x80, 0x09, 0x24, 0x94, 0x30, 0x09, 0x24, 0x90, 0xf0, 0x09, 0x24, 0x93, 0xf0,
0x09, 0x24, 0x8f, 0xf0, 0x09, 0x24, 0x3f, 0xf0, 0x09, 0x24, 0xff, 0xe0, 0x09, 0x23, 0xff, 0x80,
0x09, 0x0f, 0xfe, 0x00, 0x08, 0x3f, 0xf8, 0x10, 0x08, 0xff, 0xe0, 0x70, 0x03, 0xff, 0x80, 0xf0,
0x07, 0xff, 0x00, 0xf0, 0x03, 0xff, 0xc0, 0xf0, 0x00, 0x7f, 0xf0, 0xf0, 0x00, 0x1f, 0xfc, 0xf0,
0x00, 0x07, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x1f, 0xf0,
0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x10};
//图像数据映射为SSD1306的显示数据
for(int j=0; j<128; j++)
{
for(int i=7; i>=0; i--)
{
if(i > 3)
{
oled_display_data[j] = anlogic_log_data[index];
index++;
}
else
oled_display_data[j] = 0x00;
}
}
#endif
//memset(oled_display_data,0,sizeof(oled_display_data));
OLED_Init(); //初始化
OLED_WriteC(0x2e);//关闭滚动
oled_fill(1);
oled_draw();
oled_fill(0);
oled_draw();
//OLED_Clear(0x00); //清屏
//OLED_Clear(0xFF);
//OLED_Frame(oled_display_data); //写入图像
//OLED_WriteC(0x27); //水平向左或者右滚动 26/27
//OLED_WriteC(0x00); //虚拟字节
//OLED_WriteC(0x00); //起始页 0
//OLED_WriteC(0x07); //滚动时间间隔
//OLED_WriteC(0x07); //终止页 7
//OLED_WriteC(0x00); //虚拟字节
//OLED_WriteC(0xff); //虚拟字节
//OLED_WriteC(0x2f); //开启滚动
}
void display_horizontal_scroll_enable()
{
OLED_WriteC(0x2f);//开启滚动
}
void display_horizontal_scroll_disable()
{
OLED_WriteC(0x2e);//关闭滚动
}
void oled_display_reset()
{
gpio_wr(4,0);
delay_1us(10000);
gpio_wr(4,1);
delay_1us(10000);
}
void OLED_WriteD(int dat)
{
IIC_START(); // 通信开始
IIC_Write(0X78); // 写从机地址'0111 100' 读写符号'0'
IIC_WaitACK();
IIC_Write(0X40); // 写数据 Co='0' C/D='100 0000'
IIC_WaitACK();
IIC_Write(dat); // 写入数据
IIC_WaitACK();
}
void OLED_WriteC(int cmd)
{
IIC_START(); // 通信开始
IIC_Write(0X78); // 写从机地址'0111 100' 读写符号'0'
IIC_WaitACK();
IIC_Write(0X00); // 写命令 Co='0' C/D='000 0000'
IIC_WaitACK();
IIC_Write(cmd); // 写入命令
IIC_WaitACK();
}
void OLED_WriteDat(int dat)
{
OLED_WriteD(dat);
IIC_STOP(); // 通信结束
}
void OLED_WriteCmd(int cmd)
{
OLED_WriteC(cmd);
IIC_STOP(); // 通信结束
}
void OLED_Init(void)
{
oled_display_reset();
OLED_WriteC(0XAE); // 关OLED显示
// 基础设置
OLED_WriteC(0XA4); // 输出GDDRAM内容
OLED_WriteC(0XA6); // 正常显示(1亮0灭)
OLED_WriteC(0X81); // 设置对比度
OLED_WriteC(0X7F); // 第127级对比度
// COM和SEG输出设置
OLED_WriteC(0XD3); // 设置垂直显示偏移(向上)
OLED_WriteC(0X00); // 偏移0行
OLED_WriteC(0X40); // 设置GDDRAM起始行 0
OLED_WriteC(0XA8); // 设置MUX数 (显示行数)
OLED_WriteC(0X3F); // MUX=63 (显示63行)
OLED_WriteC(0XA1); // 左右反置关(段重映射)
OLED_WriteC(0XC8); // 上下反置关(行重映射)
OLED_WriteC(0XDA); // 设置COM引脚配置
OLED_WriteC(0X02); // 序列COM配置,禁用左右反置
// 时钟设置
OLED_WriteC(0XD5); // 设置DCLK分频和OSC频率
OLED_WriteC(0X80); // 无分频,第8级OSC频率
// 开OLED
OLED_WriteC(0X8D); // 启用电荷泵
OLED_WriteC(0X14); // 启用电荷泵
OLED_WriteC(0XAF); // 开OLED显示
IIC_STOP();
}
void OLED_Clear(uint8_t color)
{
int i,j;
OLED_WriteC(0X20); // 设置GDDRAM模式
OLED_WriteC(0X00); // 水平寻址模式
OLED_WriteC(0X21); // 设置列起始和结束地址
OLED_WriteC(0X00); // 列起始地址 0
OLED_WriteC(0X7F); // 列终止地址 127
OLED_WriteC(0X22); // 设置页起始和结束地址
OLED_WriteC(0X04); // 页起始地址 0
OLED_WriteC(0X07); // 页终止地址 7
for(i=0; i<4; i++) // 写入一帧数据
{
for(j=0; j<128; j++)
{
OLED_WriteDat(color);
}
}
IIC_STOP();
}
void OLED_Frame(uint8_t* buffer)
{
int i,j;
int index = 0;
OLED_WriteC(0X20); // 设置GDDRAM模式
OLED_WriteC(0X00); // 水平寻址模式
OLED_WriteC(0X21); // 设置列起始和结束地址
OLED_WriteC(0X00); // 列起始地址 0
OLED_WriteC(0X7F); // 列终止地址 127
OLED_WriteC(0X22); // 设置页起始和结束地址
OLED_WriteC(0X04); // 页起始地址 0
OLED_WriteC(0X07); // 页终止地址 7
for(i=0; i<4; i++) // 写入一帧数据
{
for(j=0; j<128; j++)
{
OLED_WriteDat(buffer[index++]);
}
}
IIC_STOP();
}
//----------------------------------内部函数内容-----------------------------------//
void IIC_START(void)
{
SCL_Low(); // SCL拉低 防止可能出现的各种误动作
delay1us();
SDA_High(); // SDA拉高
SCL_High(); // SCL拉高 准备发出起始信号
delay1us();
SDA_Low(); // SDA拉低 发出起始信号
SCL_Low(); // SCL拉低 开始传输
}
void IIC_STOP(void)
{
SCL_Low(); // SCL拉低 防止可能出现的各种误动作
SDA_Low(); // SDA拉低
delay1us();
SCL_High(); // SCL拉高 准备发出结束信号
delay1us();
SDA_High(); // SDA拉高 发出结束信号
}
int IIC_WaitACK(void)
{
int s;
SCL_Low(); // 拉低SCL
delay1us();
SDA_High(); // 拉高SDA 主机释放总线
delay1us();
SCL_High(); // 拉高SCL
delay1us();
s = SDA_read(); // 采集SDA信号线状态
delay1us();
SCL_Low(); // 拉低SCL 结束询问ACK
if(s)
return 0; // 无应答(ACK)
else
return 1; // 有应答(ACK)
}
void IIC_Write(int dat)
{
int i;
int temp;
for(i=0; i<8; i++)
{
temp = dat & 0x80;
if(temp == 0x80)
SDA_High();
else
SDA_Low();
dat <<= 1; // 数据格式:高位在前
delay1us();
SCL_High(); // 拉高SCL 发送数据
delay1us();
SCL_Low(); // 拉低SCL 结束发送
}
}
void delay1us(void)
{
delay_1us(2);
}
void SCL_Low(void)
{
gpio_wr(0,0);
}
void SCL_High(void)
{
gpio_wr(0,1);
}
void SDA_Low(void)
{
gpio_wr(1,0);
}
void SDA_High(void)
{
// gpio_wr(1,1);
gpio_rd(1);
}
void LED_High(void)
{
gpio_wr(2,1);
}
void LED_Low(void)
{
gpio_wr(2,0);
}
int SDA_read(void)
{
int temp;
temp = gpio_rd(1);
if(temp == 1)
return 1;
else
return 0;
}
以上移植了比较小巧的gui-ZLGGUI,基于此就可以进行更多的ui交互开发,虽然iic驱动是使用io口模拟的,但是得益于RISC-V核本身还不错的性能所以刷屏效果还不错。