#include "config.h" INT8U code LcdFont[] = { CharZeroL, CharZeroH, //0 CharOneL, CharOneH, //1 CharTwoL, CharTwoH, //2 CharThreeL, CharThreeH, //3 CharFourL, CharFourH, //4 CharFiveL, CharFiveH, //5 CharSixL, CharSixH, //6 CharSevenL, CharSevenH, //7 CharEightL, CharEightH, //8 CharNineL, CharNineH, //9 }; volatile INT8U LcdFlag, LcdRefreshNum; volatile INT8U LcdBuff[SegSize]; //LCD初始化 void LcdInit(void) { LcdCom1Input(); //LCD控制IO初始化 LcdCom2Input(); LcdCom3Input(); LcdCom4Input(); LcdSeg1Init(0); LcdSeg2Init(0); LcdSeg3Init(0); LcdSeg4Init(0); LcdSeg5Init(0); LcdSeg6Init(0); LcdSeg7Init(0); LcdSeg8Init(0); LcdFlag = 0; MEM_Fill(LcdBuff, 0, SegSize); //初始化LCD缓存 } //LCD 段码输出 void LcdSegSet(INT8U Addr, INT8U Negate) { INT8U TempFlag; Negate = Negate & 0x01; //SEG1 TempFlag = (LcdBuff[0] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg1Out(TempFlag & 0x01); //输出SEG //SEG2 TempFlag = (LcdBuff[1] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg2Out(TempFlag & 0x01); //输出SEG //SEG3 TempFlag = (LcdBuff[2] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg3Out(TempFlag & 0x01); //输出SEG //SEG4 TempFlag = (LcdBuff[3] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg4Out(TempFlag & 0x01); //输出SEG //SEG5 TempFlag = (LcdBuff[4] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg5Out(TempFlag & 0x01); //输出SEG //SEG6 TempFlag = (LcdBuff[5] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg6Out(TempFlag & 0x01); //输出SEG //SEG7 TempFlag = (LcdBuff[6] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg7Out(TempFlag & 0x01); //输出SEG //SEG8 TempFlag = (LcdBuff[7] >> Addr)^Negate; //取得SEG与COM对应的位,并计算相应的相位 LcdSeg8Out(TempFlag & 0x01); //输出SEG } //LCD刷新显示 void LcdRefresh(void) { if (ReadLcdOnFlag() == 0) { LcdRefreshNum = 0x0f; } switch (LcdRefreshNum) { case 0: //COM1刷新,反相 LcdCom4Input(); //关COM4 LcdCom1Output(0); //COM1输出,反相 LcdSegSet(0, 0); //刷新SEG值,正相 LcdRefreshNum = 1; //切换到下一操作 break; case 1: //COM1刷新,正相 LcdCom1Output(1); //COM1输出,正相 LcdSegSet(0, 1); //刷新SEG值,反相 LcdRefreshNum = 2; //切换到下一操作 break; case 2: //COM2刷新,反相 LcdCom1Input(); //关COM1 LcdCom2Output(0); //COM2输出,反相 LcdSegSet(1, 0); //刷新SEG值,正相 LcdRefreshNum = 3; //切换到下一操作 break; case 3: //COM2刷新,正相 LcdCom2Output(1); //COM2输出,正相 LcdSegSet(1, 1); //刷新SEG值,反相 LcdRefreshNum = 4; //切换到下一操作 break; case 4: //COM3刷新,反相 LcdCom2Input(); //关COM3 LcdCom3Output(0); //COM3输出,反相 LcdSegSet(2, 0); //刷新SEG值,正相 LcdRefreshNum = 5; //切换到下一操作 break; case 5: //COM3刷新,正相 LcdCom3Output(1); //COM3输出,正相 LcdSegSet(2, 1); //刷新SEG值,反相 LcdRefreshNum = 6; //切换到下一操作 break; case 6: //COM4刷新,反相 LcdCom3Input(); //关COM4 LcdCom4Output(0); //COM4输出,反相 LcdSegSet(3, 0); //刷新SEG值,正相 LcdRefreshNum = 7; //切换到下一操作 break; case 7: //COM4刷新,正相 LcdCom4Output(1); //COM3输出,正相 LcdSegSet(3, 1); //刷新SEG值,反相 LcdRefreshNum = 0; //切换到下一操作 break; default: LcdRefreshNum = 0; break; } }