您的当前位置:首页正文

430f4152LCD配置代码

来源:华拓网


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

// MSP430F449 LCD interface

//

// Description:

// Numerical Direct Drive LCD interface

//

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

#include

#include \"delay.h\"

#include \"lcd.h\"

//emailquestionsto:****************

void setupLCD(void) {

#ifdef LCD_STATIC_4_5

// Basic Timer

BTCTL = (BTCTL & 0xA7) | BT_fLCD_DIV256; // 128 Hz LCD

// LCD on static. All LCD pins muxed to LCD

LCDCTL = LCDON | LCDSON | LCDSTATIC | LCDSG0_7;

#else

#ifdef LCD_4MUX_7_5

// Basic Timer

BTCTL = (BTCTL & 0xA7) | BT_fLCD_DIV256; // 128 Hz LCD

// LCD on static. All LCD pins muxed to LCD

LCDCTL = LCDON | LCDSON | LCD4MUX | LCDSG0_7;

P5SEL = 0xFF;

P5DIR = 0x1F;

#else

#ifdef LCD_4MUX_SOFTBAUGH

// Basic Timer

BTCTL = (BTCTL & 0xA7) | BT_fLCD_DIV64; // 512 Hz LCD

// LCD on static. All LCD pins muxed to LCD

LCDCTL = LCDON | LCDSON | LCD4MUX | LCDSG0_7;

P5SEL = 0xFF;

P5DIR = 0x1F;

#else

LCDCTL = 0x00;

#endif

#endif

#endif

}

//emailquestionsto:****************

void lcd_all(char on) {

unsigned char *i;

unsigned char mask = 0x00;

if(on) mask = 0xff;

for(i=(char *)LCDM1_;i <= (char *)LCDM20_;i++) *i = mask;

}

//emailquestionsto:****************

char lcd_seg(char segment, char on) {

unsigned char *pMem;

unsigned char mask = 0x01;

#ifdef LCD_STATIC_4_5

if(segment > S_ARROW) return 1;

if(segment & 0x01) mask = 0x10;

pMem = (char *)(LCDM1_ + (segment>>1));

#else

#ifdef LCD_4MUX_7_5

if(segment > (CHAR_7 | SEG_7B)) return 1;

mask <<= (segment & 0x07);

pMem = (char *)(LCDM1_ + (segment>>3));

#else

#ifdef LCD_4MUX_SOFTBAUGH

if(segment > 0xa0) return 1;

mask <<= (segment & 0x07);

pMem = (char *)(LCDM1_ + (segment>>3));

#endif

#endif

#endif

if(on) *pMem |= mask;

else *pMem &= ~mask;

return 0;

}

//emailquestionsto:****************

char lcd_seg_toggle(char segment) {

unsigned char *pMem;

unsigned char mask = 0x01;

#ifdef LCD_STATIC_4_5

if(segment > S_ARROW) return 1;

if(segment & 0x01) mask = 0x10;

pMem = (char *)(LCDM1_ + (segment>>1));

#else

#ifdef LCD_4MUX_7_5

if(segment > (CHAR_7 | SEG_7B)) return 1;

mask <<= (segment & 0x07);

pMem = (char *)(LCDM1_ + (segment>>3));

#else

#ifdef LCD_4MUX_SOFTBAUGH

if(segment > 0xa0) return 1;

mask <<= (segment & 0x07);

pMem = (char *)(LCDM1_ + (segment>>3));

#endif

#endif

#endif

if(*pMem & mask) *pMem &= ~mask;

else *pMem |= mask;

return 0;

}

//emailquestionsto:****************

// place increments from LS(0) to MS(4,7,etc.)

