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

📄 lcd_driver.c

📁 ST7565_Driver_menu.rar
💻 C
字号:
/*
控制器:st7565
串行驱动方式,唯一要注意的一点就是WR和RD这两个引脚虽然用不到,但是要接地,
否则无法正常显示。当时调了很久。不知道其他厂家的是否也这样。 

*/
#include <AT89X52.H>
#include <INTRINS.H>

#include  "LCD_Driver.h"
//字库
#include "hzk.h"

//当前字符显示的位置
//unsigned char  Lcd_Charcter_CurrentX,Lcd_Charcter_CurrentY;
//当前像素显示位置
unsigned char  Lcd_CurrentX,Lcd_CurrentY;
//图像反色显示 0 否 1是
bit LCD_DisplayReserve_Driver; 

//定义LCD显示的全局变量
#define CS_Port                 P3_0
#define A0_Port                 P3_1
#define SI_Port                 P3_2
#define SCL_Port                P3_3
#define RST_Port                P3_4
enum PINDefine{CS,A0,SI,SCL,RST};

//设置某一位
void  SETBit(unsigned char PIN)
{

switch (PIN)
{
case CS :
CS_Port=1;
break;

case A0 :
A0_Port=1;
break;

case SI :
SI_Port=1;
break;

case SCL :
SCL_Port=1;
break;

case RST :
RST_Port=1;
break;
}


}

//清某一位
void  CLRBit(unsigned char PIN)
{
switch (PIN)
{
case CS :
CS_Port=0;
break;

case A0 :
A0_Port=0;
break;

case SI :
SI_Port=0;
break;

case SCL :
SCL_Port=0;
break;

case RST :
RST_Port=0;
break;
}
}


/***********************************
** 函数名称: Delay
** 功能描述: 延时时间=(n*9+17)*12/F
** 输 入: n
** 输 出 : 无
** 全局变量:无
** 调用模块: 无
******************************************/

void LCD_DelayMS(unsigned int n)
{
    while(n--);
	return;
}

//--------------------------------------------------------------------------
//串口移位输出
//--------------------------------------------------------------------------
void LCDShiftWrite(char datain)
{ 
unsigned char i;
unsigned char Series,Temp;
Series = datain;

for(i=8;i>0;i--)
{
CLRBit(SCL); //SCL=0
Temp=Series & 0x80;
if(Temp)
{
SETBit(SI);//SI=1
}
else 
{
CLRBit(SI);//SI=0
}
SETBit(SCL); //SCL=1 
Series = Series << 1; 
}

}
/***********************************
** 函数名称: Write_Data
** 功能描述: 传送数据
** 输 入: dat
** 输 出 : 无
** 全局变量:无
** 调用模块: Busy,
******************************************/

void Write_Data(unsigned char dat) 
{
CLRBit(CS); //CS=0
SETBit(A0); //A0=1,数据
LCDShiftWrite(dat); 
SETBit(CS); //CS=1;
return;			    
}

/***********************************
** 函数名称: Write_Instruction
** 功能描述: 传送命令
** 输 入: dat
** 输 出 : 无
** 全局变量:无
** 调用模块: Busy,
******************************************/

void Write_Instruction(unsigned char cmd)
{
CLRBit(CS); //CS=0
CLRBit(A0); //A0=0,命令
LCDShiftWrite(cmd);
SETBit(CS); //CS=1;
return;
}

//==============================================================================高一级函数
//设置像素显示坐标(x:0-127,y:0-7)
void LCD_setpos_Driver(unsigned char Lx,unsigned char Ly)
{
 Write_Instruction(0xB0|Ly);// Page(Row)
 Write_Instruction((0x10|(Lx>>4)));
 Write_Instruction((0x0f&Lx));
 Lcd_CurrentX=Lx;
 Lcd_CurrentY=Ly;

}
/*
//设置像素显示坐标(x:0-127)
void LCD_setposX_Driver(unsigned char Lx)
{
 Write_Instruction((0x10|(Lx>>4)));
 Write_Instruction((0x0f&Lx));
}
//设置像素显示坐标(y:0-7)
void LCD_setposY_Driver(unsigned char Ly)
{
 Write_Instruction(0xB0|Ly);// Page(Row)
}
*/

//设置字符位置(x:0-8,y:0-3)
void LCD_setCharpos_Driver(unsigned char Lx,unsigned char Ly)
{
//当前像素显示位置
Lcd_CurrentX=Lx*16;
Lcd_CurrentY=Ly*2;
LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
}


