10114|32

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

今天学习了TI学堂ADC10,写了一个单通道AD转换并通过1602显示的程序 [复制链接]


/*********************************************************************
*
*
*****************************************************************/
#include <intrinsics.h>
#include <msp430g2553.h>
#include <msp430.h>
/*****************************************************

                                                     端口定义

 ****************************************************/
#define LCD_EN_PORT P1OUT    //以下2个要设为同一个口
#define LCD_EN_DDR P1DIR
#define LCD_RS_PORT P1OUT    //以下2个要设为同一个口
#define LCD_RS_DDR P1DIR
#define LCD_DATA_PORT P2OUT  //以下3个要设为同一个口
#define LCD_DATA_DDR P2DIR   //一定要用高4位
#define LCD_RS BIT6
#define LCD_EN BIT7
#define LCD_DATA    BIT7|BIT6|BIT5|BIT4   //4位数据线连接模式
/***************************************************

                                                          预定义函数

 **************************************************/
void LCD_init(void);
void LCD_init_first(void);
void LCD_en_write1(void);  //上升沿使能
void LCD_en_write2(void);  //下降沿使能
void LCD_write_command(unsigned char command);
void LCD_write_data(unsigned char data);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s);
void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
void lcd_diaoyong();
void lcd_diaoyong1();
unsigned char LCDBuf1[]={"0123456789"};   //第一行要显示的内容
unsigned char LCDBuf2[]={"DY:.V"};     //第二行要显示的内容
unsigned int j=0,i=0;
unsigned int  shuzhi=0,qushu=0;
/********************************************

                                               主函数

 *******************************************/

void main()
{
   WDTCTL = WDTPW + WDTHOLD;     // 关闭看门狗

    ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
    ADC10CTL1 = INCH_1;                         // input A1模拟信号输入选择通道A1即p1.1
    ADC10AE0 |= 0x02;                           // PA.1 ADC option select使p1.1允许AD模拟输入信号
    P1DIR |= 0x01;                              // Set P1.0 to output direction

    LCD_init_first();
    LCD_init();


    TA0CCTL0 = CCIE;                             // CCR0 1ms中断
    TA0CCR0 = 312;
    TA0CTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
    //_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

    TA1CCTL0 = CCIE;                             // CCR0 1ms中断
    TA1CCR0 = 312;
    TA1CTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
    _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt


    while(1)
    { if(j>100)
     {
       shuzhi=qushu*35/10;
       lcd_diaoyong();
       j=0;
      }
    }
}

/********************************************

lcd子函数

 *******************************************/
void lcd_diaoyong()
{
  LCD_write_char(0,0,LCDBuf2[0]);
  LCD_write_char(1,0,LCDBuf2[1]);
  LCD_write_char(2,0,LCDBuf2[2]);
  i=(shuzhi/1000);
  LCD_write_char(3,0,LCDBuf1);

  LCD_write_char(4,0,LCDBuf2[3]);

  i=(shuzhi-i*1000)/100;
  LCD_write_char(5,0,LCDBuf1);

  i=(shuzhi/10)%10;
  LCD_write_char(6,0,LCDBuf1);

  LCD_write_char(7,0,LCDBuf2[4]);
}
/********************************************

lcd子函数1

 *******************************************/
