有没有大佬帮我看看,我想做一个电子时钟,用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屏的电子钟实验程序我参考参考,谢谢谢谢谢谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
第一个最好用你理解不了
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;
//更新屏幕代码
}
}
}
就不用延时了
搞不懂,就是不需要屏幕延时是吧
不需要延时,改成软定时器了,搞不懂试试不就懂了,看能看懂?
一周热门 更多>