在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]