📄 sub.c
字号:
//液晶接口64行*128列
//CSA EQU P1.3 ; 使能信号前64
//CSB EQU P1.4 ; 使能信号后64
//DI EQU P1.5 ; 数据\指令选择,高电平:数据D0-D7将送入显示RAM; 低电平:数据D0-D7将送入指令寄存器执行。
//RW EQU P1.6 ;读/ 写选择信号
//E EQU P1.7 ;读写使能,高电平有效,下降沿锁定数据
//D0-D7 EQU p0 数据线
//Display EQU 3FH ;显示开/关设置控制字
//Yaddr EQU 40H ;置列地址 控制字
//XPAGE EQU 0B8H ;页地址控制字
//Zaddr EQU 0C0H ;显示起始行控制字
#include <REGX51.H>
#include <stdio.h>
#include <intrins.h>
#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
//#define Disply 0x3F
//#define XPAGE 0xB8
//#define Zaddr 0xC0
//#define Yaddr 0x40
sbit CSA=P1^3;
sbit CSB=P1^4;
sbit DI=P1^5;
sbit RW=P1^6;
sbit E=P1^7;
Uchar Input;
Uchar *pword;
Uchar code DATA[]={ 0x07,0x07,0x0F,0xFC,0x3C,0x74,0xE4,0xC4,0xC4,0xE4,0x74,0x3C,0xFC,0x0F,0x07,0x07
,0xE0,0xE0,0xF0,0x3F,0x1C,0x1E,0x17,0x13,0x13,0x17,0x1E,0x1C,0x3F,0xF0,0xe0,0xe0};
//bit BF;
//#define nop() _nop_()
/**************************定义函数原型********************************/
void Delayus(Ulong t) ; /*延时函数*/
void OpenLCD(); //开液晶
void CloseLCD(); //关液晶
void BUSYLOOP(); //*判忙函数*//
void Write_commandA(Uchar CMD); //*发A控制字函数*//
void Write_commandB(Uchar CMD); //*发B控制字函数*//
void Write_dataA(Uchar DATA); //*发A数据函数*//
void Write_dataB(Uchar DATA); //*发B数据函数*//
void Clear(); //*清屏*//
void CHUSHIHUA();
//void Display( Uchar *ptr,Uchar ddram); //**显字符串函数**//
void Display( Uchar Wordshape,Uchar Rom,Uchar line);
void Write_commandAandB(Uchar cd);
void Write_dataAandB(Uchar cd);
void Write_leftword(Uchar PPAGE,Uchar PPAGE1 ,Uchar LINE,Uchar PLINE);
void Write_rightword(Uchar PPAGE,Uchar PPAGE1 ,Uchar LINE,Uchar PLINE);
void Write_dataleft0808(Uchar PAGE1 ,Uchar LINE1);
void Write_dataleft1608(Uchar PAGE1 ,Uchar LINE1);
void Write_dataleft1616(Uchar PAGE1 ,Uchar LINE1);
void Write_dataright0808(Uchar PAGE1 ,Uchar LINE1);
void Write_dataright1608(Uchar PAGE1 ,Uchar LINE1);
void Write_dataright1616(Uchar PAGE1 ,Uchar LINE1);
//****************************************************************//
void main()
{
CHUSHIHUA();
Clear();
pword=DATA;
//Display(3,0,0);
//Write_dataleft1616(3 ,32);
//pword=DATA;
//Write_dataright1616(3 ,16);
Display(1,0,0);
while(1);
}
//**********************显示图形***********************************//
//********************采用扫描方式从上向下扫,扫完一列扫第二列*****//
//**********************显示字体*****************************************//
void Display( Uchar Wordshape,Uchar Rom,Uchar line)//Wordshape 1,2,3
{
Uchar i; //Rom 第几个字8*8 16*8 0~15//16*16 0~7
if(Wordshape==1)
{ //line 8*8 0~7 16*8 16*16 0~3
if(Rom/8>=1)
{i=(Rom-8)*8;
Write_dataright0808(line,i);
}
else {i=Rom*8;
Write_dataleft0808(line,i);}
}
else if(Wordshape==2)
{
if(Rom/8>=1)
{
i=(Rom-8)*8;
Write_dataright1608(line*2,i);
}
else
{ i=Rom*8;
Write_dataleft1608(line*2,i);
}
}
else if(Wordshape==3)
{
if (Rom/4>=1)
{
i=(Rom-4)*16;
Write_dataright1616(line*2,i);
}
else
{
i=Rom*16;
Write_dataleft1616(line*2,i);
}
}//
}
//左
void Write_dataleft0808(Uchar PAGE1 ,Uchar LINE1)
{
Write_leftword( 1,PAGE1 ,LINE1,8);
}
void Write_dataleft1608(Uchar PAGE1 ,Uchar LINE1)
{
Write_leftword( 2,PAGE1 ,LINE1,8);
}
void Write_dataleft1616(Uchar PAGE1,Uchar LINE1)
{
Write_leftword( 2,PAGE1,LINE1,16);
}
//右
void Write_dataright0808(Uchar PAGE1 ,Uchar LINE1)
{
Write_rightword( 1,PAGE1 ,LINE1,8);
}
void Write_dataright1608(Uchar PAGE1 ,Uchar LINE1)
{
Write_rightword( 2,PAGE1 ,LINE1,8);
}
void Write_dataright1616(Uchar PAGE1,Uchar LINE1)
{
Write_rightword( 2,PAGE1 ,LINE1,16);
}
//**********************左显示字体******************************************//
void Write_leftword(Uchar PPAGE,Uchar PPAGE1 ,Uchar LINE,Uchar PLINE) //PPAGE ;字体高大小值为1,2页
{int k,l; //PPAGE1 起始页0,1,2,3,4,5,6,7
PPAGE1=PPAGE1+0xB8;
for(PPAGE;PPAGE>0;PPAGE--)
{
Write_commandA(PPAGE1);
k=LINE+0x40; //LINE 起始列控制
Write_commandA(k);
for(l=PLINE;l>0;l--)
{
Write_dataA(*pword);
pword++;
k++;
}
PPAGE1++;
}
}
//**********************右显示字体***************************************///void Write_rightword(Uchar PPAGE,Uchar PPAGE1 ,Uchar LINE,Uchar PLINE) //PPAGE ;字体高大小值为1,2页
void Write_rightword(Uchar PPAGE,Uchar PPAGE1,Uchar LINE,Uchar PLINE) //PPAGE ;字体高大小值为1,2页
{int k,l; //PPAGE1 起始页0,1,2,3,4,5,6,7
PPAGE1=PPAGE1+0xB8;
for(PPAGE;PPAGE>0;PPAGE--)
{
Write_commandB(PPAGE1);
k=LINE+0x40; //LINE 起始列控制
Write_commandB(k);
for(l=PLINE;l>0;l--)
{
Write_dataB(*pword);
pword++;
k++;
}
PPAGE1++;
}
}
//**********************清屏****************************************//
void Clear()
{int i,k,c;
OpenLCD(); //开液晶
c=0xB8; //#define XPAGE 0xB8页选择
for(i=8;i>0;i--)
{Write_commandAandB(c);
Write_commandAandB(0xC0); //#define Zaddr 0xC0起始行
for( k=64;k>0;k--)
{
Write_dataAandB(0x00);
}
c++;
}
}
//*************************左屏和右屏整体调用************************//
void Write_commandAandB(Uchar cd)
{
Write_commandA(cd); //*发A控制字函数*//
Write_commandB(cd); //*发B控制字函数*//
}
void Write_dataAandB(Uchar cd)
{
Write_dataA( cd); //*发A控制字函数*//
Write_dataB( cd); //*发B控制字函数*//
}
//*************************液晶初始化********************************//
void CHUSHIHUA()
{
Delayus(38); //延迟
OpenLCD(); //开液晶
}
/*********************************************延时**************************************/
void Delayus(Ulong t)
{
int i,j;
for (i=0;i<t;i++);
{for (j=0;j<t;j++);
_nop_();
_nop_();
}
}
/**************************开液晶********************************/
void OpenLCD()
{
Write_commandA(0x3F) ;
Write_commandB(0x3F) ;
}
//*********************判忙函数************************//
void BUSYLOOP()
{
Uchar busy_bit1=0;
DI=0 ;
RW=1;
busyflag:
P0=0x0ff;
E=1;
busy_bit1=P0;
busy_bit1=busy_bit1>>0x07;
E=0;
if(busy_bit1==0X01)
{
goto busyflag;
}
}
//*********************写A控制字函数****************************//
void Write_commandA(Uchar CMD) //CMD为D0-D7的指令
{
CSA=0;
BUSYLOOP();
P0=CMD;
RW=0;
E=1;
E=0;
CSA=1;
}
//*********************写B控制字函数****************************//
void Write_commandB(Uchar CMD) //CMD为D0-D7的指令
{
CSB=0;
BUSYLOOP();
P0=CMD;
RW=0;
E=1;
E=0;
CSB=1;
}
//*********************写A数据函数****************************//
void Write_dataA(Uchar DATA) ////CMD为D0-D7的数据
{
CSA=0;
BUSYLOOP();
DI=1;
RW=0;
P0=DATA;
E=1;
E=0;
CSA=1;
}
//*********************写B数据函数****************************//
void Write_dataB(Uchar DATA) ////CMD为D0-D7的数据
{
CSB=0;
BUSYLOOP();
P0=DATA;
E=1;
DI=1;
RW=0;
E=0;
CSB=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -