www.pudn.com > lcd12864arry.zip > lcd.c


#include  
 
#include "hat500_zk12.h" 
#define uchar   unsigned char 
#define uint    unsigned int 
#define ulong   unsigned long 
 
 
#define BIT0                0X01 
#define BIT1                0X02 
#define BIT2                0X04 
#define BIT3                0X08 
#define BIT4                0X10 
#define BIT5                0X20 
#define BIT6                0X40 
#define BIT7                0X80 
 
#define LCD_DATA           DDRC 
#define LCD_DATA_IN        PINC 
#define LCD_DATA_OUT       PORTC 
 
 
#define LCD_CS2            PORTA.0 
#define LCD_CS1            PORTD.1 
#define LCD_EN             PORTD.2 
#define LCD_RS             PORTD.3 
#define LCD_RW             PORTD.4 
 
/***********常用操作命令和参数定义***************/ 
#define DISPON              0x3f    /*显示on        */ 
#define DISPOFF             0x3e    /*显示off       */ 
#define DISPFIRST           0xc0    /*显示起始行定义    */ 
#define SETX                0xB8    /*X定位设定指令(页)   */ 
#define SETY                0x40    /*Y定位设定指令(列)   */ 
 
 
extern uchar TotelStrCount;    //84个字符计数 
extern uchar row;              //行0,2,4,6 
extern uchar col;              //0-127 
extern uchar digit;            //为反相的位数 
extern uchar DisplayBuffer[];  //84个字符 
extern uchar ucDisplayStatus;  //=0不反相,=1时反相 
 
 
void LcdPutScreen(); 
void LcdPutLine(uchar ucRevReg); 
void Putedot(uchar flash *p, uchar ucRevReg); 
void Putcdot(uchar flash *p, uchar ucRevReg); 
void Lcmcls(void); 
void Wrdata(uchar X); 
void Wrcmd(uchar X); 
void Wtcom(void); 
void Lcminit(void); 
void LcdPutPara(); 
 
 
#pragma optsize- 
//显示参数调整行   digit为反相的位数 
void LcdPutPara( void ) 
{ 
    uchar i; 
    uchar flash *p; 
//写上半个字符 
    LCD_CS1 = 1; 
    LCD_CS2 = 0; 
    Wrcmd(row|SETX); 
    Wrcmd(col|SETY); 
    for (i = 0; i < 21; i++) 
    { 
        if (DisplayBuffer[TotelStrCount] == 0x80) 
        { 
            i++; 
            TotelStrCount++; 
            p = Tab_HZ12; 
            p += (uint)DisplayBuffer[TotelStrCount] * 24;                   /*每个字符24字节    */ 
            Putcdot(p,0); 
        } 
        else if(i == digit) 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12;                   /*每个字符24字节    */ 
            Putedot(p,1); 
        } 
        else 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12;                   /*每个字符24字节    */ 
            Putedot(p,0); 
        } 
        TotelStrCount++; 
    } 
    TotelStrCount -= 21; 
//写下半个字符 
    LCD_CS1 = 1; 
    LCD_CS2 = 0; 
    row++; 
    col = 1; 
    Wrcmd(row|SETX); 
    Wrcmd(col|SETY); 
    for (i = 0; i < 21; i++) 
    { 
        if (DisplayBuffer[TotelStrCount] == 0x80) 
        { 
            i++; 
            TotelStrCount++; 
            p = Tab_HZ12; 
            p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12;                   /*每个字符24字节    */ 
            Putcdot(p,0); 
        } 
        else if(i == digit) 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6;                   /*每个字符24字节    */ 
            Putedot(p,1); 
        } 
        else 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6;                   /*每个字符24字节    */ 
            Putedot(p,0); 
        } 
        TotelStrCount++; 
    } 
} 
 
 
 
