×
嵌入式 > 技术百科 > 详情

MSP430单片机AD转换LCD1602&TUBE显示

发布时间:2020-06-02 发布时间:
|
#include
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int
#define RS BIT0;
#define RW BIT1;
#define EN BIT2;
uint Volt0;            //设置电压变量
ulint Volttem0;
unsigned data0=0,data1=0;
uint ADresult0;     //设置A/D转换结果
uint a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管不带小数点译码
uint b[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//数码管带小数点译码
uchar c[]={"voltage:"};
uchar *fu="V",*dian=".";
uchar num[]={"0123456789"};  //电压值寻址
int value[4]={0,0,0,0};      //存放电压 (v/1000)
int counter=0;               //计数分时显示
void lcd_init();             //初始化LCD
void lcd_wcmd(uchar cmd);    //写LCD指令
void lcd_wdata(uchar data);  //写LCD数据
void lcd_pos(uchar pos);     //设置LCD显示位置
void LED_SH();
void LCD_SH();
void Adcvolt(void)           //进行电压转换时ADC12的初始化
{
  ADC12CTL0 &=~ENC;          //ENC为低电平,设置AD控制寄存器
  ADC12CTL0 |=ADC12ON+MSC;   //打开ADC12,可以进行AD转换,参考电压3.3V
  ADC12CTL1=CSTARTADD_0+CONSEQ_1+SHP;//单通道单次转换,采样频率源自采样定时器
  ADC12MCTL0=EOS+INCH_0;     //选择模拟输入通道1
  ADC12IE |=BIT0;            //AD转换中断允许
  ADC12CTL0 |=ENC;           //转换允许
  ADC12CTL0 |=ADC12SC;       //开始AD转换
}
void Delay(uint n)    //延时函数
{
  uint i,j;
  for(i=n;i>0;i--)
    for(j=100;j>0;j--) ;
}
void lcd_init() //初始化LCD
{
  lcd_wcmd(0x38);//16*2显示、5*7显示、8位数据显示
  Delay(1);
  lcd_wcmd(0x0c);//显示开,关光标
  Delay(1);
  lcd_wcmd(0x06);//移动光标
  Delay(1);
  lcd_wcmd(0x01);//清除LCD现实的内容
  Delay(1);
}
void lcd_wcmd(uchar cmd) //LCD写指令
{
  P3OUT &=~RS;
  P3OUT &=~RW;
  P3OUT &=~EN;
  P4OUT=cmd;
  P3OUT |=EN;
  Delay(1);
  P3OUT &=~EN;
}
void lcd_pos(uchar pos)  //设置显示位置
{
  lcd_wcmd(pos | 0x80);
}
void lcd_wdata(uchar data)//写入数据到LCD
{
  P3OUT |=RS;
  P3OUT &=~RW;
  P3OUT &=~EN;
  P4OUT = data;
  P3OUT |=EN;
  P3OUT &=~EN;

void LED_SH()                //LED_show
{
  P2OUT |=BIT1+BIT3+BIT4;
  P4OUT=0xff;
  P5OUT=0x01;              //选择第一位数码管
  P4OUT=b[value[0]];     //P4口显示采样值的个位
  Delay(3);
  P4OUT=0xff;   
  P5OUT=0x02;            //选择第二位数码管
  P4OUT=a[value[1]];//P4口显示采样值的第一位小数
  Delay(3);
  P4OUT=0xff; 
  P5OUT=0x04;       //选择第三位数码管
  P4OUT=a[value[2]];//P4显示采样值的第二位小数
  Delay(3);
  P4OUT=0xff;
  P5OUT=0x08;       //选择第四位数码管
  P4OUT=a[value[3]];//P4显示采样值的第三位小数
  Delay(3);
  P4OUT=0xff;
}
void LCD_SH()               //LCD_show
{
      uint i;
      P2OUT &=~(BIT1+BIT3+BIT4);//turn off 74HC573
      lcd_init();              //初始化LCD,以下为LCD显示部分
      Delay(1);
      lcd_wcmd(0x06);          //光标右移
      lcd_pos(0);              //设置显示位置为第一行的第一个字符
      for(i=0;c[i]!=';i++)
      {
        lcd_wdata(c[i]);       //写入数据、显示“Votalge:”
        Delay(1);
      }
      lcd_wdata(num[value[0]]);//写入整数
      Delay(1);
      lcd_wdata(*dian);        //写入小数点“.”
      Delay(1);
      for(i=1;i<4;i++)
      {
        lcd_wdata(num[value[i]]);//小如三位小数部分
        Delay(1+i*1);
      
      lcd_wdata(*fu);           //写入、显示字符"V”
      Delay(500);
      //lcd_wcmd(0x01);
      //Delay(10);
      //lcd_wcmd(0x04);
      //lcd_pos(8); 
}
void main(void)
{
 
  WDTCTL=WDTPW+WDTHOLD;  //关闭看门狗
  BCSCTL1 &=~XT2OFF;     //打开XT2CLK振荡器,ACLK=32768Hz
  BCSCTL1 |=SELM_2+SELS; //主时钟MCLK选择8MHz时钟,子时钟SMCLK=8MHz
  P4DIR=0xff;            //P4口外接数码管
  P4OUT=0xff;            //熄灭P4口数码管
  P3DIR=0xff;            //P3口低三位接LCD控制位
  P3OUT=0x07;            
  P5DIR=0xff;            //口外接数码管
  P5OUT=0xff;            //熄灭P5口数码管
  P2DIR |=BIT1+BIT3+BIT4;//P2.1 2.3 2.4为锁存器位
  P2OUT |=BIT1+BIT3+BIT4;//打开锁存器
  P2OUT &=~(BIT1+BIT3+BIT4);//关闭LED的锁存器
  P6SEL |=BIT0;          //P6.0用于模拟输入通道
  TACTL=TASSEL0+TACLR;   //TIMERA初始化,时钟源为ACLK=32768Hz
  CCTL0=CCIE;            //TIMERA中断使能
  CCR0=32767;             //设置比较值,定时为1S
  TACTL |=MC0;           //TIMERA,增计数模式,同时启动TIMERA
  Adcvolt();             //AD初始化
  _EINT();               //总中断使能
  while(1)
  {
    value[0]=Volt0/1000;  //数据存入,等待显示
    value[1]=Volt0/100;//数据存入,等待显示
    value[2]=Volt0/10; //数据存入,等待显示
    value[3]=Volt0;    //数据存入,等待显示
    if(counter<10) LED_SH();//LED/LCD交换显示 
    else LCD_SH();
  }
}
#pragma vector=ADC_VECTOR
__interrupt void ADC(void)//AD转换中断子程序
{
  ADresult0=ADC12MEM0;   //转换结果寄存器给了变量ADresult0
  Volttem0=((long)ADresult0*3300)/4095;//计算实际电压值
  Volt0=Volttem0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)//TIMERA中断子程序
{
  ADC12CTL0 |=ADC12SC;   //每隔一定时间进行一次转换
  counter++;             //计数用于交换显示
  if(counter==20) counter=0;
}
关键字:MSP430  单片机  AD转换  LCD1602&TUBE显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_24329.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
RFID的电子关锁系统设计与实现