#include "myoled.h"
#include "stdlib.h"
#include "oledfont.h"
#include "oledform.h"
u8 OLED_GRAM[144][8];
//反显函数
void OLED_ColorTurn(u8 i)
{
if(i==0)
{
OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
}
if(i==1)
{
OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
}
}
//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{
if(i==0)
{
OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
OLED_WR_Byte(0xA1,OLED_CMD);
}
if(i==1)
{
OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
OLED_WR_Byte(0xA0,OLED_CMD);
}
}
void OLED_WR_Byte(u8 dat,u8 cmd)
{
}
//开启OLED显示
void OLED_DisPlay_On(void)
{
OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵
OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕
}
//关闭OLED显示
void OLED_DisPlay_Off(void)
{
OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵
OLED_WR_Byte(0xAE,OLED_CMD);//关闭屏幕
}
//更新显存到OLED
void OLED_Refresh(void)
{
OledForm::oled->update();
}
//清屏函数
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8*8;i++)
{
for(n=0;n<128;n++)
{
//OLED_GRAM[n][i]=0;//清除所有数据
OLED_DrawPoint(n,i,0);
}
}
OLED_Refresh();//更新显示
}
//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
OledForm::oled->OLED_DrawPoint(x,y,t);
}
uint8_t OLED_GetPoint(u8 x,u8 y)
{
return OledForm::oled->OLED_GetPoint(x,y);
}
//画线
//x1,y1:起点坐标
//x2,y2:结束坐标
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x = x2-x1; //计算坐标增量
delta_y = y2-y1;
uRow = x1;//画线起点坐标
uCol = y1;
if(delta_x == 0 && delta_y == 0){return;}
if(delta_x == 0){//垂直线
if(delta_y > 0){
for(int i = y1; i <= y2; i++){
OLED_DrawPoint(uRow,i,mode);
}
}
if(delta_y < 0){
for(int i = y1; i >= y2; i--){
OLED_DrawPoint(uRow,i,mode);
}
}
}
if(delta_y == 0){//垂直线
if(delta_x > 0){
for(int i = x1; i <= x2; i++){
OLED_DrawPoint(i,uCol,mode);
}
}
if(delta_x < 0){
for(int i = x1; i >= x2; i--){
OLED_DrawPoint(i,uCol,mode);
}
}
}
return;
if(delta_x>0) {
incx=1;
}//设置单步方向
else if (delta_x == 0){
incx=0;
}//垂直线
else {
incx=-1;
delta_x =- delta_x;
}
if(delta_y>0){
incy=1;
}
else if (delta_y==0){
incy=0;
}//水平线
else {
incy=-1;
delta_y=-delta_x;
}
if(delta_x>delta_y){
distance=delta_x;
} //选取基本增量坐标轴
else {
distance=delta_y;
}
for(t=0;t<distance+1;t++)
{
OLED_DrawPoint(uRow,uCol,mode);//画点
xerr+=delta_x;
yerr+=delta_y;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x,u8 y,u8 r)
{
int a, b,num;
a = 0;
b = r;
while(2 * b * b >= r * r)
{
OLED_DrawPoint(x + a, y - b,1);
OLED_DrawPoint(x - a, y - b,1);
OLED_DrawPoint(x - a, y + b,1);
OLED_DrawPoint(x + a, y + b,1);
OLED_DrawPoint(x + b, y + a,1);
OLED_DrawPoint(x + b, y - a,1);
OLED_DrawPoint(x - b, y - a,1);
OLED_DrawPoint(x - b, y + a,1);
a++;
num = (a * a + b * b) - r*r;//计算画的点离圆心的距离
if(num > 0)
{
b--;
a--;
}
}
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
u8 i,m,temp,size2,chr1;
u8 x0=x,y0=y;
if(size1==8)size2=6;
else size2=(size1/8+((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数
chr1=chr-' '; //计算偏移后的值
for(i=0;i<size2;i++)
{
if(size1==8)
{temp=asc2_0806[chr1][i];} //调用0806字体
else if(size1==12)
{temp=asc2_1206[chr1][i];} //调用1206字体
else if(size1==16)
{temp=asc2_1608[chr1][i];} //调用1608字体
else if(size1==24)
{temp=asc2_2412[chr1][i];} //调用2412字体
else return;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((size1!=8)&&((x-x0)==size1/2))
{x=x0;y0=y0+8;}
y=y0;
}
}
//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
{
OLED_ShowChar(x,y,*chr,size1,mode);
if(size1==8)x+=6;
else x+=size1/2;
chr++;
}
}
//m^n
u32 OLED_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)
{
result*=m;
}
return result;
}
//显示数字
//x,y :起点坐标
//num :要显示的数字
//len :数字的位数
//size:字体大小
//mode:0,反色显示;1,正常显示
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
{
u8 t,temp,m=0;
if(size1==8)m=2;
for(t=0;t<len;t++)
{
temp=(num/OLED_Pow(10,len-t-1))%10;
if(temp==0)
{
OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode);
}
else
{
OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode);
}
}
}
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
{
u8 m,temp;
u8 x0=x,y0=y;
u16 i,size3=(size1/8+((size1%8)?1:0))*size1; //得到字体一个字符对应点阵集所占的字节数
for(i=0;i<size3;i++)
{
if(size1==16)
{temp=Hzk1[num][i];}//调用16*16字体
else if(size1==24)
{temp=Hzk2[num][i];}//调用24*24字体
else if(size1==32)
{temp=Hzk3[num][i];}//调用32*32字体
else if(size1==64)
{temp=Hzk4[num][i];}//调用64*64字体
else return;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((x-x0)==size1)
{x=x0;y0=y0+8;}
y=y0;
}
}
//num 显示汉字的个数
//space 每一遍显示的间隔
//mode:0,反色显示;1,正常显示
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode)
{
u8 i,n,t=0,m=0,r;
while(1)
{
if(m==0)
{
OLED_ShowChinese(128,24,t,16,mode); //写入一个汉字保存在OLED_GRAM[][]数组中
t++;
}
if(t==num)
{
for(r=0;r<16*space;r++) //显示间隔
{
for(i=1;i<144;i++)
{
for(n=0;n<8;n++)
{
OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
}
}
OLED_Refresh();
}
t=0;
}
m++;
if(m==16){m=0;}
for(i=1;i<144;i++) //实现左移
{
for(n=0;n<8;n++)
{
OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
}
}
OLED_Refresh();
}
}
//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)
{
u16 j=0;
u8 i,n,temp,m;
u8 x0=x,y0=y;
sizey=sizey/8+((sizey%8)?1:0);
for(n=0;n<sizey;n++)
{
for(i=0;i<sizex;i++)
{
temp=BMP[j];
j++;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((x-x0)==sizex)
{
x=x0;
y0=y0+8;
}
y=y0;
}
}
}
//OLED的初始化
void OLED_Init(void)
{
}
Qt C++模拟OLED屏
需积分: 0 95 浏览量
更新于2024-06-04
收藏 36KB ZIP 举报
【Qt C++模拟OLED屏】是一个项目,旨在利用Qt框架在Windows环境下创建一个软件模拟器,以模拟128x64像素分辨率的OLED显示屏。Qt是一个跨平台的应用程序开发框架,广泛用于GUI(图形用户界面)设计,同时也支持非GUI程序。通过这个模拟器,开发者可以在个人电脑上预览和测试OLED屏幕上的显示效果,然后再将其代码移植到单片机等嵌入式设备上。
让我们深入理解Qt框架。Qt提供了一套丰富的库,包括图形视图、网络编程、数据库访问、XML处理等功能。它的C++ API设计简洁且强大,使得开发者能够轻松构建复杂的用户界面。在本项目中,Qt的QGraphicsView和QGraphicsItem类将用于创建和管理显示的像素。
在模拟OLED屏的过程中,开发者需要定义一个自定义的QGraphicsItem子类来表示每个像素。这个类应该包含必要的数据结构来存储像素的颜色状态,并提供绘图方法以在QGraphicsView上绘制。为了实现128x64像素的分辨率,你需要创建一个128x64的二维数组,代表屏幕的每个像素。
接下来,考虑事件处理。在Qt中,可以使用信号和槽机制来响应用户交互,比如鼠标点击。当用户在模拟屏幕上点击时,可以通过查询点击位置并更新相应的像素颜色来模拟屏幕选中或修改状态。此外,也可以添加滚动条或其他控件来方便地移动和缩放屏幕视图。
为了实现从Windows桌面应用到单片机的移植,你需要确保代码是基于标准C++编写的,避免使用特定于Qt的API。这可能涉及到重写某些功能,比如使用原始的I/O操作而不是Qt的网络或文件系统类。同时,考虑到单片机的资源限制,可能需要优化代码,减少内存占用和计算复杂性。
在【压缩包子文件的文件名称列表】中的"OledEmulator"可能包含了该项目的源代码、编译脚本、资源文件等。在这些文件中,你可以找到实现上述功能的具体代码,例如主窗口类、像素类、事件处理函数等。通过阅读和分析这些代码,你可以更深入地了解如何使用Qt C++来模拟OLED显示屏,并将其应用于实际的嵌入式系统开发中。
总结来说,"Qt C++模拟OLED屏"项目利用了Qt框架的强大功能,为Windows环境下的OLED显示测试提供了一个便捷的平台。通过学习和实践这个项目,开发者可以提升在图形界面设计、事件处理以及代码移植方面的技能,这对嵌入式系统开发具有重要意义。
weixin_40562054
- 粉丝: 6
- 资源: 1
最新资源
- 三相逆变器 下垂控制 参数: 直流侧电压 800V 交流侧电压 220V 开关频率10kHz 模拟一次调频工况,0.5s增加有功,无功负载,通过下垂控制,系统降低频率增发无功,1s后恢复正常进入原始稳
- 电力电子技术中使用UCC24624同步整流器控制器优化LLC谐振转换器效率的方法与应用
- 六自由度协作机械臂UR5,simulink simscape三次多项式轨迹规划仿真,有动画,可以得到角度,力矩图,也可以添加角速度,角加速度曲线图
- 螺旋藻过滤机sw21可编辑全套技术资料100%好用.zip
- 流体酸碱检测设备sw16可编辑全套技术资料100%好用.zip
- ssm-vue-毕业论文管理系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- ssm-vue-毕业生就业信息统计系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- ssm-vue-德云社票务系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- 基于fpga与matlab的超声多普勒频移解调应用 ①DDS IP核生成2Mhz和(2Mhz+1Khz)的sin频率信号; ②乘法ip核实现2Mhz和(2Mhz+1Khz)的sin频率信号混频处理;
- Python毕业设计-基于Spark的电影推荐系统(前后端+爬虫)源码+文档
- ssm-vue-高校实验室管理系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- ssm-vue-高校共享单车管理系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- ssm-vue-斗车交易系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip
- 松下FP-XH的的双PLC的10轴程序,表格定位 用于摆盘的 ,平稳运行一年,PC-LINK通信,程序分输出与调试,报警与通信,启动与复位等分开书写,带维纶通触摸屏,思路清晰,一看易懂,是敩习松下p
- Python毕业设计-基于Django+Spark的电影推荐系统(前后端+爬虫)源码+文档
- 基于Python+flask的豆瓣音乐数据聚类分析可视化