A. STM32F407单片机正常工作时,3.3V电压正常,维信诺OLED液晶工作电压也正常为3.3V,但是液晶不亮。什么原因
oled除了需要3.3v的数字电压以外,还需要一个10多伏的oeld驱动电压。你可以参看晶奥科技公司网站,有2.4寸、2.7寸、3.5寸、4.7寸等OLED模组。另外,oled不是液晶,不驱动像素点的话,他是不会发光的!
B. 怎样用oled12864画一个点我的是淘宝上常见的0.96‘的OLED。求51单片机的程序。
首先建个显存数组,将要显示的数据写入显存里,再将整个显存通过显示图片的方式写入5110的RAM里显示就OK啦!我的12864OLED也读不出内部的DDRAM,但我刚用这种方法给12864OLED打点了。
unsignedcharxdatamemory[128];//显存
//在随意坐标上画点
voidOLED_Drawpoint(unsignedcharx,unsignedchary,bitdat)
{//x,y,行列坐标;dat,1写,0擦除
unsignedcharrdata;
rdata=memory[y/8*128+x];//先将对应的字节数据从显存数组读出来
if(dat==1){
memory[y/8*128+x]=rdata|(0x01<<(y%8));//将读出来的数据加上添加点的数据
}
else{
memory[y/8*128+x]=rdata-(0x01<<(y%8));
}
}
OLED_DrawBMP(0,0,128,8,memory);//(显示图片函数)将显存的数据导入显示屏
C. stm8s003单片机写OLED的代码内存不够怎么办
stm8s008空间大小是8K 使用的时候会出现空间不够用的情况,这个时候要对软件进行一些设置,从而优化程序大小。1,修改优化等级,如下图所示,这样会优化掉无关的函数,将代码优化到最大程度2,如果代码有多个数组,而ram实际空间不够使用的时候,修改下面的参数,最大修改为0xfff。3,当二维数组定义完报错,无法容纳的时候,在数组前面加上NEAR可解决报错例如:NEAR u8 buff[10][10] = {********};4,当代码还是很多的时候就要从代码逻辑和代码本身一点点的扣 能用数组代替的尽量不用代码,能用u8的不用u16
D. stm32f103c8t6单片机最小系统的p13引脚可以驱动oled吗
STM32F103C8T6是3.3V的单片机,不能接5V的电压。 STM32F103C8T6 类别:集成电路(IC) 家庭:嵌入式-微控制器 芯体尺寸:32-位 速度:72MHz 外围设备:DMA,电机控制PWM,PWM,温度传感器 输入/输出数:37 程序存储器容量:64KB (64K x 8) 程序存储器类型:FLASH RAM容量:20K x 8 电压-电源(Vcc/Vdd):2 V ~ 3.6 V 数据转换器:A/D 10x12b 振荡器型:内部 工作温度:-40°C ~ 85°C 封装/外壳:48-LQFP 包装:托盘
E. 新手51单片机OLED使用请教
LED 屏的操作;与所用的处理器平台没有关系。 因为大家对 C51 单片机相对都比较熟悉;大学里基本上都学习过;在此我以 C51 的程序来作简单说明
F. 那位老大能提供一个stc单片机驱动oled屏(128*64)的keil c程序,要很简单的就行
#define LCM_RW P2_0 //定义引脚
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#i nclude <at89x51.h>
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code uctech[] = {"uctech"};
unsigned char code net[] = {"uctech.icpcn.com"};
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 5, uctech);
DisplayListChar(0, 0, net);
ReadDataLCM();//测试用句无意义
while(1);
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};