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

📄 st7529.c

📁 ST7529为一32级灰度液晶显示屏驱动芯片
💻 C
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------
主题:ST7529液晶屏驱动程序 
编写人:龙尽文
程序功能:本程序为ST7529驱动程序 
LCM驱动IC型号为:ST7529  点阵数为193*91,工作于16BIT模式。左下角为坐标原点,COL的第一条为固定
   ICON显示。
MCU型号为:STC89LEXX
晶振频率为11.0592MHz
//本程序在液晶屏上显示各种大小的“字模”及一幅不是很好看的画,呵呵。
;连线图:
  ST7529工作于16bits 8080工作方式。
;*LCM---MCU*    *LCM---MCU*     *LCM----MCU*	  *LCM----MCU*	   LCM----MCU*	 LCM---MCU*
;*DB0---P1.0*   *DB4---P1.4*    ;*DB8---P2.0*   *DB12--P2.4*     *AO-----P3.3*   RESET-P3.5
;*DB1---P1.1*   *DB5---P1.5*    ;*DB9---P2.1*   *DB13--P2.5*     *RD-----P3.7*
;*DB2---P1.2*   *DB6---P1.6*    ;*DB10--P2.2*   *DB14--P2.6*     *WR-----P3.6*
;*DB3---P1.3*   *DB7---P1.7*    ;*DB11--P2.3*   *DB15--P2.7*      CS1----P3.4*
-------------------------------------------------*/
/*#pragma src   /*生成ASM文件开关,必要时打开 */
#include <reg52.h>
#include <stdarg.h>
#include<INTRINS.H>

/***********液晶显示器接口引脚定义***************/
sbit LCM_RES = P3^5;  //LCD复位引脚 
sbit CE_LCM=P3^4;   //LCM的CE控制端口
sbit Alcm = P3^3;  //LCD命令和数据控制口,为1时是读写数据;为0时写入命令
sfr  Data1= 0x90;  //数据口低8位为P1
sfr  Data2= 0xA0;  //数据口高8位为P2 

/***********LCM常用操作命令和参数定义***************/
#define  EXT_IN  0x30 //EXT=0 进入到常规命令输入
#define  EXT_OUT 0x31 //EXT=1 
//LCM EXT=0时常用操作命令和参数定 
#define  DISPON  0xAf //显示on  
#define  DISPOFF 0xAe //显示off 
#define  DISNOR  0xA6 //常规显示 
#define  DISINV  0xA7 //反显 
#define  COMSCN  0xBB // COM扫描方式设定 1条指令。
#define  DISCTRL 0xCA //显示控制指令 3条副加指令 
#define  SLPIN   0x95 //进入到睡眠模式 
#define  SLPOUT  0x94 //退出睡眠模式 
#define  LASET   0x75 //行地址设定 2字节地址 
#define  CASET   0x15 //列地址设定 2字节地址 
#define  DATSDR  0xBC //数据扫描位置设定 3字节 
#define  RAMWR   0x5C //写入数据到RAM中 
#define  RAMRD   0x5D //从RAM中读取数据 
#define  PTLIN   0xA8 //进入到区域显示指令 2字节 
#define  PTLOUT  0xA9 //退出区域显示状态 
#define  RMWIN   0xE0 //进入到读修改写模式指令 
#define  RMWOUT  0xEE //退出读修改写模式指令 
#define  ASCSET  0xAA //区域滚动设定 4字节 
#define  SCSTART 0xAB //滚动初始设定  1字节 
#define  OSCON   0xD1 //打开内部晶振指令 
#define  OSCOFF  0xD2 //关闭内部晶振指令 
#define  PWRCTRL 0x20 //电源控制指令 1字节 
#define  VOLCTRL 0x81 //EC控制指令 2字节 
#define  VOLUP   0xD6 //EC加1指令 
#define  VOLDOWN 0xD7 //EC减1指令 
#define  EPSRRD1 0x7C //读寄存器1 
#define  EPSRRD2 0x7D //读寄存器2 
#define  DISNOP  0x25 //空闲指令 相当于没有操作 
#define  EPINT   0x07 //初始化代码指令 1字节 
//LCM EXT=1时常用操作命令和参数定 
#define  Gray_1set  0x20 //框架1灰度PWM设定 16字节 
#define  Gray_2set  0x21 //框架2灰度PWM设定 16字节 
#define  ANASET     0x32 //Analog电路设定 3字节 
#define  SWINT      0x34 //软件初始化 
#define  EPCTIN     0xCD //控制EEPROM指令 1字节 
#define  EPCTOUT    0xCC //退出EEPROM控制 
#define  EPMWR      0xFC //写入数据到EEPROM
#define  EPMRD      0xFD //从EEPROM读出数据 


