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

📄 -

📁 实验19 LCD12864_串行方式
💻
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
** 文件功能 :12864液晶串行驱动程序
** 注意事项 :硬件部分需要将12864的第15个管脚通过电阻接到低电平
** 工程作者 :Blue Sky Teams——ZZL
** 工程版本 :V1.0
*********************************************************************************************************/
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int    //宏定义

/*****LCD接口定义*****/
sbit CS   = P0^5;      //片选信号 4
sbit SID  = P0^6;      //串行数据  5
sbit SCLK = P0^7;      //串行同步时钟  6

/*****LCD功能初始化指令*****/

#define basic_commod  0x30
#define extern_commod 0x34
#define cursor_on	  0x0f
#define cursor_off	  0x0c
#define clear 		  0x01
#define draw_on		  0x36
#define draw_off	  0x34


/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};

/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
{
     uchar i;
     for(i=0;i<8;i++)
     {
           SCLK = 0;
           Dbyte=Dbyte<<1;        //左移一位
           SID = CY;              //移出的位给SID
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();   		  
		   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();   		  
           SCLK = 1;
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();	 
		   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();	 
		   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();	 
		   _nop_();_nop_();_nop_();_nop_();	_nop_();_nop_();  
           SCLK = 0;		
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();  		  
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();   
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();	   
     }
}

/*****串行接收一个字节*****/
uchar ReceiveByte(void)
{
     uchar i,temp1,temp2;
     temp1 = 0;
     temp2 = 0;
     for(i=0;i<8;i++)
     {
           temp1=temp1<<1;
           SCLK = 0;
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_(); 
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_(); 
           SCLK = 1;   
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();  
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		   		           
           
           if(SID) temp1++;
		   SCLK = 0;
     }
     for(i=0;i<8;i++)
     {
           temp2=temp2<<1;
           SCLK = 0;
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();  
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();  
           SCLK = 1;
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();    
		    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();		    
		   _nop_();	_nop_();_nop_();_nop_();_nop_();_nop_();    		          

           if(SID) temp2++;
		   SCLK = 0;
     }
     return ((0xf0&temp1)+(0x0f&temp2));
}
/*****检测LCD忙状态*****/
void CheckBusy( void )
{
	do   SendByte(0xfc);         //11111,RW(1),RS(0),0
     while(0x80&ReceiveByte());       //BF(.7)=1 Busy
     
}

/*****读取LCD RAM状态*****/
uchar Read_12864_Data( void )
{
	uchar state;
	CS = 1; 
	CheckBusy();
	SendByte(0xfe);         //11111,RW(1),RS(1),0
	state=ReceiveByte();
	CS = 0;
	return state;
}

/*****写指令*****/
void Write_12864_Com(uchar Cbyte )
{
     CS = 1;
     CheckBusy();
     SendByte(0xf8);              //11111,RW(0),RS(0),0
	 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
     SendByte(0xf0&Cbyte);        //高四位
	 _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();
     SendByte(0xf0&Cbyte<<4);   //低四位(先执行<<)
	 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
     CS = 0;
}

/*****写数据*****/
void Write_12864_Data(uchar Dbyte )
{
     CS = 1;
	  _nop_();_nop_(); _nop_();_nop_();
     CheckBusy(); _nop_();_nop_();
     SendByte(0xfa);              //11111,RW(0),RS(1),0
	 _nop_();_nop_();_nop_();_nop_();
     SendByte(0xf0&Dbyte);        //高四位
	 _nop_();_nop_();_nop_();_nop_();
     SendByte(0xf0&Dbyte<<4);   //低四位(先执行<<)
	 _nop_();_nop_();_nop_();_nop_();
     CS = 0;	
}

/*****初始化LCD*****/
void LCD_12864_Init(void) //液晶初始化
{ 
	Write_12864_Com(basic_commod);//30H--基本指令操作 
	Write_12864_Com(cursor_off);//0x06开显示,关光标,不闪烁。 扩展
	Write_12864_Com(clear);//清除显示0x01 
	Write_12864_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。 

} 

void Write_12864_String(uchar *str)//写入字符串或者汉字
{
	uchar *p;
	p=str;
	while(*p!=0)
	{
		Write_12864_Data(*p);
		p=++str;
	}	
}


/*********************************************************************************************************
** 函数功能 :在指定位置写入汉字
** 函数说明 :汉字必须是写在一个连续的16*16的点阵中
** 入口参数 :待写入的汉字
** 函数举例 :Hanzi_Disp("液晶实验")
** 出口参数 :无
*********************************************************************************************************/
void Hanzi_Disp(uchar x,uchar y,uchar *s)
{ 
	Write_12864_Com(addr_tab[8 * x + y]);  //写地址
	while(*s > 0)
	   { 
			Write_12864_Data(*s);    //写数据
			s ++;     
	   }
}

/*********************************************************************************************************
** 函数功能 :在指定位置写一个整数
** 函数说明 :整数的范围从0到65535
** 入口参数 :待写入的整数
** 出口参数 :无
*********************************************************************************************************/
void Num_Display(uchar x,uchar y,uint number)
{
	uint i = 10000;
	Write_12864_Com(addr_tab[8 * x + y]);  //写地址
	if( number !=0)
	{
		while(number / i == 0)
		{
			i /= 10;
		}	
		if(i != 1)
		{
			while(number/i != 0)
			{
				Write_12864_Data(number / i + 0x30);
				number -= (number / i) * i;	
				i /= 10;	
				if(i == 1)break;
			}		
		}	
	}
	Write_12864_Data(number%10+0x30);
}
/*********************************************************************************************************
** 函数功能 :在屏幕上显示一副图片

⌨️ 快捷键说明

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