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

📄 12864s.h

📁 MS12864-R的串行驱动
💻 H
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************
*【文 件 名】:12864s.h                                            *
*【建立日期】:2008年7月1日                                        *
*【修改日期】:2008年7月10日                                       *
*【文件作用】:液晶12864驱动程序,包括所有关于液晶得函数           *
*【说    明】:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;   *
*              (一般RW都设为0,即只向液晶写数据,不读数据)       *
*              RS=1,写入的是数据;RS=0,写入的是指令;            *
*              一般模式:RW=0,RS=1;写数据                         *
*                        RW=0,RS=0;写指令                         *
*------------------------------------------------------------------*
*【作    者】:郭鑫(ben)                                           *
*【版    权】:国家创新性实验项目,编号GCS07001                    *
*******************************************************************/

#ifndef _12864S_08_07_04_
#define _12864S_08_07_04_


/***************************头文件部分*****************************/


#include <REG52.h>
#include <intrins.h>

//------------------------换名定义,方便使用----------------------
#define uchar unsigned char
#define uint unsigned int 
#define nop  _nop_()
#define xtal 12

//-------------------------管脚定义--------------------------------
sbit CS = P2^0;			 //RS_LCD
sbit SID = P2^1;		 //RW_LCD
sbit SCLK = P2^2; 		 //E_LCD	


/***************************函数声明*******************************/

void delay(uint ms);		   	//延时子程序

void lcd_1byte_w(uchar RW, uchar RS, uchar W_data);      //基本操作函数
void lcd_8bits_w(uchar W_bits);

void lcd_dat_w(uchar dat);                             //写数据
void lcd_cmd_w(uchar cmd);                             //写命令
void lcd_str_w(uchar *string);                         //写字符串

void lcd_initial(void);                                //初始化
void lcd_setposition(uchar x, uchar y);

void lcd_black_pic(void);				//绘图命令,用于反白显示
void lcd_clear_pic(void);
void lcd_row_off(uchar temp);
void lcd_row_on(uchar temp);

void logo(void);              //两个欢迎界面
void logo2(void);



//-----------------------------LCD12864读命令----------------------------
uchar lcd_cmd_r(void)
{
    uchar i;
    uchar temp;
    CS = 0;
    SID = 0;
    SCLK = 0;
    CS = 1;

    //    11111 100
    SID = 1;
    for (i=0;i<5;i++){SCLK = 1;SCLK = 0;}
    SID = 1;
    SCLK = 1;SCLK = 0;
    SID = 0;
    SCLK = 1;SCLK = 0;
    SID = 0;           
    SCLK = 1;SCLK = 0;

    temp = 0;
    for (i=0;i<8;i++)
    {
        SCLK = 1;
        temp <<=1;
        temp |= SID;
        SCLK = 0;
    }
    temp >>= 4;
    for (i=0;i<4;i++)
    {
        SCLK = 1;
        temp <<=1;
        temp |= SID;
        SCLK = 0;
    }
    for (i=0;i<4;i++)
    {
        SCLK = 1;SCLK = 0;
    }

    CS = 0;
    SID = 0;
    SCLK = 0;
    return temp;
}


//-------------------LDC忙检测-------------------------------------
void lcd_busy_check(void)
{
    uchar busy;
    do{
        busy = lcd_cmd_r();
    }while(busy&0x80);
}
















/*******************************************************************
*【函 数 名】:lcd_8bits_w                                         *
*【修改日期】:2008年7月2日                                        *
*【函数作用】:12864写入8位数据                                    *
*------------------------------------------------------------------*
*【备    注】:从高位开始传送                                      *
*******************************************************************/
void lcd_8bits_w(uchar W_bits)
{
	uchar i,Temp_data;

    for(i=0; i<8; i++)
	{
		Temp_data = W_bits;
		Temp_data <<= i;
		if((Temp_data&0x80)==0) 	//bit7 is 0
		{
		 	SID = 0;
			nop;
			SCLK = 1;
			nop;
			nop;
			SCLK = 0;
			nop;
			SID = 0;
		}
		else 				  		//bit7 is 1
		{
		 	SID = 1;
			nop;
			SCLK = 1;
			nop;
			nop;
			SCLK = 0;
			nop;
			SID = 0;
		}	
	}
}

