基于Proteus学习单片机系列(十一)——LCD12864

项目下载

    点击下载

    1.0 电路图


    2.0 程序

            还是只贴出驱动,完整例程可在上面下载。

#include <intrins.h>
#include<ziku.c>

#define uchar unsigned char
#define uint unsigned int
uchar num[] = "0123456789";	
sbit REST = P2^0;			    											//Reset signal, active"L"
sbit C_D = P2^1;															//L:data   H:code
sbit C_E = P2^2;															//Chip enable signal, active"L"
sbit R_D = P2^3;															//read signal, active"L"
sbit W_R = P2^4;															//write signal, active"L"
#define width      				 15											//显示区宽度
#define Graphic          	     1
#define TXT           	    	 0
#define LcmLengthDots            128
#define LcmWidthDots             64                                                                                                                                                                                                                                       
/**************************12864液晶的相关函数**********************/         								  
void delay_nms(uint i)
{
	while(i)
	i--;
}
void write_commond(uchar com)												//对液晶写一个指令
{	 									 	
	C_E = 0;	
	C_D = 1;
	R_D = 1;
	P0 = com;
	W_R = 0;																// write	  
	_nop_();					
	W_R = 1;																// disable write
	C_E = 1;						   	   		
	C_D = 0;
}
void write_date(uchar dat)													//对液晶写一个数据
{
	C_E = 0;
	C_D = 0;
	R_D = 1;
	P0 = dat;
	W_R = 0;
	_nop_();
	W_R = 1;
	C_E = 1;
	C_D = 1;
}
 void write_dc(uchar com,uchar dat)											//写一个指令和一个数据
{
	write_date(dat);
	write_commond(com);
}
//写一个指令和两个数据
void write_ddc(uchar com,uchar dat1,uchar dat2)
{
	write_date(dat1);
	write_date(dat2);
	write_commond(com);
}
//LCD初始化函数
void F12864_init(void)
{	
	REST = 0;
	delay_nms(2000);					
	REST = 1;
	write_ddc(0x40,0x00,0x00);			     						 		//设置文本显示区首地址
	write_ddc(0x41,128/8,0x00);  											//设置文本显示区宽度
	write_ddc(0x42,0x00,0x08);			      								//设置图形显示区首地址0x0800
	write_ddc(0x43,128/8,0x00);  											//设置图形显示区宽度
	write_commond(0xA0);                     							   	//设置光标形状 8x8方块
	write_commond(0x80);                     							   	//显示方式设置 文本and图形(异或)
	write_commond(0x92);                     							   	//设置光标
	write_commond(0x9F);                     							   	//显示开关设置 文本开,图形开,光标闪烁关							 	
}
//**************************//清显示存储器函数
void F12864_clear(void)
{
	unsigned int i;
	write_ddc(0x24,0x00,0x00); 												//置地址指针为从零开始
   	write_commond(0xb0); 													//自动写
	for(i = 0;i < 128 * 64 ;i++)write_date(0x00); 							//清一屏
	write_commond(0xb2); 													//自动写结束
	write_ddc(0x24,0x00,0x00); 												//重置地址指针 
}
//设定显示的地址
void goto_xy(uchar x,uchar y,uchar mode)
{
     uint  temp;
     temp = 128 / 8 * y + x;
     if(mode)                                 								//mode = 1为Graphic
     {                                        								//如果图形模式要加上图形区首地址0x0800
         temp = temp + 0x0100;
     }
     write_ddc(0x24,temp & 0xff,temp / 256);	  							//地址指针位置
}
//显示一个ASCII码函数
void Putchar(uchar x,uchar y,uchar Charbyte)
{
     goto_xy(x,y,TXT);
     write_dc(0xC4,Charbyte-32);		     								//数据一次读写方式//查字符rom	 
}
void display_string(uchar x,uchar y,uchar *p)
{
	while(*p != 0)
	{
		if(x > 15 )                          								//自动换行	 128*64
		{										 	
			x = 0;
			y++;
		}
		Putchar(x,y,*p);
		++x;
		++p;
	}
}
void display_num(uchar x,uchar y,uchar z)
{
	uchar z1,z2;
	z1 = num[z / 10];
	z2 = num[z % 10];
	Putchar(x,y,z1);
	Putchar(x+1,y,z2);
}


//显示一串汉字,j = k + n为(n为要显示的字的个数),k为选择从哪个字开始
void dprintf_hanzi_string_1(struct typFNT_GB16 code *GB_16,uint X_pos,uint Y_pos,uchar j,uchar k)
{  
	unsigned int address;
	unsigned char m,n;
	while(k < j)
	{
		m = 0;
		address = LcmLengthDots / 8 * Y_pos + X_pos + 0x0800;
		for(n = 0;n < 16;n++)                                  			  	//计数值16
    	{
		   write_ddc(0x24,(uchar)(address),(uchar)(address>>8));  			//设置显示存储器地址
		   write_dc(0xc0,GB_16[k].Mask[m++]);                    			//写入汉字字模左部
		   write_dc(0xc0,GB_16[k].Mask[m++]);                 			    //写入汉字字模右部
		   address = address + 128/8;                           			//修改显示存储器地址,显示下一列(共16列)
	    }
		X_pos += 2;
		k++;
	}
}



猜你喜欢

转载自blog.csdn.net/qq_39020934/article/details/80051715