int main(void) { u8 t=0; short temperature; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2 delay_init(168); //³õʼ»¯ÑÓʱº¯Êý uart_init(115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200 alarm_Init(); LED_Init(); //³õʼ»¯LED LCD_Init(); POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ« LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"DS18B20 TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,"2014/5/7"); DS18B20_Init(); while(DS18B20_Init()) //DS18B20³õʼ»¯ { LCD_ShowString(30,130,200,16,16,"DS18B20 Error"); delay_ms(200); LCD_Fill(30,130,239,130+16,WHITE); delay_ms(200); } LCD_ShowString(30,130,200,16,16,"DS18B20 OK"); POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É« LCD_ShowString(30,150,200,16,16,"Temp: . C"); while(1) { temperature=DS18B20_Get_Temp(); //printf("µ±Ç°»·¾³Î¶È: %0.1f ¡æ\r\n",temperature*0.1);//ͨ¹ý´®¿ÚË͵½PCµçÄԶ˿ÚÏÔʾ LCD_ShowxNum(30,150,temperature/10,8,16,1); LCD_ShowxNum(30,150,temperature%10,10,16,1); //sprintf(temp_str ,"%0.2f ¡æ\r\n",temperature); if(temperature>300) { alarm=0; } delay_ms(1000); } }我将这串代码烧到单片机中,屏幕上显示的数字会在变化后重叠,这该怎么解决?
时间: 2024-03-12 20:46:03 浏览: 19
根据你提供的代码,屏幕上显示的数字重叠是因为LCD显示函数`LCD_ShowxNum()`的实现方式是在原有数字的位置上直接覆盖新的数字,而不是先清除原有数字再显示新的数字。因此,当新的数字位数比原有数字位数少时,原有数字的高位数字仍然会留在屏幕上,导致数字重叠。
为解决这个问题,可以在调用`LCD_ShowxNum()`函数之前先使用`LCD_Fill()`函数清除原有数字所占的区域。例如,在显示温度数字之前,可以加入以下代码:
```c
LCD_Fill(85,150,239,166,WHITE); // 清除温度数字所占区域
```
其中,`LCD_Fill()`函数的前四个参数表示要清除的矩形区域的左上角和右下角坐标,最后一个参数表示要填充的颜色,这里使用白色清除原有数字。这样就可以避免数字重叠的问题了。
相关问题
int main() { u16 i; u8 fx=0; SysTick_Init(168); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é LED_Init(); TIM14_CH1_PWM_Init(500-1,84-1); //ƵÂÊÊÇ2Kh while(1) { if(fx==0) { i++; if(i==100) { fx=1; } } else { i--; if(i==0) { fx=0; } } TIM_SetCompare1(TIM14,i); //iÖµ×î´ó¿ÉÒÔÈ¡499£¬ÒòΪARR×î´óÖµÊÇ499. delay_ms(10); } }
这段代码是一个简单的嵌入式C程序,主要实现了使用定时器TIM14产生PWM信号控制LED的亮度变化。程序中使用了SysTick定时器和中断配置以及LED初始化函数。在主循环中,通过改变i的值来控制PWM的占空比,从而实现LED亮度的渐变效果。程序中还定义了一个变量fx来控制i的增减方向。当fx为0时,i递增;当fx为1时,i递减。每次改变i的值后,通过TIM_SetCompare1函数设置TIM14的比较值,从而改变PWM的占空比。最后通过delay_ms函数实现了10毫秒的延迟。
需要注意的是,该代码中使用了一些未定义的函数和数据类型,比如u16和u8,以及SysTick_Init、NVIC_PriorityGroupConfig、LED_Init和TIM14_CH1_PWM_Init等函数。这些函数的具体实现需要根据具体的开发环境来确定。
解释代码int main(void) { delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú Lcd_Init(); BEEP_Init(); KEY_Init(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//´´½¨ÆðʼÈÎÎñ OSStart(); }
这段代码是主函数 `main()`,程序的入口。在函数内部,首先调用了 `delay_init()` 函数,用于初始化延时函数。然后,使用 `NVIC_PriorityGroupConfig()` 函数设置 NVIC 的优先级分组为 2。接着,调用 `LED_Init()`、`Lcd_Init()`、`BEEP_Init()` 和 `KEY_Init()` 函数进行硬件初始化。接下来,使用 `OSInit()` 函数初始化操作系统。然后,调用 `OSTaskCreate()` 函数创建一个名为 `start_task` 的任务,并设置其优先级为 `START_TASK_PRIO`。最后,调用 `OSStart()` 函数启动操作系统,开始执行任务。