历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2021年04月07日 | MSP430单片机A/D转换LCD1602&TUBE显示

2021-04-07 来源:eefocus

简介:本文给大家分享了一个MSP430单片机AD转换LCD1602&TUBE显示的源代码。

#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;

}


推荐阅读

史海拾趣

星海公司的发展小趣事

面对数字化时代的挑战和机遇,星海公司开始积极推进数字化转型。公司引入先进的生产管理系统和数字化营销手段,提高生产效率和市场响应速度。同时,星海公司还积极探索新的商业模式和合作方式,以适应不断变化的市场需求。展望未来,星海公司将继续秉承“质量为本、创新为魂”的发展理念,致力于成为全球领先的乐器制造商和音乐教育服务提供商。

Cembre SPA公司的发展小趣事

为了满足全球客户的需求,Cembre SPA制定了国际化战略,开始在全球范围内拓展业务。公司设立了多个海外分支机构,与当地的合作伙伴建立了紧密的合作关系。通过全球化的销售网络和本地化的服务支持,Cembre SPA的产品逐渐打入了国际市场,赢得了全球客户的信赖。

Helium公司的发展小趣事

Helium公司成立于2013年,由Shawn Fanning、Amir Haleem和Sean Carey共同创立。在创立初期,Helium专注于物联网无线网络技术的研究,但并未迅速获得市场关注。这一时期,电子行业正处于创新与转型阶段,物联网作为新兴领域展现出巨大潜力。Helium团队预见到了物联网的发展趋势,但由于缺乏明确的商业模式,其网络发展并未大规模铺开。然而,这段时期的积累为Helium后续的技术突破和市场拓展奠定了坚实基础。

Don Connex Electronics Co Ltd公司的发展小趣事

Don Connex Electronics Co Ltd成立于上世纪90年代初,当时电子行业正处于快速发展阶段。公司的创始人李明凭借其在半导体领域的深厚技术背景,带领团队研发出了一款高性能的电源管理芯片,这款芯片在业界引起了广泛关注。该芯片以其低功耗、高效率的特性,迅速在市场上打开了局面,为公司的初创阶段奠定了坚实的基础。

百蓉(ECE)公司的发展小趣事

百蓉公司不满足于仅在国内市场发展,开始积极拓展国际市场。他们参加了多个国际电子展览,与多家国际知名企业建立了合作关系。通过深入了解不同国家和地区的市场需求,百蓉针对性地推出了符合当地消费者需求的产品,逐渐在国际市场上占据了一席之地。

Dau Semiconductor Inc公司的发展小趣事

在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。

问答坊 | AI 解惑

B题讨论

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 有对B题感兴趣的吗?进来一下,大家一起讨论一下  …

查看全部问答>

用MAX712芯片自制的充电器

一、线路图:   1、rsense电阻取1欧姆时。充电电流为250MA,0.5欧姆时,电流为520MA,2N6109用TIP42代替,SHUNT电阻为限流电阻,大约1K,其他参数如图。   转绢流后充电机充电电流是原来的1/8还是1/16取决于PGM3脚的接法:   Rsense电阻两 ...…

查看全部问答>

vb程序调试正常运行错误

本人刚学VB,在写一个串口数据采集大的小软件,刚开始就遇到了问题,以下代码,我在调试时都正常运行,能正确获得返回数据,可是生成exe文件后,程序却没反应,也没有错误信息出现!就是没有数据,求高手帮忙! Public gSend As Boolean  &nb ...…

查看全部问答>

ARM9的ADC怎么和外部电路连接

请问ARM9的ADC怎么和外部的放大电路连接?…

查看全部问答>

求高手帮忙MagicAMR2200A上开发WAV播放器

如题,求高手帮忙。。一点头绪都没啊。。 …

查看全部问答>

quartus功能仿真出现致命错误。 Fatal error: Module: quartus_sim.exe Exception: Access Violat

*** Fatal error: Module: quartus_sim.exe Exception: Access Violation Stack Trace: 01a314e6: SDB_DFF_INFO::set_last_clock_value() + 0x34 (tsm_sdb) 01a03144: EDS_ENGINE::propagate() + 0xb0 (TSM_EDS) 01a03321: EDS_ENGINE::propaga ...…

查看全部问答>

FTF印象_4

名字很有吸引力的一个报告(Designint the \"impossible\" Tablet),但不知道什么原因而取消未能进行, 可以通过资料看看是介绍什么的。…

查看全部问答>

关于LED驱动电源的谐波测试必备

杭州远方PF9811,才两千多块钱; 2-50次谐波都能测出来; 按IEC61000-3-2,谐波要测到39次…

查看全部问答>

LM4871/CSC8002低电压3W功率放大器IC应用电路原理图说明

LM4871/CSC8002 是一个BTL 桥连接的音频功率放大器.它能够在5V 电源电压下给一个3Ω 负载提供THD 小于10%、平均值为3W 输出功率。在关闭模式下电流的典型值为0.6uA. LM4871/CSC8002 是为提供大功率,高保真音频输出而专门设计的.它仅仅需要少量 ...…

查看全部问答>

TPM驱动可以在ucosii下吗?

最近在研究将TPM(安全模块)应用到ARM7上,要在ucosii里添加TPM的驱动,但是现在都是linux下的驱动。有没有大侠可以指点下,可以在ucosii中加TPM的驱动吗?…

查看全部问答>