问题:用单片机控制同时点三个不同型号的屏,但只有一个正常显示。
三个屏的sck,sda和a0 串接在一起,只有CS单独分析了IO,原理图见附原理图。
程序:
用定时器每2ms产生一个计数 Num:
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStructure.TIM_Period = 20 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
Num ++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
主程序里用 Num%13的值决定向那个屏送数据(值大于3时空闲不送据),每个屏送数据的时间为2ms,一直循环:
int main(void)
{
u8 t,a=0;
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化
OLED_Init(); //初始化GPIO
Timer_Init();
// OLED_Init1(); //初始化OLED 0.42"
// OLED_Init2(); //初始化OLED 0.66"
// OLED_Init3(); //初始化OLED 0.96"
while(1)
{
t=Num%13;
// // OLED初始化
if(a==0)
{
if (t<1) //初始化OLED 0.42"
{
GPIO_SetBits(GPIOB,GPIO_Pin_5); //上拉 0.96"屏CS PB5
GPIO_ResetBits(GPIOC,GPIO_Pin_0); //下拉 0.42"屏CS PC0
OLED_Init1();
}
if (1<=t & t<2) //初始化OLED 0.66"
{
GPIO_SetBits(GPIOC,GPIO_Pin_0); //上拉 0.42"屏CS PC0
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //下拉 0.66"屏CS PC2
OLED_Init2();
}
if (2<=t & t<3) //初始化OLED 0.96"
{
GPIO_SetBits(GPIOC,GPIO_Pin_2); //上拉 0.66"屏CS PC2
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //下拉 0.96"屏CS PB5
OLED_Init2();
}
a++;
}
// //显示画面1
while(a==1)
{
if (t<1) //0.42"
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
OLED_ShowCHinese(32,2,0);//润
OLED_ShowCHinese(48,2,1);//安
OLED_ShowCHinese(64,2,2);//光
OLED_ShowCHinese(80,2,3);//电
}
if (1<=t & t<=2) //0.66"
{
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
OLED_ShowCHinese2(32,2,0);//润
OLED_ShowCHinese2(48,2,1);//安
OLED_ShowCHinese2(64,2,2);//光
OLED_ShowCHinese2(80,2,2);//光
OLED_ShowCHinese2(96,2,3);//电
}
else if (3<=t & t<=3) //0.96"
{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
OLED_ShowCHinese3(32,3,0);//润
OLED_ShowCHinese3(48,3,1);//安
OLED_ShowCHinese3(64,3,2);//光
OLED_ShowCHinese3(80,3,3);//电
OLED_ShowCHinese3(96,3,3);//电
OLED_ShowNum(30, 0, 1, 5,16);
}
if (Num >= 1500)
{
Num=0;
a++;
}
}
// //显示画面2
while(a==2)
{
if (t<1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
OLED_ShowCHinese(32,2,0);//润
OLED_ShowCHinese(48,2,1);//安
OLED_ShowCHinese(64,2,3);//电
OLED_ShowCHinese(80,2,3);//电
}
if (1<=t & t<2)
{
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
OLED_ShowCHinese2(32,2,0);//润
OLED_ShowCHinese2(48,2,1);//安
OLED_ShowCHinese2(64,2,2);//光
OLED_ShowCHinese2(80,2,2);//光
OLED_ShowCHinese2(96,2,3);//电
}
else if (3<=t & t<3)
{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
OLED_ShowCHinese3(32,2,0);//润
OLED_ShowCHinese3(48,2,1);//安
OLED_ShowCHinese3(64,2,2);//光
OLED_ShowCHinese3(80,2,3);//电
OLED_ShowCHinese3(96,2,3);//电
OLED_ShowNum(30, 0, 2, 5,16);
}
if (Num >= 1500)
{
Num=0;
a=0;
}
}
// OLED_ShowCHinese3(32,3,0);//润
// OLED_ShowCHinese3(48,3,1);//安
// OLED_ShowCHinese3(64,3,2);//光
// OLED_ShowCHinese3(80,3,3);//电
// delay_ms(1500);
// OLED_ShowString(16,2,"mcudev.taobao.com");
// OLED_ShowString(16,6,"ASCII:");
// OLED_ShowString(63,6,"CODE:");
// OLED_ShowChar(48,6,t);//显示ASCII字符
// t++;
// if(t>'~')t=' ';
// OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值
// delay_ms(1500);
//
// OLED_Clear();
// OLED_DrawBMP(0,0,128,8,BMP1); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
// delay_ms(1500);
}
}
以上就是点屏的程序,找了很久也没找到原因,求大神帮看看问题出在那。
单个点屏都没有问题:
调用第35 -37 列的初始化,在第 171 - 174 列调用对应的显示字符函数,对应的屏都能正常亮。
|