在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验2122
    • 文章9
    • 注册2008-12-15
    在MSP430F435上通过的3-MUX模式LCD显示程序[分享]
    微控论坛原创 作者:swler
    [CODE]
    这里将我调试通过的3-MUX模式LCD显示程序贴出来,供大家参考,3-mux模式工作的C程序例程几乎看不见,手册上给出的是用汇编写的程序,对我们习惯使用C语言的人员不太方便。硬件的结构与4-MUX相同,软件的重点是如何将要显示的内容送到LCDMEM[I]中去,与4-MUX模式不同,3-MUX模式每位字符占用1.5个LCDMEM,而且相互交错,编写程序之前一定要将数码管上每段和内存的对应关系找到。另外特别提示一下,如果硬件连接是从CPU管脚的S0开始,则起始内存地址就是LCDMEM[0],程序中反复使用了移位指令。
    //******************************************************************************
    //  ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
    //  //* An external watch crystal between XIN & XOUT is required for ACLK *//      
    //
    //                MSP430F435
    //            -----------------
    //        /|\|              XIN|-
    //         | |                 | 32kHz
    //         --|RST          XOUT|-
    //           |                 |
    //         +-|R33           S0 |     -----------------
    //        1m |              -  |--> |       LCD       |
    //         +-|R23           S11|     -----------------
    //        1m |             COM0|-----|||
    //         +-|R13          COM1|------||
    //        1m |             COM2|-------|
    //         +-|R03          COM3|
    //         | |                 |  
    //        Vss
    //
    //*****************************************************************************
    #include  <msp430x43x.h>

    unsigned int value;
    void Display(unsigned int intdata);
    #define Lowbattery   0x04             //电池电量低报警
    #define Dot  0x40                     //小数点
    #define precision  0.0008             //AD转换过来的每个二进制数对应的电压值
                                          //根据各自的系统可以重新确定
    char digit[20] =
    {
      0x53,  /* "0" LCD segments a+b+c+d+e+f */
      0x03,
      0x00,  /* "1" */
      0x03,
      0x72,  /* "2" */
      0x01,  
      0x70,  /* "3" */
      0x03,
      0x21,  /* "4" */
      0x03,
      0x71,  /* "5" */
      0x02,
      0x73,  /* "6" */
      0x02,
      0x10,  /* "7" */
      0x03,
      0x73,  /* "8" */
      0x03,
      0x71,  /* "9" */
      0x03
    };

    //*****************************************************************************
    //清LCD屏
    void LcdClr(void)
    { unsigned char i;
      for (i=0; i<31; i++)
      {
       LCDMEM[I] = 0x00;                        // CLR LCDMEM
      }
    }

    //*****************************************************************************
    //LCD初始化
    void LcdInit(void)
    { LCDCTL = LCDON + LCD3MUX + LCDSG0_1;      // LCD on, 3-Mux, segments S0-S17
      BTCTL = BT_fLCD_DIV128;                   // Set LCD frame freq = ACLK/128
      P5SEL = 0xFC;                             // Select P5.2-7 as Com and Rxx
      LcdClr();
    }

    //*****************************************************************************
    void main(void)
    {
      volatile unsigned int i;                 
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      FLL_CTL0 |= XCAP14PF;                     // Configure load caps
      for (i = 0; i < 10000; i++);              // Delay for 32 kHz crystal to
                                                // stabilize
      LcdInit();
     //以下编写你的应用程序  
     
      value=5981;                               //变量value的值是要现实的内容  
      Display(value);
      for (;;);
    }

    //******************************************************************************
    //说明:数据转换和显示更新
    void Display(unsigned int intdata)
    {  unsigned long temp;
       unsigned int a,b,c,d;
      //voltage =(float)(intdata*precision);      //将AD转换得到的值转换成对应的电压值
      //temp = (unsigned long)(voltage*1000);     //电压值单位为V
      temp=intdata;                               //作为调试,将变量value的值直接显示
      a=temp/1000;
      LCDMEM[0]=digit[a*2];
      LCDMEM[1]=digit[a*2+1];
      b=temp%1000;
      b=b/100;
      LCDMEM[1] |= digit[b*2]<<4;
      LCDMEM[2]  = digit[b*2]>>4;
      LCDMEM[2] |= digit[b*2+1]<<4;
      c=temp%100 ;
      c=c/10;
      LCDMEM[3]  = digit[c*2];
      LCDMEM[4]  = digit[c*2+1];
      d=temp%10;
      LCDMEM[4] |= digit[d*2]<<4;
      LCDMEM[5]  = digit[d*2]>>4;
      LCDMEM[5] |= digit[d*2+1]<<4;
      //LCDMEM[4] |= Dot;                  //单位ml
      LCDMEM[1] |= Dot;                    //单位l
      LCDMEM[4] |= Lowbattery;             //电池电量低报警
    }
    //******************************************************************************
    [/CODE][/I][/I]
    [ 此贴最后由DC在2009-3-3 22:53:05编辑过 ]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分24
      • 经验1199
      • 文章74
      • 注册2008-05-30
      好东西
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 财富1
        • 积分7
        • 经验545
        • 文章31
        • 注册2007-04-27
        3-Mux 是什么?
        微控网感谢您的参与
        在线情况
        4
        • 头像
        • 级别
          • 积分9
          • 经验4873
          • 文章97
          • 注册2008-09-07
          请问显示的时候那个
          LCDMEM[0]显示的5,他是0位还是第三位?还有为什么要a*2,和a*2+1呢?
          LCDMEM这个是什么寄存器。书上没有写,头文件看半天也不知道定义什么
          微控网感谢您的参与
          在线情况
          5
          • 头像
          • 级别
            • 积分3
            • 经验2122
            • 文章9
            • 注册2008-12-15
            LCDMEM[0]的内容直接送到管脚s0,s1上,至于在数码管上显示第几位则由数码管确定。关于LCDMEM的映射关系可以再CPU用户手册LCD部分查到,等你看明白了映射关系,就明白为啥要左移,右移了。
            微控网感谢您的参与
            在线情况
            6
            • 头像
            • 级别
              • 财富1
              • 积分4
              • 经验1727
              • 文章33
              • 注册2009-06-15
              能给我发下CPU用户手册吗?我邮箱是xiaoming302206@163.com  
              先谢谢了。
              微控网感谢您的参与
              Powered by LeadBBS 9.2 .
              Page created in 0.1719 seconds with 5 queries.