📄 s1d1335.c
字号:
/* 320240简单演示程序(8080时序)
硬件连线方式(总线式)
LCM -------------- CPU
CS -------------- P2.7 A15
A0 -------------- P2.6 A8
WR -------------- WR
RD -------------- RD
DB0 ~ 7----------- P0.0 ~ P0.7
RST脚采用外部硬件RC电路复位---RST不可少*/
//编译环境 Keil V7.0
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <zk.h>
sbit CS_LCD=P2^6;
sbit A0_LCD=P2^7;
sbit WR_LCD=P3^6;
sbit RD_LCD=P3^7;
sbit WDT =P1^5;
char xdata LcmCmdPort _at_ 0x8000; // P2.7 --- CS P2.0 --- A0
char xdata LcmWdataPort _at_ 0x0000;
#define uchar unsigned char
#define uchar unsigned char
#define Uint unsigned int
#define uint unsigned int
#define ulong unsigned long
#define H_BYTE 40 //横向一行的字节数,如128×128的液晶,横向字节数为16
#define LcmRdataPort LcmCmdPort
#define LcmStatusPort LcmWdataPort
#define SystemSet 0x40
uchar code ParaSysTable8[]= {
0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00 // P1-P8参数
};
#define Scroll 0x44
#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 ;
#define Busy 0x40
#define paraP9 0x28
void LcmInition( void );
void WriteData( uchar dataW );
uchar ReadData( void );
void WriteCommand( uchar CommandByte );
void Delay( Uint MS);
void LcmClear( void );
void Locatexy(uchar x,uchar y);
void Displayspeed(uchar col,uchar row,uchar hzcode);//显示流速、预输液量,显示24*16点阵
void Displaytime(uchar col,uchar row,uchar hzcode);//显示24*14点阵
void DisplayTotal(uchar col,uchar row,uchar hzcode);//显示24*18点阵
void DisplayCanShu(uchar col,uchar row,uchar hzcode); //显示参数调节杆
void Displayyedichar(uchar col,uchar row,uchar hzcode);//显示点滴计数值
void Displayonebmp3(uchar col,uchar row,uchar x,uchar y,uchar *adr);
void DisplayClear(uchar col,uchar row,uchar x,uchar y);
void DisplayOn(uchar x1,uchar y1,uchar x2,uchar y2);
void extbmp(uchar x0,uchar y0,uchar *bmp);
void Displayonebmp(uchar x,uchar y,uchar *adr);
void LcdDrawPoint(int x,int y,bit Point);
//========向液晶写入命令===================
void WriteCommand( uchar CommandByte )
{
/* EA=0;
CS_LCD=0;
A0_LCD=1;
RD_LCD=1;
WR_LCD=0;
P0=CommandByte;
WR_LCD=1;
EA=1; */
LcmCmdPort = CommandByte;
}
//=========向液晶屏写入数据================
void WriteData( uchar dataW )
{
LcmWdataPort = dataW;
/*
EA=0;
CS_LCD=0;
A0_LCD=0;
RD_LCD=1;
WR_LCD=0;
P0=dataW;
WR_LCD=1;
CS_LCD=1;
EA=1; */
}
//=========读取当前济屏数据=================
uchar ReadData( void )
{
uchar Rdata;
Rdata = LcmCmdPort;
return Rdata;
}
//========写入当前地址======================*/
void Locatexy(uchar x,uchar y)
{
Uint temp;
temp = (Uint)y*paraP9+x;
WriteCommand( CsrW );
WriteData( (uchar)(temp & 0xff) );
WriteData( (uchar)(temp /256 ) );
}
//=====液晶初始化======================
void LcmInition( void )
{
uchar i;
Delay(30);
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 );
WriteCommand( Ovlay );
WriteData( 4 );
WriteCommand( DispOn );
WriteData( 0x54 );
WriteCommand(DispOff);
LcmClear();
WriteCommand(DispOn);
WriteCommand( Ovlay );
WriteData( 0x0C );
}
/********************************************************************
* 名称: void DisplayClear(uchar col,uchar row,uchar x,uchar y)
* 功能: col为要擦除的行数,row为要擦除的列(最多240列)x,y为要擦除的起始地址
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void DisplayClear(uchar col,uchar row,uchar x,uchar y)
{
uchar i,j;
for(i=0;i<row;i++)
{
Locatexy(x,y);
WriteCommand(mWrite);
for(j=0;j<col;j++)
{
WriteData(0);
}
y++;
}
}
/********************************************************************
* 名称: void DisplayOn(uchar col,uchar row,uchar x,uchar y)
* 功能: 选定区显示黑屏
* 调用:
* 输入: col,row,x,y.
* 说明: col为要写入的行数(一行8位),row为要擦除的列(最多240列)x,y为要擦除的起始地址
* 返回值:无
***********************************************************************/
void DisplayOn(uchar x1,uchar y1,uchar x2,uchar y2)
{
uchar i,j,row,col;
row=y2-y1;
col=x2-x1;
for(i=0;i<row;i++)
{
Locatexy(x1,y1);
WriteCommand(mWrite);
for(j=0;j<col;j++)
{
WriteData(0xff);
}
y1++;
}
}
/********************************************************************
* 名称: void Displayonebmp(uchar col,uchar row,uchar x,uchar y,uchar *adr)
* 功能: 显示任意点阵图标
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void Displayonebmp3(uchar col,uchar row,uchar x,uchar y,uchar *adr)
{
uchar i,j;
uchar *p;
p=adr;
for(i=0;i<row;i++)
{
Locatexy(x,y);
WriteCommand(mWrite);
for(j=0;j<col;j++)
{
WriteData(*p);
p++;
}
y++;
}
}
/********************************************************************
* 名称: void Displayyedichar(uchar col,uchar row,uchar hzcode)
* 功能: 显示12*16点阵数字
* 调用:
* 输入:
* 说明: 图标位置HZcode
* 返回值:
***********************************************************************/
void Displayyedichar(uchar col,uchar row,uchar hzcode)
{
uchar i,j;
Uint x;
x = 24*hzcode;
WriteCommand( CsrDirR );
for(i=0;i<12;i++)
{
Locatexy(col,row);
WriteCommand(mWrite);
for(j=0;j<2;j++)
{
WriteData(yedichar[x]);
x++;
}
row++;
}
}
/********************************************************************
* 名称: DisplayCanShu(uchar col,uchar row,uchar hzcode)
* 功能: 显示104*17点阵图标
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void DisplayCanShu(uchar col,uchar row,uchar hzcode)
{
uchar i,j;
Uint x;
x = 117*hzcode;
WriteCommand( CsrDirR );
for(i=0;i<9;i++)
{
Locatexy(col,row);
WriteCommand(mWrite);
for(j=0;j<13;j++)
{
WriteData(canshuico[x]);
x++;
}
row++;
}
}
//================================================================
void Delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0)
{
usn = 2; //for 12M
while(usn!=0)
{
us=0xf6;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/********************************************************************
* 名称: void Displaytime(uchar col,uchar row,uchar hzcode)
* 功能: 显示27*14点阵汉字
* 调用:
* 输入:
* 说明: 入口参数: 横坐标col 纵坐标row 汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无 (HZcode表示汉字在字模表中的位置)
void Displaytime(uchar col,uchar row,uchar hzcode)
{
uchar i,j;
uint x;
x = 42*hzcode;
WriteCommand( CsrDirR );
for(i=0;i<14;i++)
{
Locatexy(col,row);
WriteCommand(mWrite);
for(j=0;j<3;j++)
{
WriteData(timedata[x]);
x++;
}
row++;
}
}
/********************************************************************
* 名称: Displayspeed(uchar col,uchar row,uchar hzcode)
* 功能: 显示24*18点阵汉字
* 调用:
* 输入:
* 说明: 入口参数: 横坐标col 纵坐标row 汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无 (HZcode表示汉字在字模表中的位置)
void Displayspeed(uchar col,uchar row,uchar hzcode)
{
uchar i,j;
uint x;
x = 54*hzcode;
WriteCommand( CsrDirR );
for(i=0;i<18;i++)
{
Locatexy(col,row);
WriteCommand(mWrite);
for(j=0;j<3;j++)
{
WriteData(speed[x]);
x++;
}
row++;
}
}
/********************************************************************
* 名称: DisplayTotal(uchar col,uchar row,uchar hzcode)
* 功能: 显示27*40点阵汉字
* 调用:
* 输入:
* 说明: 入口参数: 横坐标col 纵坐标row 汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无 (HZcode表示汉字在字模表中的位置)
void DisplayTotal(uchar col,uchar row,uchar hzcode)
{
uchar i,j;
Uint x;
x = 84*hzcode;
WriteCommand( CsrDirR );
for(i=0;i<21;i++)
{
Locatexy(col,row);
WriteCommand(mWrite);
for(j=0;j<4;j++)
{
WriteData(Total[x]);
x++;
}
row++;
}
}
//=========清屏==========================
void LcmClear( void )
{
Uint i1=32768;
WriteCommand( CsrDirR );
WriteCommand( CsrW );
WriteData( 0 );
WriteData( 0 );
WriteCommand( mWrite );
while(i1--) {
WriteData( 0x0 );
}
}
//========写入当前地址======================*/
void Locateaddr(uint addr)
{
uint temp;
temp=addr;
WriteCommand( CsrW );
WriteData( (uchar)(temp & 0xff) );
WriteData( (uchar)(temp /256 ) );
}
/*--------------------------------------------------------------------------------
调用方式:void extbmp(Byte x0,Byte y0,Byte *bmp)
函数版本:V1.0 2003.9.2 加注释
函数说明:extbmp()在左上角坐标(x,y)解压显示bmp所指向的图形,图形压缩工具采用“字模3.3”
x0必须为8的整数倍。该解压算法适合显存横向排列的液晶。纵向解压算法可参照编写。
该算法的疑问或修改建议,请E-mail:c51bbs@vip.163.com
---------------------------------------------------------------------------------*/
void extbmp(uchar x0,uchar y0,uchar *bmp)
{
uint n=2,num;
uint begin,add1,end;
uchar tmp;
uint bmp_h,bmp_v;//BMP的宽和高
bmp_h=bmp[0];bmp_v=bmp[1];
begin=x0+y0*H_BYTE;
end=begin+(bmp_v-1)*H_BYTE+bmp_h-1;
add1=begin;
Locateaddr(add1);
WriteCommand(mWrite);
while (add1<=end)
{
if (bmp[n]==0x00||bmp[n]==0xFF) //解压缩画黑白点
{
tmp=bmp[n++];
if (bmp[n]!=0x00) num=bmp[n++];
else {n++;num=bmp[n++];num|=(bmp[n++]<<8);} //算出了0x00重复的次数
while(num--) //把0x00都画出来
{
//display_buff[add1]|=tmp; //display_buff是显存映射在XRAM上的镜象
WriteData(tmp);
if (add1==end) {return;}//UpdataAll();完成显存镜象到显存的刷新过程
if (add1==begin+bmp_h-1)
{
begin+=H_BYTE;
add1=begin;
Locateaddr(add1);
WriteCommand(mWrite);
}
else add1++;
}
}
else //直接画,不解压缩
{
//display_buff[add1]|=bmp[n++];
WriteData(bmp[n++]);
if (add1==end) {return;}
if (add1==begin+bmp_h-1)
{begin+=H_BYTE;
add1=begin;
Locateaddr(add1);
WriteCommand(mWrite);
}
else add1++;
}
}
}
/********************************************************************
* 名称: void Displayonebmp(uchar x,uchar y,uchar *adr)
* 功能: 显示任意点阵图标
* 调用: WriteCommand(mWrite);
* 输入: x,y,*adr
* 说明: x为显示图标纵向地址,y为显示图标横向地址
* 返回值:无
***********************************************************************/
void Displayonebmp(uchar x,uchar y,uchar *adr)
{
uchar col,row;
uchar i,j;
uchar *p;
p=adr;
p++;
row=*p;
p++;
col=*p;
p++;
for(i=0;i<row;i++)
{
Locatexy(x,y);
WriteCommand(mWrite);
for(j=0;j<col;j++)
{
WriteData(*p);
p++;
}
y++;
}
}
//=======画点=====================
void LcdDrawPoint(int x,int y,bit Point)
{
uint temp;
uchar t1,t2,WrData;
if((x>=0)&&(y>=0)&&(x<321)&&(y<241))
{
t1=x/8;
t2=x%8;
temp=t1+(uint)y*paraP9;
WriteCommand( CsrW );
WriteData( (uchar)(temp & 0xff) );
WriteData( (uchar)(temp /256 ) );
WriteCommand(mRead);
WrData=ReadData();
WriteCommand( CsrW );
WriteData( (uchar)(temp & 0xff) );
WriteData( (uchar)(temp /256 ) );
if(Point)
{
switch(t2)
{
case 0: WrData|=0x80; break;
case 1: WrData|=0x40; break;
case 2: WrData|=0x20; break;
case 3: WrData|=0x10; break;
case 4: WrData|=0x08; break;
case 5: WrData|=0x04; break;
case 6: WrData|=0x02; break;
case 7: WrData|=0x01; break;
default: break;
}
}
else
{
switch(t2)
{
case 0: WrData&=0x7f; break;
case 1: WrData&=0xbf; break;
case 2: WrData&=0xdf; break;
case 3: WrData&=0xef; break;
case 4: WrData&=0xf7; break;
case 5: WrData&=0xfb; break;
case 6: WrData&=0xfd; break;
case 7: WrData&=0xfe; break;
default: break;
}
}
WriteCommand(mWrite);
WriteData(WrData);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -