前言
今天在哔站看到一个用ch340点屏的视频,顿时感到好牛逼,于是想试一试
B站视频连接
CH340竟然能驱动OLED屏幕!!!
程序源码放在这里:程序免费下载
程序
// CH340_OLED.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <atlstr.h>
#include "oled.h"
#include "BMP.h"
HANDLE hCom;
CString strcomname="\\\\.\\COM33";
int ComIsOK;
void OpenComm(int nBaud, int nData, int nStop, int nCal) {//打开串口
hCom = CreateFile(strcomname, //串口号
GENERIC_READ | GENERIC_WRITE, //允许读或写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//重叠方式,用于异步通信
NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
printf("打开COM失败,串口不存在或已被占用!");
ComIsOK = false; return;
}
ComIsOK = true;
SetCommMask(hCom, EV_TXEMPTY | EV_RXCHAR); //设置事件掩码,暂时没用上
SetupComm(hCom, 1024, 1024); //设置输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts; //设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutConstant = 0;
TimeOuts.ReadTotalTimeoutMultiplier = 0; //设定写超时
TimeOuts.WriteTotalTimeoutConstant = 500;
TimeOuts.WriteTotalTimeoutMultiplier = 100;
if (SetCommTimeouts(hCom, &TimeOuts) == false)
{
CloseHandle(hCom);
ComIsOK = false; return;
} //串口属性配置
DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = nBaud; //dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize = nData; //dcb.ByteSize=8; //每个字节为8位
dcb.StopBits = nStop; //dcb.StopBits=ONESTOPBIT; //1位停止位
dcb.Parity = nCal; //dcb.Parity=NOPARITY; //无奇偶检验位
SetCommState(hCom, &dcb);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
if (SetCommState(hCom, &dcb) == false)
{
CloseHandle(hCom);
ComIsOK = false;
return;
}
return;
}
int main()
{
OpenComm(115200, 8, 1, NOPARITY);//打开串口
OLED_Init();//初始化
OLED_Clear();//清屏
OLED_Display_str(0, 0, "hello");
OLED_Display_str(0, 2, "生日快乐");
OLED_DrawBMP(0, 0, 128, 8, nBitmapDot);
std::cout << "Hello World!\n";
}
- oled.h
#ifndef __OLED_H
#define __OLED_H
#include <windows.h>
#define u8 unsigned char
#define uchar unsigned char
#define u32 unsigned int
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define OLED_MODE 0
extern HANDLE hCom;
#define OLED_SCLK_Clr() EscapeCommFunction(hCom, SETRTS)
#define OLED_SCLK_Set()EscapeCommFunction(hCom, CLRRTS)
#define OLED_SDIN_Clr() EscapeCommFunction(hCom, SETDTR)
#define OLED_SDIN_Set() EscapeCommFunction(hCom, CLRDTR)
//OLED模式设置
//0:4线串行模式
//1:并行8080模式
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
//-----------------OLED端口定义----------------
//void delay_ms(unsigned int ms);
//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);//开显示
void OLED_Display_Off(void);//关显示
void OLED_Init(void);//初始化
void OLED_Clear(void);//清屏
//void OLED_DrawPoint(u8 x,u8 y,u8 t);
//void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);//显示2个数字
void OLED_Set_Pos(unsigned char x, unsigned char y);//坐标设置
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);//显示图片
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
//void Picture();
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void IIC_Wait_Ack();
uchar OLED_Display_str(u8 x,u8 y,const char *no);//显示一个字符串
#endif