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

📄 lcd.c

📁 12864类型的字符型液晶显示程序 经过调试 可以应用 欢迎大家下载
💻 C
字号:
#include "Lcd.h"
#include "Flash.h"
#include "Timer.h"

#ifdef _USE_LCD

const char HexTbl[16] ={
            '0','1','2','3',
            '4','5','6','7',
            '8','9','A','B',
            'C','D','E','F'
            };
            
uchar  BackLight_Cnt = 0;
            
void Lcd_LightOn()
{
    BackLight_Cnt = 0;
    LCD_BKLIGHT_ON;
    Start_TimerB();
}


/*************************************************************
LCD读写操作
*************************************************************/
void lcd_write_ctl(uchar txdata)
{  
   LCD_RD_DIS;
   _NOP();
   LCD_A0_CTL;                                      //写控制字
   _NOP();
   LCD_CS_EN;                                       //片选使能
   _NOP();
   LCD_WR_EN;                                       //写使能
   _NOP();
   P4OUT = txdata;                                  //送数据
   _NOP();
   LCD_WR_DIS;                                      //写无效
   _NOP();
   LCD_CS_DIS;                                      //片选无效
   _NOP();
   LCD_A0_DATA;
}

void lcd_write_data(uchar txdata)
{  
   LCD_RD_DIS;
   _NOP();
   LCD_A0_DATA;                                     //写数据
   _NOP();
   LCD_CS_EN;                                       //片选使能
   _NOP();
   LCD_WR_EN;                                       //写使能
   _NOP();
   P4OUT = txdata;                                  //送数据
   _NOP();
   LCD_WR_DIS;                                      //写无效
   _NOP();
   LCD_CS_DIS;                                      //片选无效
   _NOP();
   LCD_A0_CTL;
}

//字符为 16 x8, 显示在row 和 row+1行
void Lcd_Char(uchar row, uchar col, uchar code)
{
   uchar i;
   ulong addr = ASCII_OFFSET + (((int)code)<<4);
   
   lcd_write_ctl(0x10+(col>>4));                    //配置高4字节
   lcd_write_ctl(col & 0x0f);                         //配置低4字节
   lcd_write_ctl(0xb1+row);
   
   for(i=0;i<8;i++)
   { 
     lcd_write_data(Spi_Read(addr++));                      //写数据
   }
  
   lcd_write_ctl(0x10+(col>>4));                    //配置高4字节
   lcd_write_ctl(col & 0x0f);                         //配置低4字节
   lcd_write_ctl(0xb1+row);
   
   for(i=0;i<8;i++)
   { 
     lcd_write_data(Spi_Read(addr++));                      //写数据
   } 
   
   lcd_write_ctl(0xAf);                             //display on(显示开关的控制)
}


void Lcd_Hz(uchar row, uchar col, uint code)
{
   uchar i;
   ulong addr = ( (code>>8)-0xA1 )*94 + ( (code&0xFF)-0xA1 );
   addr = HANZI_OFFSET + (addr<<5);
   
   lcd_write_ctl(0x10 + (col>>4) );           //配置高4字节
   lcd_write_ctl(col & 0x0f);                 //配置低4字节
   lcd_write_ctl(0xb0 + row);
   
   for(i=0;i<16;i++)
   { 
     lcd_write_data(Spi_Read(addr++));       //写数据
   }
   
   lcd_write_ctl(0x10 + (col>>4));           //配置高4字节
   lcd_write_ctl(col & 0x0f);                //配置低4字节
   lcd_write_ctl(0xb1 + row);
   
   for(i=0;i<16;i++)
   { 
     lcd_write_data(Spi_Read(addr++));      //写数据
   }
   
   lcd_write_ctl(0xAf);                      //display on
}

void Lcd_Show(uchar row, uchar col, uchar *str)
{
    uchar rw=row,cl=col;
    uchar *pStr=str;
    while (*pStr)
    {
        if ((*pStr)&0x80)
        {
            if (cl>112) {rw+=2;cl=0;}//换行
            if (rw>6)  break;
            //汉字
            Lcd_Hz(rw,cl,((*pStr)<<8) + ((*(pStr+1))&0xFF) );
            pStr+=2;
            cl += 16;
        }else{
            if (cl>120) {rw+=2;cl=0;}//换行
            if (rw>6)  break;
            Lcd_Char(rw,cl, *pStr);
            ++pStr;
            cl += 8;
        }
    }
}


