/*******************************************
开发坏境: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);
}
}
此帖出自
小平头技术问答
如果你用的1602 我只能说更大的可能性是 你对比度没有调节的问题,你用个 1k以上的电阻把对比度接地看一下,屏有没有显影,如果有有显影再看程序问题。 1602的反映比较慢,如果有显影,显示不正常就加多另点延时吧!
一周热门 更多>