void lcd_diaoyong1()
{
  LCD_write_char(0,1,LCDBuf2[0]);
  LCD_write_char(1,1,LCDBuf2[1]);
  LCD_write_char(2,1,LCDBuf2[2]);
  i=(shuzhi/1000);
  LCD_write_char(3,1,LCDBuf1);

  LCD_write_char(4,1,LCDBuf2[3]);

  i=(shuzhi-i*1000)/100;
  LCD_write_char(5,1,LCDBuf1);

  i=(shuzhi/10)%10;
  LCD_write_char(6,1,LCDBuf1);

  LCD_write_char(7,1,LCDBuf2[4]);
}
/********************************************
 *
定时器Timer0_A

 *******************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A (void)
{
  ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start开始转换
        qushu=ADC10MEM;
        j++;
       __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
       __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}
/********************************************

定时器Timer1_A

 *******************************************/
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A (void)
{
  P1OUT ^= 0x01;
      __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

/********************************************

 

 *******************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

/********************************************

            LCD液晶操作函数

 *******************************************/

void LCD_init_first(void)         //LCD1602液晶初始化函数(热启动)
{
        delay_nms(500);
     LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
     LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
     LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出

        delay_nms(50);
        LCD_write_command(0x30);
        delay_nms(50);
        LCD_write_command(0x30);
        delay_nms(5);
        LCD_write_command(0x30);
        delay_nms(500);

}

/*****************************************
 *
 *             LCD1602液晶初始化函数
 *
 ****************************************/
void LCD_init(void)
{
 delay_nms(500);
 LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
 LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
 LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出

 delay_nms(500);

 LCD_write_command(0x28);  //4位数据接口
 delay_nms(50);
 LCD_write_command(0x28);  //4位数据接口
 delay_nms(50);
    LCD_write_command(0x28);  //4位数据接口
 delay_nms(50);
    LCD_en_write2();
    delay_nms(50);
 LCD_write_command(0x28); //4位数据接口
 delay_nms(500);
 LCD_write_command(0x01); //清屏
 LCD_write_command(0x0c); //显示开,关光标,不闪烁
    LCD_write_command(0x06); //设定输入方式,增量不移位
 delay_nms(50);
 

}

/*****************************************
 *
 *             液晶使能上升沿
 *
 ****************************************/

void LCD_en_write1(void)
{
    LCD_EN_PORT&=~LCD_EN;
    delay_nus(10);
    LCD_EN_PORT|=LCD_EN;
}

/*****************************************
 *
 *             液晶使能下降沿
 *
 ****************************************/
void LCD_en_write2(void)
{
   LCD_EN_PORT|=LCD_EN;
   delay_nus(10);
   LCD_EN_PORT&=~LCD_EN;
}

/*****************************************
 *
 *               写指令函数
 *
 ****************************************/
void LCD_write_command(unsigned char command)
{
   delay_nus(16);
   P2SEL=0x00;
   LCD_RS_PORT&=~LCD_RS; //RS=0
   LCD_en_write1();
   LCD_DATA_PORT&=0X0f; //清高四位
   LCD_DATA_PORT|=command&0xf0; //写高四位

   delay_nus(16);
   LCD_en_write2();
   command=command<<4; //低四位移到高四位
   LCD_en_write1();
   LCD_DATA_PORT&=0x0f; //清高四位
   LCD_DATA_PORT|=command&0xf0; //写低四位
   LCD_en_write2();
}

/*****************************************
 *
 *               写数据函数
 *
 ****************************************/
void LCD_write_data(unsigned char data)
{
   delay_nus(16);
   P2SEL=0x00;
   LCD_RS_PORT|=LCD_RS;      //RS=1
   LCD_en_write1();          //E上升沿
   LCD_DATA_PORT&=0X0f;      //清高四位
   LCD_DATA_PORT|=data&0xf0; //写高四位
   delay_nus(16);
   LCD_en_write2();
   data=data<<4;             //低四位移到高四位
   LCD_en_write1();
   LCD_DATA_PORT&=0X0f;      //清高四位
   LCD_DATA_PORT|=data&0xf0; //写低四位
   LCD_en_write2();
}

/*****************************************
 *
 *               写地址函数
 *
 ****************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
   unsigned char address;
   if (y == 0) address = 0x80 + x;
   else address = 0xc0 + x;
   LCD_write_command( address);
}

/*****************************************
 *
 *LCD在任意位置写字符串,列x=0~15,行y=0,1
 *
 ****************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
 LCD_set_xy( X, Y ); //写地址
    while (*s)          //写显示字符
    {
      LCD_write_data( *s );
      s++;
    }
}

/*****************************************
 *
 *     LCD在任意位置写字符,列x=0~15,行y=0,1
 *
 ****************************************/

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data)
{
   LCD_set_xy( X, Y ); //写地址
   LCD_write_data( data);
}

