微控论坛原创 作者: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] |