//清屏
void LCD_CLS_Driver(char value)  
{  
unsigned char i,n;  

for(i=0;i<9;i++)  
{  
LCD_setpos_Driver(0,i);  
          
for(n=0;n<128;n++)  
{  
Write_Data(value);  
}
}

}
//显示BMP图片
void LCD_DisplayBMP_Driver(unsigned char *PicData)  //信息显示
{
unsigned char BMPwithLen,BMPheightLen;
unsigned char BMPwith; 
unsigned char BMPheight;
BMPwith=*PicData;
PicData++;
BMPheight=(*PicData)/8;
PicData++; 

//BMPLen=BMPheight/8*BMPwith

for(BMPheightLen=0;BMPheightLen<BMPheight;BMPheightLen++)
{
   Lcd_CurrentY++;
   LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
    for(BMPwithLen=0;BMPwithLen<BMPwith;BMPwithLen++)
    {
        //图像反色显示 0 否 1是
        if (LCD_DisplayReserve_Driver==0)
        {
        Write_Data(*PicData);
        }
        else
        {
        Write_Data(~(*PicData));
        }
        PicData++;
    };
}

}

void LCD_disp_DisplayImage_Driver(unsigned char * PicData,unsigned char PicLen)  //信息显示
{

for(;PicLen>0;PicLen--)
{

//图像反色显示 0 否 1是
if (LCD_DisplayReserve_Driver==0)
{
Write_Data(*PicData);
}
else
{
Write_Data(~(*PicData));
}


PicData++;
};

}




//显示一个Unicode
void LCD_disp_Putchar_Driver(unsigned int uChar) 
{  
unsigned int i;
unsigned char *p;
   if(uChar<128)
   {
      //for(i=0;i != ENGLISHCHARNUMBER;i++)
      //{  
      //if(uChar==EnglishCode[i][0])
         //{  
         p=(uChar-0x20)*(ENGLISHCHARLegth)+&nAsciiDot[0];
         
            LCD_disp_DisplayImage_Driver(p, ENGLISHCHARLegth/2);
            Lcd_CurrentY++;
            //设置像素显示坐标(y:0-7)
	        LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
            LCD_disp_DisplayImage_Driver(p+(ENGLISHCHARLegth/2),(ENGLISHCHARLegth/2));
            Lcd_CurrentY--;
            Lcd_CurrentX+=8;
            //设置像素显示坐标(y:0-7)
	        LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
            //break;
         //}
      //}
    }
        else
        {
      for(i=0;i!=GB_ZK_NUM;i++)
      {  
      if(uChar==(GB_16[i].Index[0]*256+GB_16[i].Index[1]))
         {  
            //分别在两页显示
            LCD_disp_DisplayImage_Driver(GB_16[i].Msk,(CHINESECHARlegth/2));
            Lcd_CurrentY++;
            //设置像素显示坐标(y:0-7)
	        LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
            LCD_disp_DisplayImage_Driver(GB_16[i].Msk+(CHINESECHARlegth/2),(CHINESECHARlegth/2));
            Lcd_CurrentY--;
            Lcd_CurrentX+=16;
            //设置像素显示坐标(y:0-7)
	        LCD_setpos_Driver(Lcd_CurrentX,Lcd_CurrentY);
            break;
         }
      }
      }
}


//图像反色显示 0 否 1是,执行此命令后的所有操作均是按照设置显示
void LCD_disp_SetReverse_Driver(unsigned char ReverseTrue)
{
//图像反色显示 0 否 1是
if  (ReverseTrue==0)
{
LCD_DisplayReserve_Driver=0;
}
else
{
LCD_DisplayReserve_Driver=1;
} 
}
//对比度设置
void Set_Contrast_Control_Register(unsigned char Level)
{
unsigned char Num,Temp1,Temp2;
Temp1 = (Level/16)<<4;
switch(Level%16)
{
case 10: 
Temp2 = 0x0a;
break;
case 11: 
Temp2 = 0x0b;
break;
case 12: 
Temp2 = 0x0c;
break;
case 13: 
Temp2 = 0x0d;
break;
case 14: 
Temp2 = 0x0e;
break;
case 15: 
Temp2 = 0x0f; 
break;
default:
Temp2 = Level%16;
break;
}
Num = Temp1|Temp2;
Write_Instruction(0x81);
Write_Instruction(Num);
}




//初始化LCD屏
void init_LCD_Driver()
{

CLRBit(RST); // RST=0;
LCD_DelayMS(50);
SETBit(RST); // RST=1;
LCD_DelayMS(50);
Write_Instruction(0xa2); //lcd bias select 1/9 BIAS
Write_Instruction(0xa1); //ADC select,REVERSE 127-->0(a0,a1)
Write_Instruction(0xc0); //com select,NORMAL 0-->63(c8,c0)
Write_Instruction(0x26); //RESISTOR RATIO
Write_Instruction(0x81); //ELECTRONIC VOLUME mode setting 100B 对比度命令
Write_Instruction(0x10); //Set reference voltagel register 对比度数值
Write_Instruction(0x2f); //power control(VB,VR,VF=1,1,1)
LCD_DelayMS(50);
Write_Instruction(0xaf); //set display on
Write_Instruction(0xf8); //set booster ratio
Write_Instruction(0x00); 
//当前像素显示位置
Lcd_CurrentX=0;
Lcd_CurrentY=0;
//图像反色显示 0 否 1是
LCD_DisplayReserve_Driver=0; 
}

⌨️ 快捷键说明

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