求指导,程序是对的,可是1602没有反应,这个是怎么回事

2019-03-24 09:07发布

/*******************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:ADC模数转换器
程序说明:ADC采样,12864显示电压
编程者:Linchpin
********************************************/
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/fpu.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "grlib/grlib.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "inc/hw_gpio.h"
typedef unsigned int uint;
typedef unsigned char uchar;
void delay_Nms(uint n);
void Ini_Lcd(void);
void write_com(uchar com);
void write_dat(uchar dat);
void disp_num(double num,uchar dec_dig);
uchar const disps[]={"峰值电压为:"};
double ValueAvg;
//int aa;
int main(void)
{
        uint32_t ulADC0_Value;
        //设置系统时钟为50MHz (400/2/4=50)
        SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
        //初始化ADC0/PE3
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
        /*设置ADC参考电压为外部3V
        ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V);*/

        //ADC外部参考电压始终为3.3V
        //配置ADC采集序列          ADC0_BASE/采样序列号/处理器通过ADCProcessorTrigger()函数产生的一个触发/优先级,0最高
        ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_PROCESSOR, 0);
        //配置采样序列发生器的步进       ADC0_BASE/采样序列号/步进值 (该参数决定了触发产生时ADC捕获采样序列的次序。
        //对于第一个采样序列,其值可以是0~7;对于第二和第三个采样序列,其值从0~3;对于第四个采样序列,其值只能取0。)/
        //选择被采样的通道,该步进可以定义成序列的末尾(ADC_CTL_END位),同时它也可以配置成在步进完成后产生一个中断(ADC_CTL_IE位)
        ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 |ADC_CTL_END | ADC_CTL_IE);

        //使能ADC采集序列
        ADCSequenceEnable(ADC0_BASE, 0);
        ADCIntClear(ADC0_BASE, 0);
        //ADCIntEnable(ADC0_BASE, 3);

        Ini_Lcd();
        while(1)
        {
            //触发采集
                ADCProcessorTrigger(ADC0_BASE, 0);
            //等待采集结束
                while(!ADCIntStatus(ADC0_BASE, 0, false)) ;
                ADCIntClear(ADC0_BASE, 0);
            //获取采集结果  0-4095代表0-3.3V
                ADCSequenceDataGet(ADC0_BASE, 0, &ulADC0_Value);
                ValueAvg=ulADC0_Value*3.300/4095.;
                write_com(0x80);
                disp_num(ValueAvg,4);

        }
       
}

/*******************************************
函数名称:delay_Nms
功    能:延时N个ms的时间
参    数:无
返回值  :无
********************************************/
void delay_Nms(uint n)
{
    uint i = 0;
    for(i = n;i > 0;i--)
            SysCtlDelay(SysCtlClockGet() / 3000);
}
/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Ini_Lcd(void)
{
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
        GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                        GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
    delay_Nms(15);                     //延时等待液晶完成复位
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
        delay_Nms(5);
        write_com(0x30);  /*功能设置:一次送8位数据,基本指令集*/

        delay_Nms(1);
    write_com(0x08);  /*DDRAM地址归位*/
        delay_Nms(1);
        write_com(0x0c);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
        delay_Nms(1);
        write_com(0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
        delay_Nms(1);
        write_com(0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
        delay_Nms(5);
        write_com(0x80);
}

/**************************************************
*名称:void write_com(uchar com)
*功能:向1602写指令
*入口参数:com
*出口参数:无
**************************************************/
void write_com(uchar com)
{
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3, 0x00000);//RS=0,RW=0
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                        GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com);    //PB=com
        delay_Nms(5);
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4);   //E=1
    delay_Nms(5);
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0x00000);   //E=0
}

/**************************************************
*名称:void write_dat(uchar dat)
*功能:向1602写数据
*入口参数:dat
*出口参数:无
**************************************************/
void write_dat(uchar dat)
{
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2 );//RS=1,RW=0
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                                GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat);  //PB=dat
        delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4);   //E=1
        delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
}

/**************************************************
*名称:void disp_num(double num,uchar dec_dig)
*功能:显示任意实数,并可设定保留小数位数
*入口参数:要显示的数字和要保留的小数位数
**************************************************/
void disp_num(double num,uchar dec_dig)
{
        int num_int,num_dec_int,m=0,k=0,j;
        double num_dec;

        uchar integ[10],decim[10];
        num_int= (int)num;//a= 1234
        num_dec= num - num_int;//b= 0.5678

        for(j=num_int;j>0;j=j/10)
        {
                integ[k++]=j%10;
        }

        num_dec_int=(int)(num_dec*pow(10,dec_dig));
    for(j=num_dec_int;j>0;j=j/10)
        {
                decim[m++]=j%10;
        }

    for(j=k-1;j>=0;j--)
        {
                write_dat(integ[j]+48);
        }
        write_dat('.');

        for(j=dec_dig-1;j>=0;j--)
        {
                write_dat(decim[j]+48);
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
strong161
2019-03-25 08:06
本帖最后由 strong161 于 2016-7-22 09:35 编辑

如果你用的1602 我只能说更大的可能性是 你对比度没有调节的问题,你用个 1k以上的电阻把对比度接地看一下,屏有没有显影,如果有有显影再看程序问题。 1602的反映比较慢,如果有显影,显示不正常就加多另点延时吧!

一周热门 更多>

相关问题

    相关文章