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 21:46:03 浏览: 143
根据你提供的代码,屏幕上显示的数字重叠是因为LCD显示函数`LCD_ShowxNum()`的实现方式是在原有数字的位置上直接覆盖新的数字,而不是先清除原有数字再显示新的数字。因此,当新的数字位数比原有数字位数少时,原有数字的高位数字仍然会留在屏幕上,导致数字重叠。
为解决这个问题,可以在调用`LCD_ShowxNum()`函数之前先使用`LCD_Fill()`函数清除原有数字所占的区域。例如,在显示温度数字之前,可以加入以下代码:
```c
LCD_Fill(85,150,239,166,WHITE); // 清除温度数字所占区域
```
其中,`LCD_Fill()`函数的前四个参数表示要清除的矩形区域的左上角和右下角坐标,最后一个参数表示要填充的颜色,这里使用白色清除原有数字。这样就可以避免数字重叠的问题了。
相关问题
void Delay_Init(void) { TIM_TimeBaseInitTypeDef TIM_7; NVIC_InitTypeDef TIM7_UPIT; //¿ªÆôTIM6ΪÏòÉϼÆÊý£¬ÒòΪ¶¨Ê±Æ÷ʱÖÓ»áÓб¶Æµ£¬Æä¹ÒÔÚAPB1 42MHZÉÏ£¬µ«ÊÇÆä´óСΪ84MHZ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE); TIM_7.TIM_ClockDivision=TIM_CKD_DIV1; TIM_7.TIM_CounterMode=TIM_CounterMode_Up; TIM_7.TIM_Period=19999;//É趨ʱ¼äΪ2ms TIM_7.TIM_Prescaler=83; TIM_7.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM7,&TIM_7); TIM_Cmd(TIM7,ENABLE); //¿ªÆôTIM6ÏàÓ¦Öжϣ¬ÉèÖÃÇÀÕ¼ÓÅÏȼ¶Îª×î¸ß£¬ÏìÓ¦ÓÅÏȼ¶Í¬Ñù NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); TIM7_UPIT.NVIC_IRQChannel=TIM7_IRQn; TIM7_UPIT.NVIC_IRQChannelCmd=ENABLE; TIM7_UPIT.NVIC_IRQChannelPreemptionPriority=0; TIM7_UPIT.NVIC_IRQChannelSubPriority=0; NVIC_Init(&TIM7_UPIT); TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); }
这段代码是用来初始化TIM7定时器的,它的时钟频率为APB1的一半(即42MHz),预分频器为83,所以计数器每计数一次需要的时间为2us。定时器的计数模式为向上计数,计数到19999时产生中断,中断优先级为最高,中断服务函数为TIM7_IRQHandler。这段代码还开启了TIM7定时器和TIM7中断。
#include "delay.h" #include "sys.h" #include "oled.h" #include "bmp.h" #include "pwm.h" #include "stm32f10x_tim.h" #include "adc.h" #include "irq.h" #include "pid.h" #include "key.h" #include "dht11.h" #include "usart.h" //#include "dht11.h" int wendu=0,shidu=0; int yewei=0; int time=0; int Accelerated=0; int Accelerated_z=0; int Accelerated_x=0; int main(void) { //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //IRQ_INT(999,79);//Öжϳõʼ»¯ 500ms 7199·ÖƵ key_init(); uart_init(9600); //´®¿Ú³õʼ»¯Îª9600 delay_init(); Adc_Init(); while(1) { //ADCÉèÖúà Accelerated=Get_Adc(6); Accelerated_z=Accelerated/256; Accelerated_x=Accelerated-Accelerated_z; delay_ms(10); USART_SendData(USART1,Accelerated_z); delay_ms(10); USART_SendData(USART1,Accelerated_x); }解释一下这个程序并在每一行加上备注
程序主要实现了读取ADC值,并通过串口发送到上位机。下面是每一行的注释:
```
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "pwm.h"
#include "stm32f10x_tim.h"
#include "adc.h"
#include "irq.h"
#include "pid.h"
#include "key.h"
#include "dht11.h"
#include "usart.h"
int wendu=0,shidu=0; //定义温度湿度变量
int yewei=0; //定义液位变量
int time=0; //定义时间变量
int Accelerated=0; //定义加速度变量
int Accelerated_z=0; //定义加速度Z轴变量
int Accelerated_x=0; //定义加速度X轴变量
int main(void) {
key_init(); //按键初始化
uart_init(9600); //串口初始化为9600波特率
delay_init(); //延时函数初始化
Adc_Init(); //ADC初始化
while(1) {
Accelerated=Get_Adc(6); //读取ADC6通道的值
Accelerated_z=Accelerated/256; //计算Z轴加速度
Accelerated_x=Accelerated-Accelerated_z; //计算X轴加速度
delay_ms(10); //延时10ms
USART_SendData(USART1,Accelerated_z); //通过串口发送Z轴加速度值
delay_ms(10); //延时10ms
USART_SendData(USART1,Accelerated_x); //通过串口发送X轴加速度值
}
}
```
这个程序主要是读取ADC的值,并通过串口发送到上位机。其中,加速度传感器的输出值被连接到了ADC6通道,计算Z轴和X轴加速度的方法是将ADC值除以256和取余。通过USART_SendData函数将数据发送到串口1,以便上位机读取。
阅读全文