oled初始化问题
本帖最后由 midfieldmaestro 于 2019-5-17 15:11 编辑为什么oled初始化,程序就不正常了,原本执行的程序就不执行了void OLED_Init(void)
{
delay_ms(500);
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line addressSet Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
OLED_Clear();
OLED_Set_Pos(0,0);
}
你贴的这点代码对解决问题有用吗?
调试一下,看是程序死在哪了?还是程序还能跑,只是执行的不对?
如果程序还能跑的话,那么OLED的管脚可能与其它有冲突。如果进入硬件错误中断,那么这种情况比较复杂,得调试排查。 你这贴的代码无意义,其次你可以使用在线调试。。。看具体卡死到哪个地方? 哪里不执行了?你这样子没办法说明问题 你要把OLED_WR_Byte里面的内容、引脚的初始化等提供出来才行。
新手编程,比较乱,就是oled初始化后,tim14的pwm就无法调节占空比了 int main(void)
{
u16 led0pwmval=0,led0pwmval1=0;
u16 Autoreload=500-1;
float temp;
u8 dir=1;
u8 key; //保存键值
u8 i=0;
u16 adcx;
float adcpower;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);//初始化延时函数
LED_Init(); //初始化LED端口
KEY_Init(); //初始化与按键连接的硬件接口
IIC_Init(); //IIC初始化
//OLED_Init(); //初始化OLED
Adc_Init(); //初始化ADC
TIM14_PWM_Init(500-1,42-1); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
TIM13_PWM_Init(500-1,42-1);
TIM11_PWM_Init(500-1,84-1);
TIM10_PWM_Init(500-1,84-1);
while(1)
{
delay_ms(10);
key=KEY_Scan(0); //得到键值
// OLED_GN();
if(key)
{
do{ key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:i=1;break;
case KEY2_PRES:i=2;break;
case WKUP_PRES:dir=!dir;break;
case KEY1_PRES:
{ if(dir)
{
led0pwmval=led0pwmval+20;
if(led0pwmval<Autoreload)TIM_SetCompare1(TIM11,led0pwmval); //占空比增加
}
else if(!dir)
{
led0pwmval=led0pwmval-20;
if(led0pwmval>0)TIM_SetCompare1(TIM11,led0pwmval); //占空比减小
}
break;
}
}
}while(i==0);
do{key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:i=0; break;
case KEY2_PRES:i=2;break;
case WKUP_PRES:dir=!dir;break;
case KEY1_PRES:
{if(dir)
{
led0pwmval1=led0pwmval1+20;
if(led0pwmval1<Autoreload)TIM_SetCompare1(TIM14,led0pwmval1); //修改比较值,修改占空比
/////////////////////////////////////////////////////////////////////////////////////////////
adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
adcpower=(float)adcx*(30/4096);
// OLED_FloatNum(53,0, adcpower);
temp=(float)led0pwmval1*100/Autoreload;//占空比
// OLED_FloatNum(60,19, temp);
temp=(float)1000/Autoreload;//频率计算
// OLED_FloatNum(45,21, temp);
}
else if(!dir)
{
led0pwmval1=led0pwmval1-20;
if(led0pwmval1>0)TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比
/////////////////////////////////////////////////////////////////////////////////////////////
adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
adcpower=(float)adcx*(30/4096);
// OLED_FloatNum(53,0, adcpower);
temp=(float)led0pwmval1*100/Autoreload;//占空比
// OLED_FloatNum(60,19, temp);
temp=(float)1000/Autoreload;//频率计算
// OLED_FloatNum(45,21, temp);
}
break;
}
}
} while(i==1);
//////////////////////////////////////////////////////////////////////////////////////////
do{ key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:i=0;break;
case KEY2_PRES:i=1;break;
case WKUP_PRES: dir=!dir;break;
case KEY1_PRES:
if(dir)
{Autoreload=Autoreload+100;
if(Autoreload<=1000)TIM_SetAutoreload(TIM14,Autoreload); //修改重装载值,改变频率
/////////////////////////////////////////////////////////////////////////
adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
adcpower=(float)adcx*(30/4096);
// OLED_FloatNum(53,0, adcpower);
temp=(float)led0pwmval1*100/Autoreload;//占空比
// OLED_FloatNum(60,19, temp);
temp=(float)1000/Autoreload;//频率计算
// OLED_FloatNum(45,21, temp);
}
else if(!dir)
{Autoreload=Autoreload-10;
if(Autoreload>0)TIM_SetAutoreload(TIM14,Autoreload); //修改重装载值,修改频率
////////////////////////////////////////////////////////////////////////////////////
adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
adcpower=(float)adcx*(30/4096);
// OLED_FloatNum(53,0, adcpower);
temp=(float)led0pwmval1*100/Autoreload;//占空比
// OLED_FloatNum(60,19, temp);
temp=(float)1000/Autoreload;//频率计算
// OLED_FloatNum(45,21, temp);
////////////////////////////////////////////////////////////////////////
}
break;
}
} while(i==2);
}else delay_ms(10);
}
}
在线调试后发现卡在这里了,大神麻烦解释下这句注释掉,对显示有没有影响?
midfieldmaestro 发表于 2019-5-17 12:39
在线调试后发现卡在这里了,大神麻烦解释下这句注释掉,对显示有没有影响?
...
这个是I2C选择从地址后必需的操作,等待设备应答,没应答表示没从设备,或I2C总线有异常。
以前不是能显示的吗?如果卡在这的话,屏都无法显示。 toofree 发表于 2019-5-17 12:56
这个是I2C选择从地址后必需的操作,等待设备应答,没应答表示没从设备,或I2C总线有异常。
以前不是能显 ...
我屏蔽掉后,一切正常,谢谢大神耐心回答
页:
[1]
2