/*--------------------------------------------------------------------------LPC213X之LCM1010 C++程序源代码 HotPower@126.com 2006.8.29 -------------------------------------------------------------------------------*/ #i nclude <LPC213XDEF.H> #define WDI P0_11//#define LCMDATA P0_6 //LCM1010数据端#define LCMWR P0_7 //LCM1010写#define LCMCS P0_8 //LCM1010片选 #define LedSegS1 0x20#define LedSegS2 0x40#define LedSegS3 0x80 #define LedSegS4 0x02#define LedSegS5 0x04#define LedSegS6 0x08 //HCBD GAEF#define LedSegA 0x04#define LedSegB 0x20#define LedSegC 0x40#define LedSegD 0x10#define LedSegE 0x02#define LedSegF 0x01#define LedSegG 0x08#define LedSegH 0x80 #define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF )#define LedChar1 ( LedSegB + LedSegC )#define LedChar2 (LedSegA + LedSegB + LedSegD + LedSegE + LedSegG)#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegG)#define LedChar4 ( LedSegB + LedSegC + LedSegF + LedSegG)#define LedChar5 (LedSegA + LedSegC + LedSegD + LedSegF + LedSegG)#define LedChar6 (LedSegA + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)#define LedChar7 (LedSegA + LedSegB + LedSegC )#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegF + LedSegG)#define LedCharA (LedSegA + LedSegB + LedSegC + LedSegE + LedSegF + LedSegG)#define LedCharB ( LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)#define LedCharC (LedSegA + LedSegD + LedSegE + LedSegF )#define LedCharD ( LedSegB + LedSegC + LedSegD + LedSegE + LedSegG)#define LedCharE (LedSegA + LedSegD + LedSegE + LedSegF + LedSegG)#define LedCharF (LedSegA + LedSegE + LedSegF + LedSegG) static const unsigned char LedTab[] ={ LedChar0, LedChar1, LedChar2, LedChar3, LedChar4, LedChar5, LedChar6, LedChar7, LedChar8, LedChar9, LedCharA, LedCharB, LedCharC, LedCharD, LedCharE, LedCharF}; void _delay_loop_(unsigned int);void _delay_loop_(unsigned int val){unsigned int i; for(i = 0; i < (val * 60); i ++);} class SystemObj {//系统类public: SystemObj(void);//SystemObj的构造函数public: void SystemInit(void); void WdtInit(void); void ClrWdt(void);}; class LcdObj {//系统显示菜单类public: LcdObj(void);//LcdObj的构造函数public: void LcdInit(void); void LcdBuffersClear(void); void LcdClear(void); void LcdOpen(void); void LcdClose(void); void LcdWrite(unsigned char, unsigned char); void LcdWriteCommand(unsigned char); void LcdWriteData(unsigned char, unsigned char); void LcdDisplay(unsigned char, unsigned char); void LcdDisplay(unsigned long); void LcdDisplay(unsigned short);public: unsigned char LcdBuffers[32];}; SystemObj::SystemObj(void){ SystemInit();} void SystemObj::SystemInit(void){ PINSEL->PIN_SEL0 = 0; PINSEL->PIN_SEL1 = 0; PINSEL->PIN_SEL2 = 0; P0->IODIR = 0; P1->IODIR = 0; WdtInit();} void SystemObj::WdtInit(void){ P0->IODIR |= (1 << WDI); // 设置WDI控制口为输出 } void SystemObj::ClrWdt(void){ P0->IOPIN ^= (1 << WDI);} LcdObj::LcdObj(void){ LcdInit();} void LcdObj::LcdClear(void){int i; for(i = 0;i < 32;i ++) { LcdWriteData(i, 0); }} void LcdObj::LcdBuffersClear(void){int i; for(i = 0;i < 32;i ++) { LcdBuffers[i] = 0; }} void LcdObj::LcdInit(void){ P0->IODIR |= (1 << LCMDATA) | (1 << LCMWR) | (1 << LCMCS); P0->IOSET = (1 << LCMDATA) | (1 << LCMWR) | (1 << LCMCS); LcdBuffersClear(); LcdWriteCommand(0x24); LcdWriteCommand(0x18); LcdWriteCommand(0x01); LcdWriteCommand(0x03); LcdClear();} void LcdObj::LcdOpen(void){ P0->IOSET = (1 << LCMDATA) | (1 << LCMWR) | (1 << LCMCS); _delay_loop_(1); P0->IOCLR = (1 << LCMCS);//打开片选信号 _delay_loop_(1);} void LcdObj::LcdClose(void){ P0->IOSET = (1 << LCMDATA) | (1 << LCMWR) | (1 << LCMCS);} void LcdObj::LcdWrite(unsigned char Data, unsigned char Count){int i;unsigned char val; val = 1 << (Count - 1); for(i = 0; i < Count; i ++) { P0->IOCLR = (1 << LCMWR);//拉低读写时钟 if (Data & val) { P0->IOSET = (1 << LCMDATA);//发送串行数据'1' } else { P0->IOCLR = (1 << LCMDATA);//发送串行数据'0' } _delay_loop_(1);//等待LCM1010读 P0->IOSET = (1 << LCMWR);//抬高读写时钟,打入串行数据 _delay_loop_(1);//等待LCM1010读 Data <<= 1; }} void LcdObj::LcdWriteCommand(unsigned char Command){ LcdOpen(); LcdWrite(0x04, 3); LcdWrite(Command, 8); LcdWrite(0x00, 1); LcdClose();} void LcdObj::LcdWriteData(unsigned char Addr, unsigned char Data){ LcdOpen(); LcdWrite(0x05, 3); LcdWrite(Addr, 5); LcdWrite(Data, 4); LcdClose();} void LcdObj::LcdDisplay(unsigned char LcdBit, unsigned char LcdData){unsigned char Addr; Addr = LcdBit; LcdOpen(); LcdWrite(0x05, 3); LcdWrite(Addr, 6); if (Addr) { LcdWrite((LcdData >> 4) & 0x0f, 4);//HCB0 LcdWrite((LcdData >> 1) & 0x0f, 4);//DGA0 LcdWrite((LcdData << 1) & 0x06, 4);//0EF0 } else { LcdWrite(LcdData >> 4, 4);//S1S2S3 0 LcdWrite(LcdData, 4);//S1S2S3 0 } LcdClose(); } void LcdObj::LcdDisplay(unsigned long val){unsigned char LcdData, temp;int i; LcdOpen(); LcdWrite(0x05, 3); LcdWrite(0x0e, 6); for(i = 0; i < 6; i ++) { temp = val % 10; val /= 10; LcdData = LedTab[temp]; LcdWrite((LcdData >> 4) & 0x0f, 4);//HCB0 LcdWrite((LcdData >> 1) & 0x0f, 4);//DGA0 LcdWrite((LcdData << 1) & 0x06, 4);//0EF0 } LcdClose();} void LcdObj::LcdDisplay(unsigned short val){unsigned char LcdData, temp;int i, div; div = 1000; LcdOpen(); LcdWrite(0x05, 3); LcdWrite(0x02, 6); for(i = 0; i < 4; i ++) { temp = (val / div) % 10; div /= 10; LcdData = LedTab[temp]; if (i >= 2) { LcdData |= LedSegH; } LcdWrite((LcdData >> 4) & 0x0f, 4);//HCB0 LcdWrite((LcdData >> 1) & 0x0f, 4);//DGA0 LcdWrite((LcdData << 1) & 0x06, 4);//0EF0 } LcdClose();} SystemObj Sys;LcdObj Lcd; int main(void){unsigned char K = LedSegS1;unsigned long S = 1234;unsigned short V = 0;// Lcd.LcdDisplay(0x00, LedSegS1 + LedSegS4 + LedSegS6);//S1 /* Lcd.LcdDisplay(0x02, LedChar1);//下LED1 Lcd.LcdDisplay(0x05, LedChar2);//下LED2 Lcd.LcdDisplay(0x08, LedSegH + LedChar3);//下LED3 Lcd.LcdDisplay(0x0b, LedSegH + LedChar4);//下LED4*//* Lcd.LcdDisplay(0x0e, LedCharF);//上LED5 Lcd.LcdDisplay(0x11, LedCharE);//上LED6 Lcd.LcdDisplay(0x14, LedCharD);//上LED7 Lcd.LcdDisplay(0x17, LedCharC);//上LED8 Lcd.LcdDisplay(0x1a, LedCharB);//上LED9 Lcd.LcdDisplay(0x1d, LedCharA);//上LED10*/ Lcd.LcdDisplay(0x00, K); Lcd.LcdDisplay(S); Lcd.LcdDisplay(V); while(1) { S ++; Lcd.LcdDisplay(S); if ((S % 100) == 0) { V ++; Lcd.LcdDisplay(V); if ((S % 500) == 0) { if (K == LedSegS1) { K = LedSegS2; } else if (K == LedSegS2) { K = LedSegS3; } else if (K == LedSegS3) { K = LedSegS4; } else if (K == LedSegS4) { K = LedSegS5; } else if (K == LedSegS5) { K = LedSegS6; } else K = LedSegS1; Lcd.LcdDisplay(0x00, K); } } Sys.ClrWdt(); _delay_loop_(500); __nop(); }}

评论