char lcd_char(char loc, char value) {

unsigned char i;

#ifdef LCD_4MUX_SOFTBAUGH

unsigned int map;

#else

unsigned char map;

#endif

unsigned char place = loc;

#ifdef LCD_STATIC_4_5

if(place < 4) {

place = (3-place) * 8;

if((value >= 'a') && (value <= 'z'))

value -= ('a' - 'A');

switch(value & 0x7f) {

case ' ' : map = 0x00; break;

case '0' : map = 0x3f; break;

case '1' : map = 0x06; break;

case '2' : map = 0x5b; break;

case '3' : map = 0x4f; break;

case '4' : map = 0x66; break;

case '5' : map = 0x6d; break;

case '6' : map = 0x7d; break;

case '7' : map = 0x07; break;

case '8' : map = 0x7f; break;

case '9' : map = 0x6f; break;

case 'A' : map = 0x77; break;

case 'B' : map = 0x7c; break;

case 'C' : map = 0x39; break;

case 'D' : map = 0x5e; break;

case 'E' : map = 0x79; break;

case 'F' : map = 0x71; break;

case 'G' : map = 0x6f; break;

case 'H' : map = 0x76; break;

case 'I' : map = 0x06; break;

case 'J' : map = 0x0e; break;

case 'K' : map = 0x78; break;

case 'L' : map = 0x38; break;

case 'M' : map = 0x37; break;

case 'N' : map = 0x54; break;

case 'O' : map = 0x3f; break;

case 'P' : map = 0x75; break;

case 'Q' : map = 0x61; break;

case 'R' : map = 0x50; break;

case 'S' : map = 0x6d; break;

case 'T' : map = 0x31; break;

case 'U' : map = 0x1c; break;

case 'V' : map = 0x3e; break;

case 'Y' : map = 0x6e; break;

case 'Z' : map = 0x5b; break;

default : return 1;

}

// Turn on the DP is specified

map |= (value & 0x80);

} else if(place == 4) {

switch(value & 0x7f) {

case '0' : lcd_seg(S_4,0); break;

case '1' : lcd_seg(S_4,1); break;

default : return 1;

}

lcd_seg(S_DP4,(value & 0x80));

return 0;

} else return 1;

i = 0;

if(loc == 0) i=1;

for(; i<8; i++) {

lcd_seg(place++,map & 0x01);

map >>= 1;

}

#else

#ifdef LCD_4MUX_7_5

if(place < 7) {

place = place<<3;

switch(value & 0x7f) {

case '0' : map = 0xb7; break;

case '1' : map = 0x12; break;

case '2' : map = 0x8f; break;

case '3' : map = 0x1f; break;

case '4' : map = 0x3a; break;

case '5' : map = 0x3d; break;

case '6' : map = 0xbd; break;

case '7' : map = 0x13; break;

case '8' : map = 0xbf; break;

case '9' : map = 0x3f; break;

default : return 1;

}

if(value & 0x80) map |= 0x40;

} else if(place == 7) {

switch(value & 0x7f) {

case '0' :

lcd_seg(CHAR_7 | SEG_7B,0);

lcd_seg(CHAR_7 | SEG_7C,0);

break;

case '1' :

lcd_seg(CHAR_7 | SEG_7B,1);

lcd_seg(CHAR_7 | SEG_7C,1);

break;

default : return 1;

}

lcd_seg(CHAR_7 | SEG_ALT,(value & 0x80));

return 0;

} else return 1;

for(i=0; i<8; i++) {

lcd_seg(place++,map & 0x01);

map >>= 1;

}

#else // #ifdef LCD_4MUX_7_5

#ifdef LCD_4MUX_SOFTBAUGH

if(place < 7) {

place <<= 1;

place += CHAR_0;

place <<= 3;

if((value >= 'a') && (value <= 'z'))

value -= ('a' - 'A');

switch(value & 0x7f) {

case ' ' : map = 0x0000; break;

case '-' : map = 0x0402; break;

case '0' : map = 0x62f4; break;

case '1' : map = 0x0060; break;

case '2' : map = 0x24d2; break;

case '3' : map = 0x00f2; break;

case '4' : map = 0x4462; break;

case '5' : map = 0x44b2; break;

case '6' : map = 0x64b2; break;

case '7' : map = 0x0284; break;

case '8' : map = 0x64f2; break;

case '9' : map = 0x44f2; break;

case 'A' : map = 0x0266; break;

case 'B' : map = 0x6411; break;

case 'C' : map = 0x2412; break;

case 'D' : map = 0x0272; break;

case 'E' : map = 0x6490; break;

case 'F' : map = 0x6480; break;

case 'G' : map = 0x60b2; break;

case 'H' : map = 0x6462; break;

case 'I' : map = 0x0198; break;

case 'J' : map = 0x0070; break;

case 'K' : map = 0x6405; break;

case 'L' : map = 0x6010; break;

case 'M' : map = 0x6864; break;

case 'N' : map = 0x6861; break;

case 'O' : map = 0x60f0; break;

case 'P' : map = 0x64c2; break;

case 'Q' : map = 0x60f1; break;

case 'R' : map = 0x64c3; break;

case 'S' : map = 0x08b2; break;

case 'T' : map = 0x0188; break;

case 'U' : map = 0x6070; break;

case 'V' : map = 0x0861; break;

case 'W' : map = 0x6261; break;

case 'X' : map = 0x0a05; break;

case 'Y' : map = 0x0904; break;

case 'Z' : map = 0x0294; break;

default : return 1;

}

if(value & 0x80) map |= CSEG_DP;

} else return 1;

for(i=0; i<16; i++) {

lcd_seg(place++,map & 0x01);

map >>= 1;

}

#endif // #ifdef LCD_4MUX_SOFTBAUGH

#endif // #ifdef LCD_4MUX_7_5

#endif // #ifdef LCD_STATIC_4_5

return 0;

}

