定时器中断Timer里控制LCD显示,会有杂点出现在LCD上

2019-10-11 15:55发布

1. main函数里执行LCD_Clear(LIGHTBLUE),将LCD画成LIGHTBLUE颜 {MOD};
2. 按照定时器中断例子,main函数初始化Tim3: Timerx_Init(5000,7199);
3. 中断处理函数 void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&0X0001)//溢出中断
 {
   LCD_ShowString(40, 40, "Tim3");                           
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位     
}

4. main函数
int main(void)
{
 Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
  LCD_Init();
  LCD_Clear(LIGHTBLUE);
 Timerx_Init(5000,7199);
 while(1)
 {  
LCD_ShowString(20, 20, "Main");
 }
}

现在出现的状况是Timer里显示的"Tim3"字串周围有很多杂点。
这是什么原因啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
正点原子
1楼-- · 2019-10-11 18:50
回复【楼主位】smithlin:
---------------------------------
这个你要一步步看看了.
单独在main里面调用LCD_ShowString(40, 40, "Tim3");                           
会有杂点么?
smithlin
2楼-- · 2019-10-11 23:03
回复【2楼】正点原子:
---------------------------------
1. 单独在main里面调用LCD_ShowString(40, 40, "Tim3");                            
会有杂点么?
***单独调用不会有杂点

2. 如果main里的LCD_ShowString(20, 20, "Main");不是while(1)循环,也不会有杂点

3. 我的理解:main里的LCD_ShowString(20, 20, "Main");与Tim3的LCD_ShowString(40, 40, "Tim3"); 是属于不同的时钟线程。
如果两者同时drawpiont画同一个点,可能有问题。但是我现在画的一个是从(20,20)开始,另一个是(40,40)开始,一定不会有重合的点啊。为什么会有状况呢?

4. 另外,杂点出现的位置是有规律的。LCD_ShowString(40, 40, "Tim3"); 是从(40,40)开始,高16个点,宽8*4=32个点,画的是(40,40)到(72,56)的区域。
我发现杂点都是出现在(72, Y),(X, 56)的两条直线上。真是奇怪啊。
我看了LCD_DrawPoint的函数内容,是一个点一个点画的,怎么会影响的其他的位置的?


正点原子
3楼-- · 2019-10-12 00:37
回复【3楼】smithlin:
---------------------------------
在while(1)里面加入delay_ms(10);即可.
smithlin
4楼-- · 2019-10-12 06:26
回复【4楼】正点原子:
---------------------------------
while(1)里面加入delay_ms(10),还是不行啊 

我这边试验下来的结果: 在(72, Y)有条白线 在(X, 56)上有白点。。。
正点原子
5楼-- · 2019-10-12 11:19
 精彩回答 2  元偷偷看……
smithlin
6楼-- · 2019-10-12 16:54
原子哥,我这边还是不行啊,
1。 main里面
 while(1)  
{      
TIM3->CR1&=~(0x0001);    //关闭定时器3 
LCD_ShowString(20,20,"Main"); 
TIM3->CR1|=0x0001;          //使能定时器3 
delay_ms(10);      

情况依旧。

2. 我尝试修改一下LCD_ShowString函数,保证LCD_ShowString还没有返回时,不能同时调用
LCD_ShowChar()

u8 gLCDworking=0;
void LCD_ShowString(u16 x,u16 y,const u8 *p)
{   
while(gLCDworking)
{
delay_ms(10);
}
gLCDworking=1;
printf("LCD_ShowString:%s ", p);      
    while(*p!='')
    {       
        if(x>MAX_CHAR_POSX){x=0;y+=16;}
        if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear(WHITE);}
        LCD_ShowChar(x,y,*p,16,0);
        x+=8;
        p++;
    }  
gLCDworking=0;
}

结果还是有白 {MOD}竖线呢,这就不好解释啦,

一周热门 更多>