【eZ430-Chronos】LCD引脚与MCU对应引脚转换程序

来源:互联网 发布:二次安防网络拓扑 编辑:程序博客网 时间:2024/05/16 07:45

由于eZ430-Chronos中的LCD接线与常规的不一样本来应该

MCU 引脚                                               LCD引脚

COM0                                                     com0

COM1                                                     com1

COM2                                                     com2

COM3                                                     com3

S0                                                            s0

....                                                             ....

 

但是查看eZ430-Chronos的原理图会发现并不是一一对应的如图

 

 

这样的话直接使用LCD手册里的表格(如下图)就会不对,所以需要建立一个转换函数,转到正确去。

 

 

如果直接使用这个表格里的数据肯定不对,因为硬件连线并不是一一对应的。通过下面这个函数就可以直接使用上表的数据了,简化了转换来转换去的麻烦。

 

void setLcdMemBit(unsigned char COMx,unsigned char Segx){unsigned char comx;unsigned char segx;unsigned char * baseAddr;//由于LCD的接线和MCU的接线没有按顺序接所以需要转换switch(COMx){case 0:comx=3;break;case 1:comx=2;break;case 2:comx=1;break;case 3:comx=0;break;default:comx=COMx;}switch(Segx){case 1:segx=5;break;case 2:segx=3;break;case 4:segx=5;break;case 5:segx=1;break;case 9:segx=10;break;case 10:segx=11;break;case 11:segx=9;break;default:segx=Segx;}baseAddr=(unsigned char *)0x0A20;//LCD 内存基地址baseAddr+=segx/2;//计算对应的内存地址*baseAddr|=1<<(comx+(segx%2)*4);//计算对应的位(bit),并将该为置位}

 

下面是一个完整的工程代码

//******************************************************************************//  eZ430 chronos hello world//  Description: initializes lcd module and shows the string 'hi earth' on the//               lcd display becuase 'hello world' is too long//  Author: Felix Genicio//******************************************************************************#include  "cc430x613x.h"#include <string.h>void setLcdMemBit(unsigned char COMx,unsigned char Segx);void main(void){unsigned char * lcdmem;char i;    // Clear entire display memoryLCDBMEMCTL |= LCDCLRBM + LCDCLRM;//清除LCD闪烁内存、清除LCD内存// LCD_FREQ = ACLK/16/8 = 256Hz,其中ACLK=32768Hz// Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD onLCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;// LCB_BLK_FREQ = ACLK/8/4096 = 1Hz ,闪烁失能LCDBBLKCTL = (LCDBLKDIV0 + LCDBLKDIV1 + LCDBLKDIV2)|(LCDBLKPRE0 + LCDBLKPRE1) |  LCDBLKMOD0;// I/O to COM1~COM3 outputs,其中COM0默认就是用作COM0P5SEL |= (BIT5 | BIT6 | BIT7);P5DIR |= (BIT5 | BIT6 | BIT7);// Activate LCD outputLCDBPCTL0 = 0xFFFF;  // Select LCD segments S0-S15LCDBPCTL1 = 0x00FF;  // Select LCD segments S16-S22setLcdMemBit(0,6);setLcdMemBit(1,13);//LCDM2=0x08;//LCDM1=0x08;//LCDM4=0x08;// LCD_B Base Address is 0A00H page 30 y in SALS554 document// show 'h'lcdmem = (unsigned char *)0x0A21;*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT1+BIT6+BIT0));// show 'i'lcdmem = (unsigned char *)0x0A22;*lcdmem = (unsigned char)(*lcdmem | (BIT2));// show 'E'lcdmem = (unsigned char *)0x0A2B;*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT0+BIT3));// show 'A'lcdmem = (unsigned char *)0x0A2A;*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));// show 'r'lcdmem = (unsigned char *)0x0A29;*lcdmem = (unsigned char)(*lcdmem | (BIT6+BIT5));// show 't'lcdmem = (unsigned char *)0x0A28;*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT3));// show 'h'lcdmem = (unsigned char *)0x0A27;*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT2));  __no_operation();  // For debugger}void setLcdMemBit(unsigned char COMx,unsigned char Segx){unsigned char comx;unsigned char segx;unsigned char * baseAddr;//由于LCD的接线和MCU的接线没有按顺序接所以需要转换switch(COMx){case 0:comx=3;break;case 1:comx=2;break;case 2:comx=1;break;case 3:comx=0;break;default:comx=COMx;}switch(Segx){case 1:segx=5;break;case 2:segx=3;break;case 4:segx=5;break;case 5:segx=1;break;case 9:segx=10;break;case 10:segx=11;break;case 11:segx=9;break;default:segx=Segx;}baseAddr=(unsigned char *)0x0A20;//LCD 内存基地址baseAddr+=segx/2;//计算对应的内存地址*baseAddr|=1<<(comx+(segx%2)*4);//计算对应的位(bit),并将该为置位}