#define	freq      6000000	//系统时钟,6MHz
#define us1000H   ((65536 - (freq/1200)*1000/10000) / 256)	//延时1ms的定时H数值
#define us1000L   ((65536 - (freq/1200)*1000/10000) % 256)	//延时1ms的定时L数值

#define START_LINE	 32	  //LCD的起始行 
#define END_LINE	 122  //LCD的结束行    LINE	 32~122 MAX=159
#define START_COL	 20	  //LCD的起始列 
#define END_COL	     84	  //LCD的结束列 	 COLUMN	20~84  MAX=84
#define MAX_ROW      91   //最大的ROW数 
#define MAX_COL      194   //最大的COL数 
#define MAX_COL_BLOCK 65   //最大的COL的块数,一个块含有3个像素点。
/****************全局变量定义*******************/
unsigned char col,row;  /*列x,行(页)y,输出数据 */
bit Reverse;  /*反显控制标志位,=1时反显 */

bit TimeMark;  /*定时响应标志位*/
unsigned char T_TH;
unsigned char T_TL;

unsigned char code two_boy[];
unsigned char code zimo[];

/****************************************************************************/
//	Timer0初始化
/****************************************************************************/
void InitTimer0(void)
{
	TR0 = 0;
	TimeMark=0;
	TMOD = (TMOD&0xf0)|0x01;		//模式1,十六位定时器 
	TH0  = T_TH;
	TL0  = T_TL;
	ET0 = 1;
	TR0 = 1;
	EA  = 1;
}
/****************************************************************************/
//	Timer0  中断程序 定时
/****************************************************************************/
void timer0 (void) interrupt 1
{
	TR0 = 0;		
	TH0 = T_TH;
	TL0 = T_TL;				//reload
	TR0 = 1;
	TimeMark=1;
}
/****************************************************************************/
//	Ms延时程序
/****************************************************************************/
void  Delay(unsigned int ms)
{
    unsigned int i;
	T_TH=us1000H;
	T_TL=us1000L;
    InitTimer0(); //定 时1ms
    TimeMark=0;
   	for (i=0;i<ms;i++)
	{
	   while(!TimeMark);
	   TimeMark=0;
	}
	TR0=0;  //关定时器0
	ET0 = 0;
}



