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