TFTLCD屏幕刷新问题

2019-07-21 01:55发布

有没有大佬帮我看看,我想做一个电子时钟,用TFTLCD屏幕来做,但是遇到一个问题,就是我在循环函数里若加延时则大大影响了按键的效果,若不加延时则一直在快速刷新,一直在闪,我知道是什么问题,但是不知道怎么去解决,有没有大佬知道怎么解决。以下是本人程序,

#include "stm32f10x.h"
#include "led.h"
#include "time.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "key.h"

u16 shi=0,fen=0,miao=0,a=0,b;
void key_can();

void TIM2_IRQHandler()
{
   if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
         {         
                   miao++;
                   if(miao==60)
                         {
                 miao=0;
           fen++;
           if(fen==60)
                                         {
                                            fen=0;
              shi++;
              if(shi==24)
                                                        {
                               shi=0;                                       
                                                        }                                                               
                                         }                                                 
                         }
                                      LED1=!LED1;
       TIM_ClearITPendingBit(TIM2,TIM_IT_Update);                 
         }
}

int main()
{

          delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
          uart_init(115200);
          LED_Init();
          LCD_Init();
          KEY_Init();
          TIM_Init(9999,7199);
          POINT_COLOR=RED;       
          while(1)
                {
       key_can();                               
                   LCD_Clear(BLUE);       
                   LCD_ShowxNum(210,0,miao,2,24,0x81);
                        LCD_ShowChar(195,0,':',24,1);
                   LCD_ShowxNum(170,0,fen,2,24,0x81);       
                        LCD_ShowChar(155,0,':',24,1);                       
                   LCD_ShowxNum(130,0,shi,2,24,0x81);                               
             LED0=!LED0;                       
       delay_ms(500);                       
                }
}

void key_can()
{
                         b=KEY_Scan(0);
                         if(b==3)
                         {
                                 delay_ms(10);
                      a++;                                 
          if(a==2)
                                        {
                      a=0;                               
                                        }                                               
                         }
                         if(a==0)
                         {
                TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//DISABLE  ENABLE                                
                         }
                         if(a==1)
                         {
                TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);//DISABLE  ENABLE                                 
                         }
}



有没有大佬帮忙解决,或者能不能提供一个用stm32f10系列 TFTLCD屏的电子钟实验程序我参考参考,谢谢谢谢谢谢。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
nashui_sx
1楼-- · 2019-07-21 05:56
 精彩回答 2  元偷偷看……
wenlin1214
2楼-- · 2019-07-21 10:32
 精彩回答 2  元偷偷看……
nashui_sx
3楼-- · 2019-07-21 11:02
本帖最后由 nashui_sx 于 2019-5-4 18:18 编辑
wenlin1214 发表于 2019-5-4 18:06
第1点,我理解不了。第2点,我可以去试一下,我对写中断函数还不是很会,写过定时器中断,写过串口中断, ...

第一个最好用你理解不了
delay.h改成如下

#ifndef __DELAY_H
#define __DELAY_H         

#include "sys.h"  

extern volatile u64 xitong_haomiao;
extern volatile u64 xitong_haomiao_old;

void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif


delay.c改成如下
#include "delay.h"
                                     //ms    s    h  day year
volatile u64 xitong_haomiao;           //2^64/1000/3600/24/365=584942417年会复位
//USART1_printf("xitong_haomiao=%llu ",xitong_haomiao);
volatile u64 xitong_haomiao_old=0;            
           
static   u8  fac_us=0;                                                             //us延时倍乘数        
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间time  =  ( SysTick->LOAD + 1 ) / f                        f = AHB或AHB/8            (9000-1+1)/9M=1ms
void delay_init()
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8  9M 计数器减1为1/9000000秒
        fac_us=SystemCoreClock/8000000;                                      //9  
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
        SysTick->LOAD=fac_us*1000-1;                                                     //每1/1000s中断一次        
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //开启SYSTICK   
}        

                                                                     
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                        //LOAD的值                     
        ticks=nus*fac_us;                                                           //需要的节拍数                           
        tcnt=0;
        told=SysTick->VAL;                                                //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;        
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;                //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                                //时间超过/等于要延迟的时间,则退出.
                }  
        }        
}

void delay_ms(u16 nms)
{                                    
         delay_us((u32)(nms*1000));                                        //普通方式延时  
}

void SysTick_Handler(void)
{        
     xitong_haomiao++;
}


main 大约这样

int main()
{        
    u64 xitong_haomiao_pingmu_old;
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);  
          delay_init();

                USART1_Init(115200);
                printf("OK... ");

                while(1)
                {
               if(xitong_haomiao-xitong_haomiao_pingmu_old>500)
                                 {
                                     xitong_haomiao_pingmu_old=xitong_haomiao;
                                           //更新屏幕代码
                                          
                                 }

                }
}
就不用延时了

wenlin1214
4楼-- · 2019-07-21 15:02
nashui_sx 发表于 2019-5-4 18:10
第一个最好用你理解不了
delay.h改成如下

搞不懂,就是不需要屏幕延时是吧
nashui_sx
5楼-- · 2019-07-21 16:53
wenlin1214 发表于 2019-5-5 19:21
搞不懂,就是不需要屏幕延时是吧

不需要延时,改成软定时器了,搞不懂试试不就懂了,看能看懂?

一周热门 更多>