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

📄 lcdi2c.c

📁 1330液晶源码(可直接调用汉字)
💻 C
📖 第 1 页 / 共 2 页
字号:
/* SED1335驱动320x240图形液晶驱动演示程序
接口情况表述:
    No: LCM ----- 52
    ---------------------
    1...VSS..... GND                        地线
    2...VDD..... +5V(VCC)                   电源
    3...VO ..... -Vadj Input                对比度负压调整输入
    4...A0 ..... P2.0                       寄存器选择信号,命令数据方式选择
    5.../WR..... WR                         写有效
    6.../RD..... RD                         读有效
    7...D0 ..... P0.0                       数据总线 D0
    8...D1 ..... P0.1                       数据总线 D1
    9...D2 ..... P0.2                       数据总线 D2
    10..D3 ..... P0.3                       数据总线 D3
    11..D4 ..... P0.4                       数据总线 D4
    12..D5 ..... P0.5                       数据总线 D5
    13..D6 ..... P0.6                       数据总线 D6
    14..D7 ..... P0.7                       数据总线 D7
    15../CS .... !( !( RD X WR )) X !P2.7 ) 片选通信号,低电平有效
    16../RES.... /RESET                     复位信号,低电平有效
    17..VEE..... -Vout                      逆变-22.5V 负电压输出
    18..VSS..... GND                        地线 0V
 ==============================================================================
 320x240液晶模块配用sed1335驱动接口板,sed1335驱动接口板上配用32K ram
 仅仅是演示,有些功能还没有全部实现。
 =============================================================================*/
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <hz.h>

//变量类型标识的宏定义
#define Uchar unsigned char
#define Uint unsigned int

// P2.7~~~CS  P2.0 --- A0
char xdata LcmCmdPort _at_ 0x3000;          //CS=0 A0=1 写命令口
char xdata LcmWdataPort _at_    0x2000;     //CS=0 A0=0 写数据口

#define LcmRdataPort LcmCmdPort
#define LcmStatusPort LcmWdataPort

//============================ 1335 常用指令列表 ===============================
#define SystemSet   0x40                            // 时序要求:/WR=0;/RD=1
Uchar code ParaSysTable8[]= {
        0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00             // P1-P8参数
        };
#define Scroll      0x44        // 时序要求:/WR=0;/RD=1
#define BasePart1   0x00
#define BasePart2   0x40
#define BasePart3   0x80
#define BasePart4   0x00
Uchar code ParaScrTableA[]= {
        0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};
#define SleepIn     0x53
#define DispOn      0x59
#define DispOff     0x58
#define Ovlay       0x5b
#define HdotScr     0x5a
#define CsrForm     0x5d
#define CgramAdr    0x5c
#define CsrDirR     0x4c
#define CsrDirL     0x4d
#define CsrDirU     0x4e
#define CsrDirD     0x4f
#define CsrW        0x46
#define CsrR        0x47
#define mWrite      0x42
#define mRead       0x43
bit     wAttrib;            // 字符的写入方式:1为初次写入;0为接续写入
// 程序参数定义,根据用户选择的LCM型号修改
#define Busy        0x40        // 忙状态标志位0b0100 0000
#define paraP9      0x28        // 相对于320 X 240
// LED时钟程序(基于PCF8583)
/////////pcf8583/////////////////

#define   waddr   0xA2  //写地址
#define   raddr   0xA3  //读地址
sbit sda = P1^0;
sbit scl = P1^1;
unsigned char dv[6];
bit DataErrorFlag;
unsigned char year,month,day,hour,minute,second,week;

bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
                     unsigned char ControlByte);
