STM32ADC采集的电压用LCD1602显示

2019-07-21 00:17发布

大神们  帮我看看LCD1602显示STM32ADC采集的电压的代码(LCD已经初始化成功) 主函数:
u8 i;
int main(void)
{
        u16 adcx;
  u8 table[4];
        //u8 *p;
        float temp;
        SystemInit();
        delay_init(72);             //延时初始化
        LED_Init();
        KEY_Init();
        Adc_Init();
        lcd1602_init();
        while(1)
        {
                //p = table;
                adcx=Get_Adc(ADC_Channel_8);
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                table[0]=adcx/1000;
                table[1]=adcx%1000/100;
                table[2]=adcx%100/10;
                table[3]=adcx%10;
                LED0=!LED0;
                delay_ms(250);
                        lcd1602_write_byte(0x80+0x10,write_cmd);
                for(i=0;i<4;i++)
                {
                        lcd1602_write_byte(table,write_dat);
                        delay_ms(20);
                }

//                 lcd1602_write_byte(0x80+0x50,write_cmd);//必须用写命令来指定在GRAM哪个地址上写内容
//                 for(i=0;i<16;i++)
//                 {
//                         lcd1602_write_byte(table2,write_dat);
//                         delay_ms(20);
//                 }
               
                for(i=0;i<16;i++)
                {
                                lcd1602_write_byte(0x18,write_cmd);
                                delay_ms(500);
                }               
                while(1);
        }

}
   ADC的初始化代码
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1, ENABLE );          //使能ADC1通道时钟

        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
        //PA0/1/2/3 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOB, &GPIO_InitStructure);       


        ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值


        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   



        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //重置指定的ADC1的校准寄存器
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //获取ADC1重置校准寄存器的状态,设置状态则等待
       
        ADC_StartCalibration(ADC1);                //开始指定ADC1的校准状态

        while(ADC_GetCalibrationStatus(ADC1));                //获取指定ADC1的校准程序,设置状态则等待

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能


}                                  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束


        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}

LCD初始化代码:
void lcd1602_write_byte(u8 dat,u8 mode)
{
        GPIO_Write(GPIOA,dat<<8); //ok
        lcd1602_port_dat(dat)       //ok
        lcd1602_rs = mode;
        lcd1602_en = 0;
        delay_ms(10);
        lcd1602_en = 1;
        delay_ms(10);
        lcd1602_en = 0;
}


//LCD1602初始化函数
void lcd1602_init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //打开复用时钟----重要
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        GPIO_Write(GPIOA, 0X00FF);
       
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_8 ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        lcd1602_write_byte(0x38,write_cmd);//16*2显示,5*7点阵,8位数据接口
        delay_ms(100);
        lcd1602_write_byte(0x0f,write_cmd);//开显示,开光标,光标闪烁
  delay_ms(100);
        lcd1602_write_byte(0x06,write_cmd);//字符指针加1,光标加1;写一个字符整屏不移动
  delay_ms(100);
        lcd1602_write_byte(0x01,write_cmd);//清屏
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
龙之谷
1楼-- · 2019-07-21 03:34
 精彩回答 2  元偷偷看……
嘲讽脸影魔
2楼-- · 2019-07-21 09:26
看着看着就治好了我的颈椎病
逆态度
3楼-- · 2019-07-21 13:29
可以发我lcd的程序吗!急

一周热门 更多>