#include <msp430g2553.h>//引用头文件
#define uchar unsigned char
#define uint unsigned int
unsigned char LcdBuf2[]= {" zjunit "};//第二行要显示的内容
char a[32] ={0};
int da;
int j ;
double c,data;
void delay(long unsigned int time)
{
while(time--); //延时子程序
}
void WriteCommandLcd(unsigned char wdata)//向1602液晶写入命令子程序;
{
P1OUT&=~0x01;//RS清零,代表命令;
P1OUT&=~0x04;//使能E清零;
delay(1000); //短暂延时,代替检测忙状态
P1OUT|= 0x04;//使能E置1;
P2OUT=wdata;//送出命令或数据
delay(1000);//短暂延时,代替检测忙状态
P1OUT&=~0x04;//使能E清零,下降沿将命令或数据送入1602;
}
void WriteDataLcd(unsigned char wdata)//向1602液晶写入数据子程序;
{
P1OUT|= 0x01;//RS置1,代表数据
P1OUT&=~0x04;//使能E清零;
delay(1000); //短暂延时,代替检测忙状态
P1OUT|= 0x04;//使能E置1;
P2OUT=wdata;//送出命令或数据
delay(1000);//短暂延时,代替检测忙状态
P1OUT&=~0x04;//使能E清零,下降沿将命令或数据送入1602;
}
//LCD初始化
void lcd_init(void)
{ P2OUT = 0x00;
delay(1000);
WriteCommandLcd(0x38);//显示模式设置,设置为16X2显示,5X7点阵,8位数据接口
delay(1000);
WriteCommandLcd(0x01); //显示清屏
//WriteCommandLcd(0x0c); //开显示,关闭光标,当然光标也就不能显示了;(1)
//WriteCommandLcd(0x0e); //开显示,显示光标,但是光标不闪烁;(2)
WriteCommandLcd(0x0f); //开显示,显示光标,光标闪烁;(3)
WriteCommandLcd(0x06); //读写操作时地址自动加1
}
/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned char型),y(unsigned char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是行号,y是列号
****************************************************/
void display_xy(unsigned char x,unsigned char y)
{
if(y==0x01)
{
x = x + 0x40 + 0x80;
}
else
{
x = x+0x80;
}
WriteCommandLcd(x);
}
/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void display_string(unsigned char x,unsigned char y,unsigned char *s)
{
display_xy(x,y);
while(*s)
{
WriteDataLcd(*s);
s++;
}
}
/***************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:X-----位置的列坐标
Y-----位置的行坐标
data--显示的字符数据
返回值 :无
***************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
display_xy(x,y);
WriteDataLcd(data);
}
/***********************************在1602LCD上显示****************
***********浮点数*********************/
void Disp_float(float f_data)
{
unsigned char lcd_table[3];
unsigned long aa;
aa=f_data*1000;
lcd_table[0]= aa/1000 ;
lcd_table[1]= aa/100%10;
lcd_table[2]= aa%100/10 ;
lcd_table[3]= aa%100%10 ;
Disp1Char(5,0,(lcd_table[0]+0x30)); //显示整数部分的十位数
Disp1Char(6,0,(lcd_table[1]+0x30));
Disp1Char(7,0,(lcd_table[2]+0x30));
Disp1Char(8,0,(lcd_table[3]+0x30)); //显示小数部分的个位
//显示小数点"."
//显示小数部分的十分位
//加上0x30以便直接得到相应的ASCII码去显示
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
P2SEL = 0x00;
P2DIR = 0xff;//设置P4为输出状态
P1DIR = 0xfd;//设置P5为输出状态
P1OUT = 0x00;
lcd_init(); //初始化子程序;
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE+REF2_5V ;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
__enable_interrupt(); // Enable interrupts.
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
__disable_interrupt();
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
while(1)
{
display_string(0,0,"VPP:"); //显示第一行,显示提示文字
display_string(9,0,"mV");
display_string(9,1,LcdBuf2); //显示第二行,从第6个位置开始
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exi
da = ADC10MEM;display_string(9,1,LcdBuf2); //显示第二行,从第6个位置开始
data = ((double)da/1024)*2.5;
c =data;
Disp_float(c); //显示第一行数据
delay(1000);
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}
此帖出自
小平头技术问答
E->P1.3
RS->p1.0
RW接地
D0~D7接P2口
一周热门 更多>