void LCD_Display_min(uint16_t min)//LCD显示屏显示分钟 { int min_u; int min_t; min_u=min/10; min_t=min%10; switch(min_t) { case 0: LCDSEG14 = 0x07; LCDSEG15 = 0x0D; break; case 1: LCDSEG14= 0x00; LCDSEG15 = 0x05; break; case 2: LCDSEG14 = 0x05; LCDSEG15 = 0x0B; break; case 3: LCDSEG14 = 0x01; LCDSEG15 = 0x0F; break; case 4: LCDSEG14 = 0x02; LCDSEG15 = 0x07; break; case 5: LCDSEG14 = 0x03; LCDSEG15 = 0x0E; break; case 6: LCDSEG14 = 0x07; LCDSEG15 = 0x0E; break; case 7: LCDSEG14 = 0x01; LCDSEG15 = 0x05; break; case 8: LCDSEG14 = 0x07; LCDSEG15 = 0x0F; break; case 9: LCDSEG14 = 0x03; LCDSEG15 = 0x0F; break; } switch(min_u) { case 0: LCDSEG12 = 0x07; LCDSEG13 = 0x0D; break; case 1: LCDSEG12 = 0x00; LCDSEG13 = 0x05; break; case 2: LCDSEG12 = 0x05; LCDSEG13 = 0x0B; break; case 3: LCDSEG12 = 0x01; LCDSEG13 = 0x0F; break; case 4: LCDSEG12 = 0x02; LCDSEG13 = 0x07; break; case 5: LCDSEG12 = 0x03; LCDSEG13 = 0x0E; break; case 6: LCDSEG12 = 0x07; LCDSEG13 = 0x0E; break; }这段代码优化一下
时间: 2024-02-14 10:18:18 浏览: 96
这段代码可以进行优化,可以使用一个数组来存储每个数字对应的LCD段码,然后通过计算得到每个数字的位数,再取出对应的LCD段码进行显示。
优化后的代码如下:
```
const uint8_t digits[10][2] = {
{0x07, 0x0D}, // 0
{0x00, 0x05}, // 1
{0x05, 0x0B}, // 2
{0x01, 0x0F}, // 3
{0x02, 0x07}, // 4
{0x03, 0x0E}, // 5
{0x07, 0x0E}, // 6
{0x01, 0x05}, // 7
{0x07, 0x0F}, // 8
{0x03, 0x0F} // 9
};
void LCD_Display_min(uint16_t min) {
int min_u = min / 10;
int min_t = min % 10;
LCDSEG12 = digits[min_u][0];
LCDSEG13 = digits[min_u][1];
LCDSEG14 = digits[min_t][0];
LCDSEG15 = digits[min_t][1];
}
```
这样的话,代码更加简洁,并且易于维护。
相关问题
#include "headfile.h" //#include "common.h" #include "math.h" //#include "cmath" extern unsigned int AD_L[8]; extern int AD[8]; extern int chazhi[10]; extern float sensor_to_one[8]; extern unsigned int max_v[8]; void AD_nit(); void Max_ADC(void); void Max_ADC_H(void); //void Read_AD(void); //void Read_AD_H(void); //void Analyse_ADC(void); void Find_Max(void); void Read_ADC(void); //float absf(int a,int b); int ADC_2(void); void Computer_Display2(void); uint16_t ad_valu[8][5]; int16_t min[2][3], max[2][3]; uint16_t AD_L[8]; int16_t AD[8]; uint16_t AD_Round[8]; uint16_t AD_V[5]; uint16_t adsum[8]; uint16_t AD_sum[8]; uint16_t ad_valu1[8]; float sensor_to_one[8]; uint16_t max_v[8], min_v[8]; int16_t centre = 4000; int16_t chazhi[10]; int16_t move = 0; float Previous_Error[12]; float Previous_Error1[12]; void AD_nit() { adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);为什么AD_L[8]会出现错误
AD_L[8]出现错误可能是因为它在代码中重复定义两次。在给变量命名时,要确保每个变量只被定义一次。在上述代码中,AD_L[8]被定义了两次。
首先,在头文件headfile.h中,我们可以看到以下代码:
```c
extern unsigned int AD_L[8];
```
这表示AD_L[8]是一个外部变量,在其他文件中已经定义过了。
然后,在当前文件中,我们又看到了以下代码:
```c
uint16_t AD_L[8];
```
这表示在当前文件中再次定义了AD_L[8],导致了重复定义的错误。
要解决这个问题,可以删除当前文件中的AD_L[8]的定义,只保留头文件中的声明即可。修改后的代码如下:
```c
#include "headfile.h"
//#include "common.h"
#include "math.h"
//#include "cmath"
extern unsigned int AD_L[8];
extern int AD[8];
extern int chazhi[10];
extern float sensor_to_one[8];
extern unsigned int max_v[8];
void AD_nit();
void Max_ADC(void);
void Max_ADC_H(void);
//void Read_AD(void);
//void Read_AD_H(void);
//void Analyse_ADC(void);
void Find_Max(void);
void Read_ADC(void);
//float absf(int a,int b);
int ADC_2(void);
void Computer_Display2(void);
uint16_t ad_valu[8][5];
int16_t min[2][3], max[2][3];
// uint16_t AD_L[8]; // 删除重复定义的行
int16_t AD[8];
uint16_t AD_Round[8];
uint16_t AD_V[5];
uint16_t adsum[8];
uint16_t AD_sum[8];
uint16_t ad_valu1[8];
float sensor_to_one[8];
uint16_t max_v[8], min_v[8];
int16_t centre = 4000;
int16_t chazhi[10];
int16_t move = 0;
float Previous_Error[12];
float Previous_Error1[12];
void AD_nit()
{
adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
}
```
这样就修复了AD_L[8]重复定义的问题。
#define uchar unsigned char #define uint unsigned int #define ULint unsigned char //宏定义 char flags=0;//超声波 char flag1s=0;//超声波距离 uint time=0;//计算定时间 ULint L_=0;//计算距离 //显示模式 0正常 1最大值调整 2最小值调整 uchar mode=0; uint Max=220; uint Min=190; uchar k=0;//按键标志 //头函数 #include <reg52.h> #include <intrins.h> #include "BJ_Key.h" //报警按键 #include "display.h" //显示头函数 #include "ultrasonic_wave.h"//超声波头函数 void delayms(uint ms); //主函数 void main() { Init_ultrasonic_wave(); Init1602();//屏幕初始化 while(1) { Key(); if(mode==0) { StartModule();//启动超声波 while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 delayms(20); //20MS Conut(L_); //计算距离 if(L_<Min) { Feng=0; Motor_Start(); } else if(L_>Max) { Feng=1; Motor_Stop(); } else { Feng=1; Motor_Start(); } Display_1602(L_); } //调整显示 else if(mode!=0) { //最大最小值 Init_MaxMin(); while(mode!=0) { Key(); if(k==1&&mode==1) { Init_MaxMin(); write_com(0x8d);//设置位置 } else if(k==1&&mode==2) { Init_MaxMin(); write_com(0x8d+0x40);//设置位置 } k=0; } //界面初始化 Init1602(); } } } void delayms(uint ms) { uchar i=10,j; for(;ms;ms--) { while(i--) { j=10; while(j--); } } }解释这串代码
这段代码是一个基于51单片机的超声波测距控制系统。以下是对代码的解释:
首先,通过宏定义定义了一些数据类型和常量,包括uchar(无符号字符型)、uint(无符号整型)、ULint(无符号长整型),以及一些常量和标志。然后,通过包含相关头文件和函数库,引入了所需的函数和变量。
在主函数中,主要分为两种模式:正常模式和调整模式。在正常模式下,通过调用Init_ultrasonic_wave()函数初始化超声波模块,并通过StartModule()函数启动超声波测距,然后通过计时器中断获取超声波信号的回波时间,并计算出距离。通过比较距离和最大值、最小值的大小,来控制电机启动和停止、风机开启和关闭,并将距离显示在1602液晶屏上。
在调整模式下,可以通过按键调整最大值和最小值。通过调用Init_MaxMin()函数初始化最大值和最小值,并通过write_com()函数设置光标位置,以便在液晶屏上显示当前调整的数值。在调整过程中,需要不断扫描按键状态,如果按键被按下,则对相应的最大值或最小值进行修改。
最后,通过delayms()函数实现了延时功能。
阅读全文