/****************************************/
//LCD复位程序 
/****************************************/
void LCD_Reset(void )
{
   LCM_RES=1;
   Delay(10);
   LCM_RES=0;
   Delay(10);
   LCM_RES=1;
}
/****************************************/
//LCD读数据接初始化函数 
/****************************************/
void LCD_initRead(void)
{
   Data1=0xFF;
   Data2=0xFF;
   LCM_RES=1;
   Alcm = 1;   //读数据操作 
   WR=1;
   RD=1;
   CE_LCM =0;
}
/****************************************/
//LCD读数据 
/****************************************/
void LCD_dummyRead(void)
{
   RD=0;
   RD=1;
}
/****************************************/
//LCD读数据 
//首次调用此函数前,需调LCD_dummyRead()函数一次 
/****************************************/
unsigned int LCD_DataRead(void)
{
   unsigned int Dat_m=0;
   RD=0;
   Dat_m=(Data1|(Data2<<8));
   RD=1;
   return Dat_m;
}
/****************************************/
//LCM忙判断函数   
/****************************************/
void wtcom(void)
{
}
/****************************************/
//LCD写数据接初始化函数 
/****************************************/
void LCD_initWR(void)
{
  //  wtcom();  //等待LCM操作允许,这里暂不用它 
  Alcm = 1;   //写数据操作 
  RD = 1;   //读数据端置1
  CE_LCM = 0;  //选中LCM 
}
/****************************************/
//写入数据函数 
/****************************************/
void Wrcom(unsigned int X)
{
  Data1=(unsigned char)X;   //输出数据	 
  Data2=(unsigned char)(X>>8);   //输出数据	   
  WR = 0;   //写数据端置0
// NOP();
  WR = 1;       //写入数据  
}
/****************************************/
//对LCM写入数据 
/****************************************/
void Wrdata(unsigned int X)
{
//  wtcom();  //等待LCM操作允许,这里暂不用它 
  if(Reverse)
    {X=~X;}  //取反,以反显
  Alcm = 1;   //写数据操作 
  RD = 1;   //读数据端置1
  CE_LCM = 0;  //选中LCM 
  Wrcom(X);  //调用写数据共享程序 
}
/****************************************/
//对LCM写入命令 
/****************************************/
void Wrcmd(unsigned int X)
{
//  wtcom();  //等待LCM操作允许,这里暂不用它 
  Alcm = 0;   //写命令操作 
  RD = 1;   //读数据端置1
  CE_LCM = 0;  //选中LCM 
  Wrcom(X);  //调用写数据共享程序 
}
/********************************/
//向液晶屏EEPROM中读出数据函数 
/********************************/
void Read_LCM_EEPROM( void )
{
   Wrcmd( 0x0030 ); // Ext = 0
   Wrcmd( 0x0007 ); // Initial code (1)
   Wrdata( 0x0019 );
   Wrcmd( 0x0031 ); // Ext = 1
   Wrcmd( 0x00CD ); // EEPROM ON
   Wrdata( 0x0000 ); // Entry "Read Mode"
   Delay( 100 ); // Waite for EEPROM Operation ( 100ms )
   Wrcmd( 0x00FD ); // Start EEPROM Reading Operation
   Delay( 100 ); // Waite for EEPROM Operation ( 100ms )
   Wrcmd( 0x00CC ); // Exist EEPORM Mode
   Wrcmd( 0x0030 ); // Ext = 0
}
/********************************/
//向液晶屏EEPROM中写入数据函数 
/********************************/
void Write_LCM_EEPROM( void )
{
   Wrcmd( 0x0030 ); // Ext = 0
   Wrcmd( 0x00AE ); // Display OFF
   Wrcmd( 0x0007 ); // Initial code(1)
   Wrdata( 0x0019 );
   Wrcmd( 0x0031 ); // Ext = 1
   Wrcmd( 0x00CD ); // EEPROM ON
   Wrdata( 0x0020 ); // Entry "Write Mode"
   Delay( 100 ); // Waite for EEPROM Operation ( 100ms )
   Wrcmd( 0x00FC ); // Start EEPROM Writing Operation
   Delay( 100 ); // Waite for EEPROM Operation ( 100ms )
   Wrcmd( 0x00CC ); // Exist EEPROM Mode
   Wrcmd( 0x0030 ); // Ext = 0
   Wrcmd( 0x00AF ); // Display ON
}
/****************************************/
//写入地址函数 
//col+end_X最大为194
//row+end_Y最大为91
/****************************************/
void Loadxy(unsigned char end_X,unsigned char end_Y)
{
     unsigned char i;
     Wrcmd(0X30);   //EXT=0

     Wrcmd(0X75);   //THIRD  COMMAND SET LINE ADDRESS 
	 i=START_LINE+row;
     Wrdata(i);    //START LINE
	 i=i+end_Y-1;
     Wrdata(i);  //END   LINE

     i=col/3;
	 i=START_COL+i;
     Wrcmd(0X15);   //THIRD  COMMAND SET COLUMN ADDRESS 
     Wrdata(i);  //START COLUMN  
	 if(end_X>2) i=(i+end_X/3);
	 if((end_X%3)==0)  i--;
     Wrdata(i);  //END   COLUMN
}
/********************************/
//LCD的全显点的测试程序 
//可作为清屏函数调用。
//入口数ucData为点的灰度。 
/********************************/
void WretPointTest(unsigned int ucData)
{
   unsigned char i=0,j=0;
   col=0;row=0;
   Loadxy(194,91); //定义显示的坐标区域 


   Wrcmd(0X5C);  //DATA WRITE 
   LCD_initWR();
   for(i=0;i<MAX_ROW;i++)
   {
      for (j=0;j<MAX_COL_BLOCK;j++)
      { 
		 Wrcom(ucData);
      }
   }
}
/********************************/
//LCD的显示一个点函数 
//在LCD的col、row位置上显示一个点。
//lum为这个点的亮度 	为0时最暗,显示全黑色 
/********************************/
void Write_point(unsigned char lum)
{
   unsigned int ucData;
   unsigned char i;
   unsigned int  temp=0;

   Wrcmd(0X30);   //EXT=0

   Wrcmd(0X75);   //THIRD  COMMAND SET LINE ADDRESS 
   i=START_LINE+row;
   Wrdata(i);    //START LINE
   Wrdata(i);  //END   LINE
   i=col/3;
   i=START_COL+i;
   Wrcmd(0X15);   //THIRD  COMMAND SET COLUMN ADDRESS 
   Wrdata(i);  //START COLUMN  
   Wrdata(i);  //END   COLUMN

   Wrcmd(0XE0);   //进入到读修改写模式 
   LCD_initRead(); //初始化读数据状态 
   LCD_dummyRead(); //假读一次
   ucData=LCD_DataRead();

   i = col%3;
   switch(i)
   {
       case 0:
	      temp=lum<<8;
		  temp=temp<<3;
          ucData=((ucData&0x07FF)|temp);
          break;
       case 1:

⌨️ 快捷键说明

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