⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 LSD12864CT是一种图形点阵液晶显示器,它主要由行驱动器/ 列驱动器及128×64全点阵液晶显示器组成.可完成图形显示,也可以显示8×4个(16×16点阵)汉字.
💻 C
字号:
#include <Mega64.h>

#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+

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -