protues仿真中12864液晶屏串行编程的感想(从实际硬件驱动芯片 ST7565R到仿真硬件驱动芯片SED1565)

因为疫情的原因,没办法回学校拿毕业设计,自然也就没办法调试,虽然硬件电路都搭好了,但没法调试也就意味着不知道程序编写是否有问题,所以就想着在protues上把硬件电路搭起来调试程序,因为单片机用的是stc的所以protues中直接用AT的就行了,但是到了12864液晶屏这部分就犯难了,protues库中的液晶屏有好多种,而自己不确定用哪一种。最直接的方法就是问百度,但是百度上大多都是并行接口的方式搭建的电路,而我的实际电路用的是串行的(大家都懂得,实际电路中I/O口除非必要能省就省)。
无奈之下,只能自己研究,然后用了一两个小时把问题的关键破解了,成功的实现串行通信控制12864液晶屏。不知道是这个太简单了还是并行通信在这一问题上太过主流了,网上很少有这部分教程,所以今天就做个记录。
实际电路中用的是一款国产的液晶屏,protues中用的是HDG1286F这个系列的液晶屏。经过一番思考,很快就找到了问题的关键,驱动IC,LCD显示的方式都是点阵这个没什么好区别的,唯一有区别的是驱动IC,于是便找到了HDG12864F所使用的驱动IC-SED1565的数据手册。
在这里插入图片描述

取下面两款液晶屏来说,parallel data input是并行数据输入,selectable lnterface是可选接口的意思,也就是说选择parallel data input也就是第三款只能是并行接口,选择selectable lnterface第四款才能有串并行选择。这两款的区别在硬件上就是第四款多了个P/S引脚。如下图是数据手册中对于P/S引脚的描述。

在这里插入图片描述

这里也给出两款液晶屏在引脚上的对应关系(串行模式下),如下图所示,左边是仿真中的引脚资料,右边是实际硬件的液晶引脚资料。

在这里插入图片描述
protues中实际接线图如下所示,悬空部分为不需要接的。
在这里插入图片描述
下边附上液晶屏的初始化函数以及数字显示函数。

//*****************US****************// 
void delay1(int i) 
{	int j,k;  
	for(j=0;j<i;j++)  
		for(k=0;k<10;k++); 
}
//***************写命令************// 
void transfer_command(int data1)    
{	char i;  
	cs1=0; 
	rs=0;  
	for(i=0;i<8;i++)  
	{   sclk=0;   
		if(data1&0x80) sid=1;   
		else sid=0;   
		delay1(5);   
		sclk=1;   
		delay1(5);    
		data1=data1<<=1;      
	}
}  
//****************写数据*************//
void transfer_data(int data1) 
{	char i;  
	cs1=0;  
	rs=1;  
	for(i=0;i<8;i++)  
	{   sclk=0;   
		if(data1&0x80) sid=1;   
		else sid=0;  
 		sclk=1;    
		data1=data1<<=1;   
 	} 
}
//*****************清屏****************//
void clear_screen(void) 
{	unsigned char i,j;  
	for(i=0;i<9;i++)    
	{	cs1=0;   
		transfer_command(0xb0+i);       
		transfer_command(0x10);    
		transfer_command(0x00);    
		for(j=0;j<132;j++)    transfer_data(0x00);        
	}
}  
//***************LCD 初始化**************// 
void initial_lcd(void)
{	reset=0;                 /*低电平复位*/    
	delay(20); 
	reset=1;           		 /*复位完毕*/    
	delay(20);          
	transfer_command(0xe2);  /*软复位*/  
	delay(5);  
	transfer_command(0x2c);  /*升压步聚 1*/  
	delay(5);   
	transfer_command(0x2e);  /*升压步聚 2*/  
	delay(5);  
	transfer_command(0x2f);  /*升压步聚 3*/  
	delay(5); 
	transfer_command(0x23);  /*粗调对比度,可设置范围 0x20~0x27*/  
	transfer_command(0x81);  /*微调对比度*/ 
	transfer_command(0x1f);  /*微调对比度的值,可设置范围 0x00~0x3f*/  
	transfer_command(0xa2);  /*1/9 偏压比(bias)*/  
	transfer_command(0xc0);  /*行扫描顺序:从上到下,0是上下,8是下上*/  
	transfer_command(0xa1);  /*列扫描顺序:从左到右,0是左右,1是右左*/
	transfer_command(0xa6);  /*正反显示,7是高亮显示,6是暗显示*/
	transfer_command(0x60);  /*起始行:第一行开始*/  
	transfer_command(0xaf);  /*开显示*/ 
} 

//*********************显示数组***************//	
void lcd12864_disp1(int num,unsigned int LINE_start,unsigned char ROW_start)
					//要显示的数字------- 第几行(0-7)开始----第几个列字符位置开始(0-17)
{	unsigned int byte;
	unsigned char column_add_L,column_add_H;
	LINE_start = 0xb0 + LINE_start;
	ROW_start =  ROW_start * 7;				//+1
	column_add_L =ROW_start&0x0f;
	column_add_H =((ROW_start>>4)&0x0f)+0x10;		
	cs1 = 0;
	transfer_command(LINE_start);  				//设置页地址
	transfer_command(column_add_H);				//设置列地址的高4位
	transfer_command(column_add_L);				//设置列地址的低4位
	for(byte=0;byte<7;byte++)	transfer_data(LCD_charNumber[num] [byte] );
}

第一次发博客,有问题欢迎指出。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值