/*****************************************
 *
 *               1us延时函数
 *
 ****************************************/

void delay_1us(void)
{
   asm("nop");
}

/*****************************************
 *
 *               N us延时函数
 *
 ****************************************/
void delay_nus(unsigned int n)
{
   unsigned int i;
   for (i=0;i<n;i++)
   delay_1us();
}

/*****************************************
 *
 *               1ms延时函数
 *
 ****************************************/
void delay_1ms(void)
{
   unsigned int i;
   for (i=0;i<1140;i++);
}

/*****************************************
 *
 *               N ms延时函数
 *
 ****************************************/
void delay_nms(unsigned int n)
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}

 

 

这个程序大家可以参考一下,结果是对的,但我觉得方法可能有点问题。

最新回复

屌爆了  详情 回复 发表于 2014-7-22 17:25

点评

唔唔~~  详情 回复 发表于 2012-7-25 14:01
为什么要用AD转换呢?不是直接可以接1602然后就可以演示了吗??  详情 回复 发表于 2012-7-19 10:53
unsigned char LCDBuf1[]={\"0123456789\"}; LCD_write_char(3,1,LCDBuf1); 这个貌似会报错吧  详情 回复 发表于 2012-7-18 22:30
问题上没有,就是要的IO口太多了  详情 回复 发表于 2012-7-17 11:13
请教一下,你的430和1602是直接传信的吗?为什么我的430和12864直接传送指令无法显示?是电平的原因吗?  详情 回复 发表于 2012-7-15 15:16
 
点赞 关注(1)

回复
举报

2056

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
很不错啊!!
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

4
 
xuexila
 
 
 

回复

216

帖子

0

TA的资源

纯净的硅(初级)

5
 
给力啊楼主!
还有,弱弱的问一句,我的浏览器怎么看不了视频啊???
 
 
 

回复

216

帖子

0

TA的资源

纯净的硅(初级)

6
 
哈哈,回完帖瞬间就可以咯,之前一直看不了啊。看来回帖有好处啊!!!
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 千里千寻 的帖子

看不了什么视频?是咱们TI大学堂的视频吗?还是普通的网页视频
 
 
 

回复

216

帖子

0

TA的资源

纯净的硅(初级)

8
 

回复 7楼 董宝君 的帖子

嗯嗯,是TI大学堂的视频,之前一直看不了,现在已经能看咯!!!
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

9
 
参考一下~
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 楼主 董宝君 的帖子

请教一下,你的430和1602是直接传信的吗?为什么我的430和12864直接传送指令无法显示?是电平的原因吗?
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

11
 

回复 楼主 董宝君 的帖子

问题上没有,就是要的IO口太多了
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

12
 
那lcd怎么和单片机端口接啊??有图没有啊 、???
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

13
 
 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 楼主 董宝君 的帖子

unsigned char LCDBuf1[]={"0123456789"};       LCD_write_char(3,1,LCDBuf1); 这个貌似会报错吧

点评

怎么改啊  详情 回复 发表于 2013-8-11 21:20
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

15
 
我来学习~~~~
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

16
 

回复 楼主 董宝君 的帖子

为什么要用AD转换呢?不是直接可以接1602然后就可以演示了吗??
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

17
 
是单通道单次转换还是多次 怎么没见设置呢

点评

没见设置的就是用的默认设置的  详情 回复 发表于 2012-8-2 22:44
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
有个问题就是,用直流电源输入,输出十分不稳定啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
那个怎么看啊? 我进去了有的看不了啊
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

20
 

学习ax

好东西正好学习一下感谢楼主
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表