OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1932|回复: 5

同时点三个屏但只有一个屏能正常显示,求大神看看程序问题出在哪里

[复制链接]

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2023-8-29
在线时间
42 小时
发表于 2023-10-17 21:39:50 | 显示全部楼层 |阅读模式
20金钱
问题:用单片机控制同时点三个不同型号的屏,但只有一个正常显示。
三个屏的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 列调用对应的显示字符函数,对应的屏都能正常亮。


最佳答案

查看完整内容[请看2#楼]

你的图一直转圈,看不到。 但我再看了下你的程序,时序上还存在问题。 当 [/backcolor]t=Num%13;[/backcolor]时,Num的值可能变了不只一次,造成t不连续,或有重复。 试下这个:
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-10-17 21:39:51 | 显示全部楼层
rufong13 发表于 2023-10-18 11:53
按建议修改后现象依旧,还是第一个屏(0.42")亮,0.66" 和0.96"不显示。
用示波器测0.66" 和0.96"屏的CS ...

你的图一直转圈,看不到。
但我再看了下你的程序,时序上还存在问题。
t=Num%13;时,Num的值可能变了不只一次,造成t不连续,或有重复。

试下这个:
  1. //下拉 0.42"屏CS PC0
  2. #define SEL1        GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  3. //下拉 0.66"屏CS PC2
  4. #define SEL2        GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_0);GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  5. ////下拉 0.96"屏CS PB5
  6. #define SEL3        GPIO_SetBits(GPIOC,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_2);GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  7. int main(void)
  8. {      
  9.         u8 t,a=0;

  10.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级         LED_Init();                             //LED端口初始化
  11.         OLED_Init();                        //初始化GPIO
  12.         Timer_Init();      
  13.         //三个屏分别初始化
  14.         SEL1;
  15.         OLED_Init1();
  16.         SEL2;
  17.         OLED_Init2();
  18.         SEL3;
  19.         OLED_Init3();   
  20.         while(1)
  21.         {
  22.                 //------------------------画面1
  23.                 SEL1;
  24.                 OLED_ShowCHinese(32,2,0);//润
  25.                 OLED_ShowCHinese(48,2,1);//安
  26.                 OLED_ShowCHinese(64,2,2);//光
  27.                 OLED_ShowCHinese(80,2,3);//电
  28.                 SEL2;
  29.                 OLED_ShowCHinese2(32,2,0);//润
  30.                 OLED_ShowCHinese2(48,2,1);//安
  31.                 OLED_ShowCHinese2(64,2,2);//光
  32.                 OLED_ShowCHinese2(80,2,2);//光
  33.                 OLED_ShowCHinese2(96,2,3);//电
  34.                 SEL3;
  35.                 OLED_ShowCHinese3(32,3,0);//润
  36.                 OLED_ShowCHinese3(48,3,1);//安
  37.                 OLED_ShowCHinese3(64,3,2);//光
  38.                 OLED_ShowCHinese3(80,3,3);//电
  39.                 OLED_ShowCHinese3(96,3,3);//电
  40.                 OLED_ShowNum(30, 0, 1, 5,16);                 
  41.                 while(Num < 1500);//延时               
  42.                 Num=0;
  43.                 //------------------------画面2
  44.                 SEL1;
  45.                 OLED_ShowCHinese(32,2,0);//润
  46.                 OLED_ShowCHinese(48,2,1);//安
  47.                 OLED_ShowCHinese(64,2,3);//电
  48.                 OLED_ShowCHinese(80,2,3);//电                 
  49.                 SEL2;                        
  50.                 OLED_ShowCHinese2(32,2,0);//润
  51.                 OLED_ShowCHinese2(48,2,1);//安
  52.                 OLED_ShowCHinese2(64,2,2);//光
  53.                 OLED_ShowCHinese2(80,2,2);//光
  54.                 OLED_ShowCHinese2(96,2,3);//电                 
  55.                 SEL3;                        
  56.                 OLED_ShowCHinese3(32,2,0);//润
  57.                 OLED_ShowCHinese3(48,2,1);//安
  58.                 OLED_ShowCHinese3(64,2,2);//光
  59.                 OLED_ShowCHinese3(80,2,3);//电
  60.                 OLED_ShowCHinese3(96,2,3);//电
  61.                 OLED_ShowNum(30, 0, 2, 5,16);      
  62.                 while(Num < 1500);//延时               
  63.                 Num=0;
  64.         }
  65. }
复制代码


专治疑难杂症
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2023-8-29
在线时间
42 小时
 楼主| 发表于 2023-10-17 21:47:26 | 显示全部楼层
补传附件程序文件

3 OLED_STM32F103RC程序.rar

405.13 KB, 下载次数: 1

回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-10-18 09:49:25 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-10-18 09:51 编辑

注意运算符优先级,记不清就加括号;
& 和 && 是不一样的。
if (1<=t & t<2)
建议改为
if ((1<=t) &&  (t<2))
或者:
if(t==1)

或者改下整体结构:
if(t==0)
{

}
else if(t==1)
{

}
else if(t==2)
{

}

CS有三个,你却每次只操作两个,存在隐患,建议只将其中一路拉低,其余两路均置高。
专治疑难杂症
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2023-8-29
在线时间
42 小时
 楼主| 发表于 2023-10-18 11:53:46 | 显示全部楼层
本帖最后由 rufong13 于 2023-10-18 12:17 编辑
LcwSwust 发表于 2023-10-18 09:49
注意运算符优先级,记不清就加括号;
& 和 && 是不一样的。
if (1

按建议修改后现象依旧,还是第一个屏(0.42")亮,0.66" 和0.96"不显示。
用示波器测0.66" 和0.96"屏的CS,一直为高,像是操作对这两个屏没起到作用。
修改后部分代码:
   while(a==1)
         {
                 if (t<1)    //点0.42"         
                  {
                    GPIO_SetBits(GPIOB,GPIO_Pin_5);         //上拉 0.96"屏CS PB5
                    GPIO_SetBits(GPIOC,GPIO_Pin_2);         //上拉 0.66"屏CS PC2
                    GPIO_ResetBits(GPIOC,GPIO_Pin_0);       //下拉 0.42"屏CS PC0
                         
                    delay_us(5);
                    OLED_ShowCHinese(32,2,0);//润
                    OLED_ShowCHinese(48,2,1);//安
                    OLED_ShowCHinese(64,2,2);//光
                    OLED_ShowCHinese(80,2,3);//电
                  }
                  
                 else if ((1<=t) && (t<2))  //点0.66"
                  {
                     GPIO_SetBits(GPIOC,GPIO_Pin_0);         //上拉 0.42"屏CS PC0
                     GPIO_SetBits(GPIOB,GPIO_Pin_5);         //上拉 0.96"屏CS PB5
                     GPIO_ResetBits(GPIOC,GPIO_Pin_2);       //下拉 0.66"屏CS PC2
                         
                     delay_us(5);
                    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 ((2<=t) && (t<3))   //点0.96"
                    {
                    GPIO_SetBits(GPIOC,GPIO_Pin_0);         //上拉 0.42"屏CS PC0
                    GPIO_SetBits(GPIOC,GPIO_Pin_2);         //上拉 0.66"屏CS PC2
                    GPIO_ResetBits(GPIOB,GPIO_Pin_5);       //下拉 0.96"屏CS PB5
                         
                    delay_us(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);       
                   }
                 
                 else if (Num >= 1500)
                 {
                         Num=0;
                         a++;
                 }
                 
          }


回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2023-8-29
在线时间
42 小时
 楼主| 发表于 2023-10-18 13:46:22 | 显示全部楼层
LcwSwust 发表于 2023-10-17 21:39
你的图一直转圈,看不到。
但我再看了下你的程序,时序上还存在问题。
当 t=Num%13;[/back ...

牛,完美解决!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 15:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表