/*显示四行 
  当ucDisplayStatus=1时第1行反相 
  当ucDisplayStatus=2时第2行反相 
  当ucDisplayStatus=3时第3行反相 
  第4行: 
    当ucDisplayStatus=4时反相 
    当ucDisplayStatus !=4 同时digit = 0xff 时不反相 
    当ucDisplayStatus !=4 同时digit = (0-21)时对应位反相 
*/ 
void LcdPutScreen() 
{ 
    col = 1; 
    row = 0; 
    TotelStrCount = 0; 
    if(ucDisplayStatus == 1) 
    { 
        LcdPutLine(1); 
    } 
    else 
    { 
        LcdPutLine(0); 
    } 
 
    col = 1; 
    row = 2; 
    if(ucDisplayStatus == 2) 
    { 
        LcdPutLine(1); 
    } 
    else 
    { 
        LcdPutLine(0); 
    } 
 
    col = 1; 
    row = 4; 
    if(ucDisplayStatus == 3) 
    { 
        LcdPutLine(1); 
    } 
    else 
    { 
        LcdPutLine(0); 
    } 
 
    col = 1; 
    row = 6; 
    if(ucDisplayStatus == 4) 
    { 
        LcdPutLine(1); 
    } 
    else if(digit == 0xff) 
    { 
        LcdPutLine(0); 
    } 
    else 
    { 
        LcdPutPara(); 
    } 
/* 
    清除第一列及最后一列 
*/ 
    LCD_CS1 = 1; 
    LCD_CS2 = 0; 
    for(row = 0; row < 8; row++) 
    { 
        col = 0; 
        Wrcmd(row|SETX); 
        Wrcmd(col|SETY); 
        Wrdata(0); 
    } 
    LCD_CS1 = 0; 
    LCD_CS2 = 1; 
    for(row = 0; row < 8; row++) 
    { 
        col = 63; 
        Wrcmd(row|SETX); 
        Wrcmd(col|SETY); 
        Wrdata(0); 
    } 
} 
 
void LcdPutLine(uchar ucRevReg) 
{ 
    uchar i; 
    uchar flash *p; 
//写上半个字符 
    LCD_CS1 = 1; 
    LCD_CS2 = 0; 
    Wrcmd(row|SETX); 
    Wrcmd(col|SETY); 
    for (i = 0; i < 21; i++) 
    { 
        if (DisplayBuffer[TotelStrCount] == 0x80) 
        { 
            i++; 
            TotelStrCount++; 
            p = Tab_HZ12; 
            p += (uint)DisplayBuffer[TotelStrCount] * 24;                   /*每个字符24字节    */ 
            Putcdot(p,ucRevReg); 
        } 
        else 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12;                   /*每个字符24字节    */ 
            Putedot(p,ucRevReg); 
        } 
        TotelStrCount++; 
    } 
    TotelStrCount -= 21; 
//写下半个字符 
    LCD_CS1 = 1; 
    LCD_CS2 = 0; 
    row++; 
    col = 1; 
    Wrcmd(row|SETX); 
    Wrcmd(col|SETY); 
    for (i = 0; i < 21; i++) 
    { 
        if (DisplayBuffer[TotelStrCount] == 0x80) 
        { 
            i++; 
            TotelStrCount++; 
            p = Tab_HZ12; 
            p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12;                   /*每个字符24字节    */ 
            Putcdot(p,ucRevReg); 
        } 
        else 
        { 
            p = TAB_ASC616; 
            p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6;                   /*每个字符12字节    */ 
            Putedot(p,ucRevReg); 
        } 
        TotelStrCount++; 
    } 
} 
 
