资源描述
#include<msp430g2553.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_CON_DIR P2DIR
#define LCD_CON_IN P2IN
#define LCD_CON_OUT P2OUT
#define LCD_RS BIT0 //p2.5接51 p2.5
#define LCD_RW BIT1 //p2.0接51 p2.6
#define LCD_EN BIT2 //p2.1接51 p2.7
#define LCD_DATA_DIR P1DIR
#define LCD_DATA_IN P1IN
#define LCD_DATA_OUT P1OUT
#define A 1000
#define B 100
#define X 10
void InitOsc(void);
void InitLCD(void);
void write_command(uchar command);
void write_data(uchar data);
void Display_ZFC(uchar *s);
void LCD_Set_xy(uchar x,uchar y);
void Trans_val(uint Hex_Val);
void Display_Volte(uint Hex_Val);
void Measure_Volte(void);
uchar num[]={".v"};
uchar volte[]={"Volt: "};
uint index=0;
int i;
unsigned long sum=0;
uint Hex_Val;
#define Num_of_Results 32
uint results[Num_of_Results]; //保存ADC转换成果旳数组
uint average;
/****************************************************************************
ADC初始化
*****************************************************************************/
void ADC_Init(void)
{
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; //二次采集
}
/****************************************************************************
DCO时钟初始化 设为1MHz
*****************************************************************************/
void DCO_Init(void)
{
if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
ﻩﻩ{
ﻩﻩﻩwhile(1);
}
BCSCTL1 = CALBC1_1MHZ;
ﻩDCOCTL = CALDCO_1MHZ;
ﻩBCSCTL2 = SELM_0 +DIVM_0;
}
/****************************************************************************
向12864发送字节
*****************************************************************************/
void SendByte(uchar Zdata)
{
uint i;
ﻩfor(i=0; i<8; i++)
{
ﻩﻩif((Zdata << i) & 0x80)
ﻩ{
ﻩﻩﻩLCD_CON_OUT |= LCD_RW; //clk始终信号为高
ﻩﻩ}
ﻩﻩelse
ﻩ{
ﻩ LCD_CON_OUT &=~LCD_RW; //clk始终信号为低
ﻩﻩ}
ﻩﻩLCD_CON_OUT &= ~LCD_EN;
ﻩ LCD_CON_OUT |= LCD_EN;
ﻩ}
}
/****************************************************************************
向12864写命令
*****************************************************************************/
void write_command(uchar command)
{
LCD_CON_OUT |= LCD_RS;
ﻩSendByte(0xF8);
ﻩSendByte(command & 0xF0);
SendByte((command<<4)&0xF0);
ﻩ_delay_cycles(200);
}
/****************************************************************************
向12864写数据
*****************************************************************************/
void write_data(uchar data)
{
ﻩLCD_CON_OUT |= LCD_RS;
ﻩSendByte(0xFA);
ﻩSendByte(data & 0xF0);
ﻩSendByte((data << 4) & 0xF0);
_delay_cycles(200);
}
void Display_ZFC(uchar *s)
{
while(*s > 0)
{
ﻩﻩwrite_data(*s);
ﻩﻩs++;
ﻩﻩ_delay_cycles(5000);
}
}
/****************************************************************************
拟定12864屏幕显示旳坐标位置(x,y)
*****************************************************************************/
void LCD_Set_xy( uchar x, uchar y )
{
uchar address;
ﻩswitch(x)
ﻩ{
ﻩcase 0: address = 0x80 + y; break;
case 1: address = 0x80 + y; break;
ﻩﻩcase 2: address = 0x90 + y; break;
ﻩ ﻩcase 3: address = 0x88 + y; break;
ﻩﻩcase 4: address = 0x98 + y; break;
ﻩdefault:address = 0x80 + y; break;
ﻩ}
write_command(address); //写入地址命令
}
/****************************************************************************
lcd初始化
*****************************************************************************/
void InitLCD(void)
{
ﻩLCD_CON_DIR |= 0xFF; //p2口定义为输出
ﻩwrite_command(0x01); //清屏
ﻩwrite_command(0x30);
ﻩ_delay_cycles(5000);
write_command(0x0c);
ﻩ_delay_cycles(5000);
}
/****************************************************************************
采集到旳数据转化成电压形式
*****************************************************************************/
void Trans_val(uint Hex_Val)
{
ﻩunsigned long caltmp;
ﻩuint Curr_Volt,volt,max;
ﻩuint a[50];
ﻩcaltmp = Hex_Val;
caltmp = caltmp*34600; //caltmp = Hex_Val * 34600
Curr_Volt = caltmp >> 10 ; //Curr_Volt = caltmp / 2^n
volt = Curr_Volt;
for(i=0;i<50;i++)
{a[i]=volt;}
for(max=a[0],i=0;i<50;i++)
{if(a[i]>max)max=a[i];}
Curr_Volt = max;
Display_Volte(Curr_Volt);
}
/****************************************************************************
主函数
*****************************************************************************/
void main(void)
{
ﻩWDTCTL = WDTPW + WDTHOLD;
ﻩADC_Init(); //ADC初始化
ﻩDCO_Init(); //DCO初始化
InitLCD(); //12864液晶初始化
ﻩwhile(1)
ﻩ{
ﻩMeasure_Volte(); //测量直流电压值并且显示
ﻩ}
}
/****************************************************************************
测量电压
*****************************************************************************/
void Measure_Volte(void)
{
ﻩ ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE);
ﻩ results[index++] = ADC10MEM; // Move results
ﻩ if(index == Num_of_Results)
{
ﻩ index = 0;
ﻩ for(i = 0; i < Num_of_Results; i++)
ﻩ {
ﻩ ﻩ sum += results[i];
ﻩ }
ﻩ sum >>= 5; //除以32
ﻩ ﻩ Trans_val(sum);
ﻩ sum=0;
ﻩ }
}
/****************************************************************************
显示电压值
*****************************************************************************/
void Display_Volte(uint Hex_Val)
{
ﻩuint Curr_Volt;
Curr_Volt = Hex_Val;
ﻩwrite_command(0x90);
ﻩfor(i=0;i<16;i++)
{write_data(volte[i]);}
write_command(0x93);
write_data(num[Curr_Volt / 10000]);
ﻩwrite_data(num[10]);
write_data(num[Curr_Volt % 10000/1000]);
ﻩwrite_data(num[Curr_Volt % 10000 % 1000 / 100]);
ﻩwrite_data(num[Curr_Volt % 10000 % 1000 % 100 / 10]);
write_data(' ');
ﻩwrite_data(num[11]);
}
/****************************************************************************
ADC中断,进入低功耗模式 关闭CPU
*****************************************************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
展开阅读全文