#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(); //初始化LCDvoid 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单片机A/D转换LCD1602&TUBE显示》的相关信息,《MSP430单片机A/D转换LCD1602&TUBE显示》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《MSP430单片机A/D转换LCD1602&TUBE显示》的详细说明。
简介:本文给大家分享了一个MSP430单片机AD转换LCD1602&TUBE显示的源代码。
提醒:《MSP430单片机A/D转换LCD1602&TUBE显示》最后刷新时间 2024-03-14 00:57:53,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《MSP430单片机A/D转换LCD1602&TUBE显示》该内容的真实性请自行鉴别。