/****************************************/ 
/*   半角字符点阵码数据输出     */ 
/****************************************/ 
void Putedot(uchar flash *p, uchar ucRevReg) 
{ 
    uchar i; 
    uchar cbyte; 
    if(ucRevReg == 0) 
    { 
       for(i = 0; i < 6; i++) 
       { 
           cbyte = *p++;         /*半个字符输出,6列  */ 
           if((col++) == 64) 
           {  //若COL>64则换右半屏,同时置列为0 
             LCD_CS1 = 0; 
             LCD_CS2 = 1; 
             Wrcmd(row|SETX); 
             Wrcmd(SETY); 
           } 
           Wrdata(cbyte);              /*写输出一字节      */ 
       } 
    } 
    else 
    { 
       for(i = 0; i < 6; i++) 
       { 
           cbyte = ~(*p++);         /*半个字符输出,6列  */ 
           if((col++) == 64) 
           {  //若COL>64则换右半屏,同时置列为0 
             LCD_CS1 = 0; 
             LCD_CS2 = 1; 
             Wrcmd(row|SETX); 
             Wrcmd(SETY); 
           } 
           Wrdata(cbyte);              /*写输出一字节      */ 
       } 
    } 
} 
 
 
/****************************************/ 
/*  全角字符点阵码数据输出      */ 
/****************************************/ 
void Putcdot(uchar flash *p, uchar ucRevReg) 
{ 
    uchar i; 
    uchar cbyte; 
    if(ucRevReg == 0) 
    { 
       for(i = 0; i < 12; i++) 
       { 
           cbyte = *p++;         /*半个字符输出,12列  */ 
           if((col++) == 64) 
           {  //若COL>64则换右半屏,同时置列为0 
             LCD_CS1 = 0; 
             LCD_CS2 = 1; 
             Wrcmd(row|SETX); 
             Wrcmd(SETY); 
           } 
           Wrdata(cbyte);              /*写输出一字节      */ 
       } 
    } 
    else 
    { 
       for(i = 0; i < 12; i++) 
       { 
           cbyte = ~(*p++);         /*半个字符输出,12列  */ 
           if((col++) == 64) 
           {  //若COL>64则换右半屏,同时置列为0 
             LCD_CS1 = 0; 
             LCD_CS2 = 1; 
             Wrcmd(row|SETX); 
             Wrcmd(SETY); 
           } 
           Wrdata(cbyte);              /*写输出一字节      */ 
       } 
    } 
} 
 
/****************************************/ 
/*  清屏,全屏幕清零        */ 
/****************************************/ 
void Lcmcls(void) 
{ 
    LCD_CS1 = 1; 
    LCD_CS2 = 1; 
    for(row = 0; row < 8; row++) 
    { 
        Wrcmd(row|SETX); 
        Wrcmd(col|SETY); 
        for(col = 0; col < 64; col++) 
        { 
           
             Wrdata(0);   //清屏 
           
        } 
    } 
} 
 
 
/****************************************/ 
/*  数据写输出          */ 
/****************************************/ 
 
void Wrdata(uchar X) 
{ 
    Wtcom(); 
    LCD_DATA_OUT = X;       /*数据输出到数据口 */ 
    LCD_RS = 1; 
    LCD_RW = 0; 
    LCD_EN = 1; 
    delay_us(1); 
    LCD_EN = 0; 
} 
 
/********************************/ 
/* 命令输出                     */ 
/********************************/ 
void Wrcmd(uchar X) 
{ 
    Wtcom(); 
    LCD_DATA_OUT = X;       /*数据输出到数据口 */ 
    LCD_RS = 0; 
    LCD_RW = 0; 
    LCD_EN = 1; 
    delay_us(1); //delay 
    LCD_EN = 0; 
} 
 
void Wtcom(void) 
{ 
    LCD_DATA = 0;   //置口为输入 
    LCD_DATA_OUT = 0xFF; 
    LCD_RS = 0; 
    LCD_RW = 1; 
    LCD_EN = 1; 
    delay_us(1); //delay 
    while(PINC.7); 
    LCD_EN = 0; 
    LCD_DATA = 0xff;   //置口为输出 
} 
 
/********************************/ 
/*液晶屏初始化                  */ 
/********************************/ 
void Lcminit(void) 
{ 
    LCD_DATA = 0xff;    //LCD数据口置为输出 
    LCD_DATA_OUT = 0xff;  //LCD数据口置为1 
 
    DDRA |= (1<<0);       //LCD_CS2置为输出 
    DDRD |= (1<<1);       //LCD_CS1置为输出 
    DDRD |= (1<<2);       //LCD_EN置为输出 
    DDRD |= (1<<3);       //LCD_RS置为输出 
    DDRD |= (1<<4);       //LCD_RW置为输出 
 
    LCD_CS1 = 1; 
    LCD_CS2 = 1; 
    LCD_EN = 0; 
    Wrcmd(DISPFIRST);   /*定义显示起始行为零    */ 
    Wrcmd(DISPON);      /*打开显示屏    */ 
    Wrcmd(DISPFIRST); 
    Wrcmd(DISPON); 
    Lcmcls();                   //LCD清屏 
    LCD_CS1 = 0; 
    LCD_CS2 = 0; 
} 
 
#pragma optsize+