📄 adc_lcd.c
字号:
//描述:ADC12-A0模拟采集+LCD演示ADC12-A0模数转换.
//编写:微控设计网 DC版主 日期:2008.1.
//编译环境:IAR EW430 V3.42A
//验证平台: www.microcontrol.cn MC430F44开发板 V1.0
//声明:此程序只供微控用户使用.在未得到DC版主的许可请勿将资料外公开和用于商业用途.
//******************************************************************************
// ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
// //* An external watch crystal between XIN & XOUT is required for ACLK *//
# include <msp430x44x.h>
//******************************************************************************
//定义区
unsigned int value;
#define precision 0.0008 //3.3/4096 分辩率
#define Vunit 0x08 //V电压单位
#define mVunit 0x04 //mV电压单位
#define Dot 0x10 //小数点
#define Run 0x08 //Run指示
float voltage; //电压值
unsigned char digit[10] =
{
0xEB, /* "0" LCD segments a+b+c+d+e+f */
0x60, /* "1" */
0xC7, /* "2" */
0xE5, /* "3" */
0x6C, /* "4" */
0xAD, /* "5" */
0xAF, /* "6" */
0xE0, /* "7" */
0xEF, /* "8" */
0xED /* "9" */
};
//******************************************************************************
void LED(void)
{
if(P1OUT & BIT1)
P1OUT &= ~BIT1;
else
P1OUT |= BIT1;
}
//******************************************************************************
//清LCD屏
void LcdClr(void)
{ unsigned char i;
for (i=0; i<31; i++)
{
LCDMEM[i] = 0x00; // CLR LCDMEM
}
}
//******************************************************************************
//LCD初始化
void LcdInit(void)
{ LCDCTL = LCDON + LCD4MUX + LCDSG0_2; // LCD on, 4-Mux, segments S2-S33
BTCTL = BTFRFQ1; // LCD clock freq is ACLK/128
P5SEL = 0xFC; // Select P5.2-7 as Com and Rxx
LcdClr();
LCDMEM[13] |= Vunit ; //电压单位指示
LCDMEM[14] |= Run;
}
//******************************************************************************
//说明:单片机初始化
void init(void)
{ //ADC12初始化----------------------
//单通道,单次采样模式
LcdInit(); //LCD初始化
P6SEL |= BIT0; //使能A/D通道 A0
ADC12CTL0 = ADC12ON + SHT0_2; //开ADC12内核和设置SHIT0=2(N=4)
ADC12CTL1 |= SHP; //SAMPCON信号选择为采样定时器输出
ADC12CTL1 |= CSTARTADD_0; //定义单次转换地址
ADC12MCTL0 |= INCH_0;
//ADC12MCTL0 = SREF_2; //使用外部参考电压 Vr+ = VeREF+
ADC12CTL0 |= ENC; //ADC转换允许
//Timer_A初始化--------------------
P1DIR |= 0x02;
CCR0 = 1638-1;
CCTL0 = CCIE;
TACTL = TASSEL_1+MC_1; //timerA CLK=ACLK,增计数模式
_EINT(); //开总中断
}
//******************************************************************************
//说明:数据转换和显示更新
void Display(unsigned int intdata)
{ unsigned long tmep;
unsigned int a,b,c,d;
LCDMEM[7]=digit[intdata/1000] ;
a=intdata%1000 ;
LCDMEM[8]=digit[a/100] ;
b=a%100 ;
LCDMEM[9]=digit[b/10] ;
c=b%10;
LCDMEM[10]=digit[c/1] ;
voltage =(float)(intdata*precision);
tmep = (unsigned long)(voltage*1000);
LCDMEM[1]=digit[tmep/10000] ;
a=tmep%10000 ;
LCDMEM[2]=digit[a/1000] ;
b=tmep%1000 ;
LCDMEM[3]=digit[b/100] ;
c=tmep%100 ;
LCDMEM[4]=digit[c/10] ;
d=tmep%10 ;
LCDMEM[5]=digit[d/1] ;
LCDMEM[2] |= Dot ; //小数点
}
//******************************************************************************
//TimerA0中断服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_a(void)
{
LPM0_EXIT;
}
//******************************************************************************
void main(void)
{ WDTCTL=WDTPW+WDTHOLD; //停止WDT
init();
LPM3;
while(1)
{ADC12CTL0 |= ADC12SC; // 开始转换
while((ADC12IFG & BIT0)==0);
_NOP();
LED();
value=ADC12MEM0; // 读取结果
Display(value); //数据转换和显示更新
LPM3;
}
}
//******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -