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

📄 12864驱动.h

📁 这个是12864液晶的驱动程序
💻 H
字号:


/********************************************
* 硬件连接 :LCD12864		M16				*
*			RESET _________ M16:PA1			*
*			PSB ___________ M16:PA3			*
*			CLK ___________ M16:PA7			*
*			SID ___________ M16:PA6			*
*			CS ____________ M16:PA5			*
********************************************/

#include <iom16v.h>
#include <macros.h>
#include "延时.h"

//宏定义:定义各种操作的管脚
//使用前应由主程序配置其输入、输出
//LCD控制端口
#define lcd_kz PORTA
//串行时钟端:PA7输出
#define clk 2
#define set_lcd_clk lcd_kz|=(1<<clk)	 //置高
#define clr_lcd_clk lcd_kz&=(~(1<<clk))	 //清0

//片选控制端CS操作:PA5输出
#define cs 0
#define set_lcd_cs lcd_kz|=1
#define clr_lcd_cs lcd_kz&=(~(1<<cs))	  //清0

//串行数据输入端SID操作:PA6输出
#define sid 1
#define clr_lcd_sid lcd_kz&=(~(1<<sid))	  //清0
#define set_lcd_sid lcd_kz|=(1<<sid)  	  //置位

//8/4位选择控制PSB操作:PA3输出
#define psb 7
#define clr_lcd_psb PORTC&=(~(1<<psb))   //清0:4位
#define set_lcd_psb PORTC|=(1<<psb)	  //置位:8位

//复位端RST操作:PA1输出
#define rst 5
#define clr_lcd_rst PORTC&=(~(1<<rst))   //清0
#define set_lcd_rst PORTC|=(1<<rst)	  //置位

//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int


		  
/************************************
*		模拟串口专用延时函数		*
************************************/
void delay(void)
	{
	NOP();
	NOP();
	NOP();
	NOP();
	}

/*****************************************
*		写指定位数到12864的函数			 *
* 入口参数:n写入位数,data写入数据		 *
* 说    明:将data的高n位写入			 *
*****************************************/
void wr_bit(uchar n,uchar data)
	{
	for(;n;n--)	  		  	   		//写入位数
		{
		if(data&0x80)				//判断应写入1或0
			{set_lcd_sid;}
		else
			{clr_lcd_sid;}
		data=data<<1;	  			//左移一位,准备写入下一位
		delay();
		set_lcd_clk;				//产生上升沿,写入
		delay();
		clr_lcd_clk;
		}
	}

/*****************************************
*        写指令或数据到12864函数		 *
*入口参数:a=1写显示数据,a=0写指令数据	 *
*		   b需写入的数据	  		   	 *
*时    序:按手册时序进行				 *
*****************************************/
void wr_12864(uchar a,uchar b)
	{
	clr_lcd_clk;

	wr_bit(5,0xFF);			  		//写入五个1

	wr_bit(1,0x00);	 				//写入R/W=0,写入数据
	
	if(a==0)	 					//根据a值写入RS值
		wr_bit(1,0x00);				//如果a为1,写指令(RS=0)
	else
		wr_bit(1,0x80);				//如果a不为1,写数据(RS=1)

	wr_bit(1,0x00);	 				//写入一个0
	
	wr_bit(4,b);					//写入数据的高4位
	
	wr_bit(4,0x00);					//写入4个0
	
	wr_bit(4,(b<<4));				//写入数据的低4位
	
	wr_bit(4,0x00);					//写入4个0

	set_lcd_sid;					//非数据传送状态数据端置高
	}

/*****************************************
*          LCD12864初始化函数			 *
*****************************************/
void lcd12864_init(void)
	{
	clr_lcd_psb;				//串行工作方式
	delay_ms(50);

	clr_lcd_rst; 				//复位
	delay_ms(100);
	set_lcd_rst;
	delay_ms(200);
	
	set_lcd_cs;				  	//片选高电平有效
	
	wr_12864(0,0x30);			//设置数据方式:8位
	delay_us(200);
	wr_12864(0,0x30);			//设置数据方式:8位
	delay_us(80);
	wr_12864(0,0x0C);			//开显示
	delay_us(80);
	wr_12864(0,0x40);			//开显示
	delay_us(200);
	wr_12864(0,0x01);			//清屏
	delay_ms(200);
	}
   
/************************************
*	LCD12864显示字符串函数			*
************************************/
//入口:待显示的字符串
void lcd(char *s)
    {
	while(*s)
	    {
		wr_12864(1,*s);
		s++;
		}
	}	

/************************************
*		LCD12864显示定位函数		*
* 入    口:h定位的行数,V列数		*
************************************/
void locate(uchar h,uchar v)
	{
	switch(h)
		{
		case 1:
			wr_12864(0,(0x80+v-1));	//写第一行V列地址
			break;
		case 2:
			wr_12864(0,(0x90+v-1));	//写第二行V列地址
			break;
		case 3:
			wr_12864(0,(0x88+v-1));	//写第三行V列地址
			break;
		case 4:
			wr_12864(0,(0x98+v-1));	//写第四行V列地址
			break;
		default:break;
		}
	}
	
/************************************
*		LCD12864显示清屏函数		*
************************************/
void cls(void)
	{
	delay_us(200);
	wr_12864(0,0x01);			//清屏
	delay_ms(20);
	}

/********************************
*		显示公司广告语函数		*
********************************/
void guanggao(void)
	{
	locate(1,3);
	lcd("欢迎使用");
	locate(2,1);
	lcd("转向轮参数测试仪");
	locate(3,2);
	lcd("--Vision 1.0");
	locate(4,1);
	lcd("机电学院04电气");
	}

⌨️ 快捷键说明

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