在MSP430F435上通过的3-MUX模式LCD显示程序[分享]

楼主
在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]
1楼
好东西
2楼
3-Mux 是什么?
3楼
请问显示的时候那个
LCDMEM[0]显示的5,他是0位还是第三位?还有为什么要a*2,和a*2+1呢?
LCDMEM这个是什么寄存器。书上没有写,头文件看半天也不知道定义什么
4楼
LCDMEM[0]的内容直接送到管脚s0,s1上,至于在数码管上显示第几位则由数码管确定。关于LCDMEM的映射关系可以再CPU用户手册LCD部分查到,等你看明白了映射关系,就明白为啥要左移,右移了。
5楼
能给我发下CPU用户手册吗?我邮箱是xiaoming302206@163.com  
先谢谢了。

电脑版 Page created in 0.0625 seconds width 2 queries.