📄 st7529.c
字号:
/*--------------------------------------------
主题: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 + -