void   keydelay(unsigned int keydelaycount);
void READINT(void); //读时间
void setdate(void);//设置初始时间
void LcmInition( void );
void WriteData( Uchar dataW );
void WriteCommand( Uchar CommandByte );
Uchar ReadDataLcm( void );
void Delay( Uint );
void LcmClear( void );
void PutCdotInGraph( unsigned int Ox, unsigned char Oy, unsigned int Cnumber, unsigned char DotWidth,bit a );
void PutASC(unsigned int Ox, unsigned char Oy, unsigned char Cnumber,bit a);
void Linexy(unsigned int x0,unsigned char y0,unsigned int xt,unsigned char yt,unsigned char att);
void Point(Uint Px, Uchar Py, Uchar attr );
/********************************************/
/*画线。任意方向的斜线,直线数学方程	aX+bY=1	*/
/********************************************/
// 参数类型有待修改
void Linexy(unsigned int x0,unsigned char y0,unsigned int xt,unsigned char yt,unsigned char att)
{
	Uint t;
	int	xerr=0,yerr=0,delta_x,delta_y,distance;
	int	incx,incy;
	Uint row,col;
	delta_x	= xt-x0;							//计算坐标增量
	delta_y	= yt-y0;
	col	= x0;
	row	= y0;
	if(delta_x>0) incx=1;						//设置单步方向
	else
    {
    	if( delta_x==0	) incx=0;				//垂直线
		else {incx=-1;delta_x=-delta_x;}
	}
	if(delta_y>0) incy=1;
	else
    {
    	if( delta_y==0	) incy=0;				//水平线
		else {incy=-1;delta_y=-delta_y;}
	}
	if(	delta_x	> delta_y )	distance=delta_x;	//选取基本增量坐标轴
	else distance=delta_y;

	for( t=0;t <= distance+1; t++ )
	{											//画线输出
                Point((Uint)col,row,att);				//画点
		xerr +=	delta_x	;
		yerr +=	delta_y	;

		if(	xerr > distance	)
		{
			xerr-=distance;
			col+=incx;
		}
		if(	yerr > distance	)
		{
			yerr-=distance;
			row+=incy;
		}
	}
}
/*====================================================
;  绘点子程序,携入参数X坐标的最高位决定写或擦点
 ====================================================*/
void Point(Uint Px, Uchar Py, Uchar attr ) {

Uint tempPtr;
Uchar tempD,tempP;

	tempPtr = (Uint)Py * paraP9 + (Px & 0x7fff)/8;	// 去除最高位(显示属性)
	WriteCommand( CsrDirD );						// CSRDIR 代码(光标自动下移)
	WriteCommand( CsrW );							// 设置光标地址
	WriteData( (Uchar)(tempPtr & 0xff) );
	WriteData( (Uchar)(tempPtr /256) );
	WriteCommand( mRead );							// 读显示ram指令
	tempD = ReadDataLcm();							// 读取当前显示数据
	tempP = 1<<(Uchar)(7-Px & 0x0007);

// 根据预定属性决定写点或擦除
	if( attr )tempD |= tempP;	// 画点
	else tempD &= ~tempP;				// 消点

	WriteCommand( CsrW );						// 重新设置光标地址
	WriteData( (Uchar)(tempPtr & 0xff) );
	WriteData( (Uchar)(tempPtr /256) );
	WriteCommand( mWrite );						// 代码0x42,数据写入指令
	WriteData( tempD );							// 写入合成数据

}
void PutASC(unsigned int Ox, unsigned char Oy, unsigned char Cnumber,bit a) {
        Uint Optr;
        Uchar tempCount1;
	    WriteCommand(CsrDirR); 	// 自动右移。
	for (tempCount1=0;tempCount1<16;tempCount1++) {
                Optr =(Oy+tempCount1)*paraP9 + Ox;
		WriteCommand( CsrW );						// 光标定位指令
		WriteData( (Uchar)(Optr &0xff) );		// 设置光标地址CSR
		WriteData( (Uchar)(Optr /256 ) );
		WriteCommand( mWrite );
                if(a)
                 WriteData(~ASC_MSK[Cnumber-32][tempCount1]);
                else
                WriteData(ASC_MSK[Cnumber-32][tempCount1]);
             }
}						// ram写指令