/*******************************************************************
*【函 数 名】:lcd_1byte_w                                         *
*【修改日期】:2008年7月2日                                        *
*【函数作用】:12864写入一字节,可以是命令或数据                   *
*------------------------------------------------------------------*
*【备    注】:RW RS控制数据OR命令                                 *
*******************************************************************/
void lcd_1byte_w(uchar RW, uchar RS, uchar W_data)
{
	uchar H_data,L_data,S_ID = 0xf8;	 //11111RWRS0 ,控制格式命令

    if(RW == 0)
	{
	 	S_ID &=~ 0x04;
	}
	else					//if(RW==1)
	{
	 	S_ID |= 0X04;
	}
	if(RS == 0)
	{
	 	S_ID &=~ 0x02;
	}
	else					//if(RS==1)
	{
	 	S_ID |= 0X02;
	}
	H_data = W_data;
	H_data &= 0xf0;			//屏蔽低4位的数据
	L_data = W_data;	   	//xxxx0000格式
	L_data &= 0x0f;			//屏蔽高4位的数据
	L_data <<= 4;			//xxxx0000格式
	CS = 1;
	lcd_8bits_w(S_ID); 		//发送S_ID
	lcd_8bits_w(H_data);	//发送H_data
	lcd_8bits_w(L_data);	//发送L_data
	CS = 0;	
}


/*******************************************************************
*【函 数 名】:lcd_str_w                                           *
*【修改日期】:2008年7月2日                                        *
*【函数作用】:12864写入字符串                                     *
*------------------------------------------------------------------*
*【备    注】:                                                    *
*******************************************************************/
void lcd_str_w(uchar *string)
{
    uchar i=0;
    while(string[i]!='\0')
        lcd_dat_w(string[i++]);      
}

/*******************************************************************
*【函 数 名】:lcd_cmd_w                                           *
*【修改日期】:2008年7月2日                                        *
*【函数作用】:12864写入一条命令                                   *
*------------------------------------------------------------------*
*【备    注】:                                                    *
*******************************************************************/
void lcd_cmd_w(uchar cmd)
{
    	lcd_busy_check();       //先检测LCD忙否,忙则等待

    lcd_1byte_w(0,0,cmd);      
}


/*******************************************************************
*【函 数 名】:lcd_dat_w                                           *
*【修改日期】:2008年7月6日                                        *
*【函数作用】:12864写入一个字节数据                               *
*------------------------------------------------------------------*
*【备    注】:                                                    *
*******************************************************************/
void lcd_dat_w(uchar dat)
{
    	lcd_busy_check();       //先检测LCD忙否,忙则等待

    lcd_1byte_w(0,1,dat);      
}





/*******************************************************************
*【函 数 名】:lcd_initial                                         *
*【修改日期】:2008年7月6日                                        *
*【函数作用】:12864初始化                                         *
*------------------------------------------------------------------*
*【备    注】:                                                    *
*******************************************************************/
void lcd_initial(void)
{
	CS = 0;
	SCLK = 0;
	SID = 0;
    
    
    lcd_cmd_w(0x30);	 //功能设置 8位数据,基本指令
	delay(2);
	lcd_cmd_w(0x0c);	//显示状态 ON,游标OFF,反白OFF
	delay(2);
	lcd_cmd_w(0x01);	//清除显示
	delay(2);
    lcd_cmd_w(0x02);	//地址归位
	delay(2);			//延时 		   
}

/*******************************************************************
*【函 数 名】:lcd_setpostion                                      *
*【修改日期】:2008年7月2日                                        *
*【函数作用】:12864写入8位数据                                    *

⌨️ 快捷键说明

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