//字符为 16 x8, 显示在row 和 row+1行
void Lcd_CharN(uchar row, uchar col, uchar code)
{
   uchar i;
   ulong addr = ASCII_OFFSET + (((int)code)<<4);
   
   lcd_write_ctl(0x10+(col>>4));                    //配置高4字节
   lcd_write_ctl(col & 0x0f);                         //配置低4字节
   lcd_write_ctl(0xb0+row);
   
   for(i=0;i<8;i++)
   { 
     lcd_write_data(~Spi_Read(addr++));                      //写数据
   }
  
   lcd_write_ctl(0x10+(col>>4));                    //配置高4字节
   lcd_write_ctl(col & 0x0f);                         //配置低4字节
   lcd_write_ctl(0xb1+row);
   
   for(i=0;i<8;i++)
   { 
     lcd_write_data(~Spi_Read(addr++));                      //写数据
   } 
   
   lcd_write_ctl(0xAf);                             //display on
}


void Lcd_HzN(uchar row, uchar col, uint code)
{
   uchar i;
   ulong addr = ( (code>>8)-0xA1 )*94 + ( (code&0xFF)-0xA1 );
   addr = HANZI_OFFSET + (addr<<5);
   
   lcd_write_ctl(0x10 + (col>>4) );           //配置高4字节
   lcd_write_ctl(col & 0x0f);                 //配置低4字节
   lcd_write_ctl(0xb0 + row);
   
   for(i=0;i<16;i++)
   { 
     lcd_write_data(~Spi_Read(addr++));       //写数据
   }
   
   lcd_write_ctl(0x10 + (col>>4));           //配置高4字节
   lcd_write_ctl(col & 0x0f);                //配置低4字节
   lcd_write_ctl(0xb1 + row);
   
   for(i=0;i<16;i++)
   { 
     lcd_write_data(~Spi_Read(addr++));      //写数据
   }
   
   lcd_write_ctl(0xAf);                      //display on
}

void Lcd_ShowN(uchar row, uchar col, uchar *str)
{
    uchar rw=row,cl=col;
    uchar *pStr=str;
    while (*pStr)
    {
        if ((*pStr)&0x80)
        {
            if (cl>112) {rw+=2;cl=0;}//换行
            if (rw>6)  break;
            //汉字
            Lcd_HzN(rw,cl,((*pStr)<<8) + ((*(pStr+1))&0xFF) );
            pStr+=2;
            cl += 16;
        }else{
            if (cl>120) {rw+=2;cl=0;}//换行
            if (rw>6)  break;
            Lcd_CharN(rw,cl, *pStr);
            ++pStr;
            cl += 8;
        }
    }
}
//初始化LCD
void Init_LCD(void)                          
{
    P4DIR = 0XFF;                    // LCD 输出
    P5DIR |= 0X3F;                  // P5.4 背光
                                    // P5.5 复位                 
    P5OUT |= BIT5;                  //结束复位

    lcd_write_ctl(0xa3);            //lcd bias set (1/7)
    lcd_write_ctl(0xa0);            //ADC normal
    lcd_write_ctl(0xc8);            //output scan normal direction(COM正向显示)
    
    //lcd_write_ctl(0x2c);          //VC ON
    //lcd_write_ctl(0x2e);          //VR ON
    lcd_write_ctl(0X2f);            //VF ON 
    lcd_write_ctl(0xa6);            //Display normal
    lcd_write_ctl(0xf8);            //Booster ratio set
    lcd_write_ctl(0);               //2x 3x 4x
    Delay(5);
    
    lcd_write_ctl(0x81);                             
    Delay(5);
    lcd_write_ctl(0x05);            //对比度调整                           
    Delay(5);
    
    lcd_write_ctl(0x26);            //设置电阻分压
    Delay(5);
    
    lcd_write_ctl(0xaf);            //display on  
    lcd_write_ctl(0x40);            //first line = COM1
    Delay(5);
}

void Lcd_Clear(uchar pattern)
{
    uint i,j;
    uchar tempdata=0xb0;
    
    for(j=0;j<8;j++)
    {
        lcd_write_ctl(0x10);
        lcd_write_ctl(0);              //设置为第一列
        
        lcd_write_ctl(tempdata++);     //第一列
        
        for(i=0;i<128;i++)
        {
            lcd_write_data(pattern);
        }
    }
}

void Lcd_ClearRow(uchar row ,uchar pattern)
{
    uint i;
   
    lcd_write_ctl(0x10);
    lcd_write_ctl(0);                                 //设置为第一列
    lcd_write_ctl(0xB0 + row);                        //指定行
    for(i=0;i<128;i++)
    {
        lcd_write_data(pattern);
    }
}

void Lcd_Hex(uchar row, uchar col, uchar val)
{
    Lcd_Char(row,col, HexTbl[(val>>4)&0xF] );
    Lcd_Char(row,col+8, HexTbl[val&0xF] );
}

#endif

⌨️ 快捷键说明

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