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

📄 lcd_12864.h

📁 做点阵式lcd多级菜单开发的一个例子 可以帮助初学者了解 交互式界面简单设计的部分
💻 H
字号:
//lcd头文件.

#define L_on PORTB&=~(1<<PORTB0)
#define L_off PORTB|=(1<<PORTB0)
#define R_on PORTB&=~(1<<PORTB1)
#define R_off PORTB|=(1<<PORTB1)
#define Selcom PORTB&=~(1<<PORTB2)
#define Seldata PORTB|=(1<<PORTB2)
#define Rw_w PORTB&=~(1<<PORTB3)
#define Rw_r PORTB|=(1<<PORTB3)
#define E_on PORTB|=(1<<PORTB4)
#define E_off PORTB&=~(1<<PORTB4)

#define iodata PORTA

#define status_busy 0x80;	//忙状态.
#define disp_start_set 0xc0	//显示起始行设置.
#define page_addr_set 0xb8	//页面地址设置.
#define col_addr_set 0x40	//列地址设置.
#define disp_on 0x3f		//打开显示.

/********************分别为读忙信号写指令写数据.******************************************/
void chkbusy(void)		//检查忙信号.等待LCD内部操作完成.
{
//	iodata=0xff;		//因为要读状态,所以先使IO口输出高电平.	
	E_on;
	Selcom;
	Rw_r;
//	while(iodata&status_busy);//读入LCD状态,1=忙,一直等LCD内部操作完成.
}

void send_comm(uchar command)	//左右屏在调用函数中处理.
{
	chkbusy();
	E_on;	  					//使能LCD
	Selcom;
	Rw_w;
	iodata=command;				//发送命令到数据总线.
	E_on;
	E_off;						//发送完,关闭使能.
}

void send_data(uchar dat)
{
	chkbusy();
	E_on;
	Seldata;
	Rw_w;
	iodata=dat;					//发送数据到数据总线.
	E_off;
}

/********************LCD初始化******************************************/
void lcd_init(void)				//LCD初始化.
{
	send_comm(disp_start_set);	//设置显示起始行为第一行.
	send_comm(page_addr_set);	//页地址设为0
	send_comm(col_addr_set);  	//列地址设为0
	send_comm(disp_on);			//打开显示.
}

/********************LCD清屏******************************************/
void lcd_clr(void)				//LCD清屏.
{
	uchar page,col;
	L_off;						//对右边控制器操作.
	R_on;
	for (page=0;page<8;page++)
	{
		send_comm(page_addr_set | page);
		send_comm(col_addr_set);
		for (col=0;col<64;col++)
		{
			send_data(0x00);	//列地址自动加一.
		}
	}

	L_on;
	R_off;						//对左边控制器进行操作
	for (page=0;page<8;page++)
	{
		send_comm(page_addr_set | page);
		send_comm(col_addr_set);
		for (col=0;col<64;col++)
		{
			send_data(0x00);	//列地址自动加一.
		}
	}	 
}


/********************************************************************************
画一个图.页地址是page,列地址是col,图形宽度为width,高固定为16,bmp是图形指针.
是否反向标志为mod,mod=0为正常,mod=1表示需要反向显示,一般用在菜单上.取模方式为字节倒序.
********************************************************************************/
void draw_bmp(uchar page,uchar col,uchar width,uchar mod,const uchar *bmp)
{
	uchar x,address;
	uchar window=0;
	uchar p=0;			//p表示宽度的索引,即它的值为0到width之间.

	for(x=col;x<col+width;x++)	//列地址自动加一,但对于x,一个循环后必须加一才能与列地址保持同步.
	{
						//每一个循环显示同一列的两个字节(连续两页).
		if (x>127) return;		//若列坐标大于127,则为无效数据,硬返回,防止显示乱码.
		if (x>63)				//若列地址大于63,则表示要显示在右半区.
		{
			window=1;			//表示在右窗口显示.
			address=x%64;
		}
		else					
		{
			window=0;			//左窗口显示.
			address=x;
		}

		if(window)		  		//发送是在左屏还是右屏.
		{
			L_on;
			R_off;			
		}

		else
		{
			L_off;
			R_on;
		}
		send_comm(page_addr_set | page);   		//发送页面地址.
		send_comm(col_addr_set | address);		//发送列地址.

		if (mod) send_data(~bmp[p]);
		else send_data(bmp[p]);						//发送数据.

		if(window)
		{
			L_on;
			R_off;
		}

		else
		{
			L_off;
			R_on;
		}

		send_comm((page_addr_set | page)+1);	//页地址加一.
		send_comm(col_addr_set | address);		//列地址不变.

		if (mod) send_data(~bmp[p+width]);
		else send_data(bmp[p+width]);				//第二排数据.

		p++;
	}
}

⌨️ 快捷键说明

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