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

📄 sub.c

📁 一个12864的液晶底层驱动程序
💻 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 + -