/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
			Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
 ==============================================================================*/
 void PutCdotInGraph( unsigned int Ox, unsigned char Oy, unsigned int Cnumber, unsigned char DotWidth,bit a )
 {
        Uint Optr;
        Uchar tempCount1,tempCount2;
	    WriteCommand(CsrDirR); 	// 自动右移。
	for (tempCount1=0;tempCount1<DotWidth;tempCount1++) {
                Optr =(Oy+tempCount1)*paraP9 + Ox;
		WriteCommand( CsrW );						// 光标定位指令
		WriteData( (Uchar)(Optr &0xff) );		// 设置光标地址CSR
		WriteData( (Uchar)(Optr /256 ) );
		WriteCommand( mWrite );						// ram写指令
		switch(DotWidth){

                        case 12:	 for(tempCount2=tempCount1*2;tempCount2<(tempCount1+1)*2;tempCount2++){
                                                if(a)
                                                 WriteData(~typFNT_GB12[Cnumber][tempCount2]);
                                                else
						WriteData(typFNT_GB12[Cnumber][tempCount2]);		// 写入数据
						}
						break;
			case 16:	 for(tempCount2=tempCount1*2;tempCount2<(tempCount1+1)*2;tempCount2++){
                                                if(a)
                                                 WriteData(~typFNT_GB16[Cnumber][tempCount2]);		// 写入数据
                                                 else
                                                 WriteData(typFNT_GB16[Cnumber][tempCount2]);		// 写入数据
                                            	}
						break;
			case 24:	for(tempCount2=tempCount1*3;tempCount2<(tempCount1+1)*3;tempCount2++){
                                                if(a)
                                                 WriteData(~typFNT_GB24[Cnumber][tempCount2]);
                                                else
                                                WriteData(typFNT_GB24[Cnumber][tempCount2]);		// 写入数据
                                                }
						break;
                        case 32:	for(tempCount2=tempCount1*4;tempCount2<(tempCount1+1)*4;tempCount2++){
                                                if(a)
                                                 WriteData(~typFNT_GB32[Cnumber][tempCount2]);
                                                else
                                                WriteData(typFNT_GB32[Cnumber][tempCount2]);		// 写入数据
                                                }
						break;
		}
	}
}

//--------延时子程序--------------------------
void Delay( Uint tt ) {

    while( tt-- );
}


// 写指令代码子程序pr1
void WriteCommand( Uchar CommandByte ) {

    LcmCmdPort = CommandByte;
}

//---------------------------
// 写参数及显示数据子程序
void WriteData( Uchar dataW ) {

    LcmWdataPort = dataW;
}

//---------------------------
// 读参数及显示数据子程序
Uchar ReadDataLcm( void ) {

    return LcmRdataPort;
}

/*=====================================
 初始化子程序
======================================*/
void LcmInition( void ) {

Uchar i;

    WriteCommand( SystemSet );          // 系统参数设置
    for (i=0;i<8;i++) {
        WriteData( ParaSysTable8[i] );  //
    }

    WriteCommand( Scroll );             //设定显示区域起始地址
    for (i=0;i<10;i++) {
        WriteData( ParaScrTableA[i] );
    }

    WriteCommand( HdotScr );        // 写入点位移指令代码
    WriteData( 0 );                 // 写入P1参数
    WriteCommand( Ovlay );          // 显示合成方式设置
    WriteData( 4 );                 // 0000 0100 显示一区图形,三区文本属性,二重"或"合成
    WriteCommand( DispOn );         // 写入指令代码
    WriteData( 0x54 );              // 显示 1~4 区开显示,光标关显示
}


/*====================================================
; 西文字符写入子程序
 wAttrib...全局位变量 1.光标设定; 0.写入字符码
 写入第3区,起始地址为0x6000
 ====================================================*/
/*void TaxtWrite( Uchar Tbyte ) {

    WriteCommand( mWrite );                     // 当前位置写入数据指令
    WriteData( Tbyte );                         // 写入字符代码
}*/

/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/

⌨️ 快捷键说明

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