//emailquestionsto:****************

char lcd_word(signed int value,char decimal) {

char signif = 0;

lcd_all(0);

if(value < 0) {

#ifdef LCD_STATIC_4_5

lcd_seg(Sminus,1);

#else

#ifdef LCD_4MUX_SOFTBAUGH

lcd_seg(SEG_MINUS,1);

#endif

#endif

value *= -1;

}

#ifdef LCD_STATIC_4_5

if(value >= 20000) {

lcd_char(2,'0');

lcd_char(1,'L');

return 1;

} else {

lcd_char(3, (value/1000)%10 + '0');

lcd_char(2, (value/100)%10 + '0');

lcd_char(1, (value/10)%10 + '0');

lcd_char(0, (value%10) + '0');

lcd_seg(S_4,value >= 10000);

}

#else // #ifdef LCD_STATIC_4_5

lcd_char(4, (value/10000) + '0');

lcd_char(3, (value/1000)%10 + '0');

lcd_char(2, (value/100)%10 + '0');

lcd_char(1, (value/10)%10 + '0');

lcd_char(0, (value%10) + '0');

#endif

switch(decimal) {

case 0: break;

#ifdef LCD_4MUX_SOFTBAUGH

case 1: lcd_seg(CHAR_0*8 + CSEG_DP,1); break;

case 2: lcd_seg(CHAR_1*8 + CSEG_DP,1); break;

case 3: lcd_seg(CHAR_2*8 + CSEG_DP,1); break;

case 4: lcd_seg(CHAR_3*8 + CSEG_DP,1); break;

case 5: lcd_seg(CHAR_4*8 + CSEG_DP,1); break;

case 6: lcd_seg(CHAR_5*8 + CSEG_DP,1); break;

#else

case 1: lcd_seg(S_DP3,1); break;

case 2: lcd_seg(S_DP2,1); break;

case 3: lcd_seg(S_DP1,1); break;

#endif

default: return 1;

}

return 0;

}

/*

char lcd_mini_word(signed int value,char decimal) {

}

*/

// void lcd_scroll(char *pStr); function

void lcd_scroll(char *pStr) {

signed char position, end;

char *pCurr,

#ifdef LCD_4_5

*pFirst = pStr-3;

#else

*pFirst = pStr-6;

#endif

for(; (pFirst < pStr) || (*pFirst != 0x0); pFirst++) {

// update the display

#ifdef LCD_4_5

for(end = 0, position = 3, pCurr = pFirst; position != -1; position--) {

#else

for(end = 0, position = 6, pCurr = pFirst; position != -1; position--) {

#endif

if((pCurr < pStr) || end)

lcd_char(position,' ');

else if(*pCurr == 0x0) {

end = 1;

lcd_char(position,' ');

} else

lcd_char(position,*pCurr);

pCurr++;

}

// wait some time so it's readable

wait_ms(LCD_SCROLL_STEP_TIME);

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容