12864带字库显示屏滚屏显示

/*****************************************************/
//描述:LCD12864的驱动
//作者:小四叶草
//时间:2015/07/16
//描述:显示屏的滚动,需要扩展指令
//卷地址只能滚屏64行,也就是2页(一页四行),那我只能定义虚拟页(page),让它来满足我一直滚屏显示我的文字。比我的文字是四页
/*****************************************************/
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define LCD_DATA		(*((volatile Uint16 *)0x45EF))
#define E				GpioDataRegs.GPBDAT.bit.GPIO61
#define RW				GpioDataRegs.GPADAT.bit.GPIO27
#define RS 				GpioDataRegs.GPBDAT.bit.GPIO60
#define LOW 			0
#define HIGH			1
#define CLEAR_SCREEN	0x01		//清屏指令:清屏且AC值为00H
#define AC_INIT			0x02		//将AC设置为00H。且游标移到原点位置
#define CURSE_ADD		0x06		//设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE		0x30		//工作模式:8位基本指令集
#define DISPLAY_ON		0x0c		//显示开,显示游标,且游标位置反白
#define DISPLAY_OFF		0x08		//显示关
#define CURSE_DIR		0x14		//游标向右移动:AC=AC+1
#define SET_CG_AC		0x40		//设置AC,范围为:00H~3FH
#define SET_DD_AC		0x80 

#define	DELAY_MS(A)		DELAY_US((long double)A * 1000.0L)
#define DELAY_100US(B)	DELAY_US((long double)B * 100.0L)

void InitXintf(void);
void ConfigGpio(void);
void InitLcd(void);
void Read_Busy(void);
void WriteCmd12864(Uint16 cmd);
void WriteData12864(Uint16 dat);
void DisplayDdram(uchar *hz);
void DispBMP(uchar *adress);
void CLR_GDRAM(void);
void gunping(void);
void gunping1(void);
void gunping2(void);

//=========一页========================
uchar tab1[]="晴天有月来几时?";
uchar tab2[]="我今停杯一问之。";

uchar tab3[]="人攀明月不可得,";
uchar tab4[]="月行却与人相随。";
//========二页==========================
uchar tab5[]="胶白飞镜林丹阙,";
uchar tab6[]="绿烟灭尽清辉发。";

uchar tab7[]="但见宵从海上来,";
uchar tab8[]="宁知晓向云间没?";
//========三页==========================
uchar tab9[]="白兔捣药秋复春,";
uchar tab10[] = "嫦娥孤栖与谁邻?";

uchar tab11[] = "今人不见古时月,";
uchar tab12[]="今月曾经照古人";
//========四页==========================
uchar tab13[]="古人今人如流水,";
uchar tab14[]="共看明月皆如此。";

uchar tab15[]="唯愿当歌对酒时,";
uchar tab16[]="月光长照金樽里。";




void main(void)
{
	uchar i;
	uchar page = 0;
	InitSysCtrl();
	InitXintf();
	InitXintf16Gpio();
	DINT;
	InitPieCtrl();
	
	IER = 0x0000;
	IFR = 0x0000;
	
	ConfigGpio();
	InitLcd();
	WriteCmd12864(CLEAR_SCREEN);
	DELAY_US(50);
	
	gunping();
	
	WriteCmd12864(0x34); //开启扩展指令
	WriteCmd12864(0x03);//允许写入卷动地址
	for(i = 0;i < 64; i++)
	{
		if((32 == i) & (0 == page))
		{
			WriteCmd12864(0x30); //返回到基本指令
			WriteCmd12864(0x80);
			DisplayDdram(tab5);
			WriteCmd12864(0x90);
			DisplayDdram(tab6);
			
			WriteCmd12864(0x88);
			DisplayDdram(tab7);
			WriteCmd12864(0x98);
			DisplayDdram(tab8);
			WriteCmd12864(0x34); //开启扩展指令
			WriteCmd12864(0x03);//允许写入卷动地址
		}
		else if((32 == i) & (1 == page))
		{
			WriteCmd12864(0x30); //返回到基本指令
			WriteCmd12864(0x80);
			DisplayDdram(tab9);
			WriteCmd12864(0x90);
			DisplayDdram(tab10);
			
			WriteCmd12864(0x88);
			DisplayDdram(tab11);
			WriteCmd12864(0x98);
			DisplayDdram(tab12);
			WriteCmd12864(0x34); //开启扩展指令
			WriteCmd12864(0x03);//允许写入卷动地址
		}
		else if((32 == i) & (2 == page))
		{
			WriteCmd12864(0x30); //返回到基本指令
			WriteCmd12864(0x80);
			DisplayDdram(tab13);
			WriteCmd12864(0x90);
			DisplayDdram(tab14);
			
			WriteCmd12864(0x88);
			DisplayDdram(tab15);
			WriteCmd12864(0x98);
			DisplayDdram(tab16);
			WriteCmd12864(0x34); //开启扩展指令
			WriteCmd12864(0x03);//允许写入卷动地址
		}
		else if((63 == i) & (0 == page))
		{
			i =0;
			page++;
			WriteCmd12864(0x30); //返回到基本指令
			gunping1();
			WriteCmd12864(0x34); //开启扩展指令
			WriteCmd12864(0x03);//允许写入卷动地址
			
			
		}
		else if((63 == i) & (1 == page))
		{
			i =0;
			page++;
			WriteCmd12864(0x30); //返回到基本指令
			gunping2();
			WriteCmd12864(0x34); //开启扩展指令
			WriteCmd12864(0x03);//允许写入卷动地址
			
			
		}
		else
		{
			
		}
		WriteCmd12864(0x40 + i);
		DELAY_MS(10);
	
		
	}
	WriteCmd12864(0x30); //返回到基本指令

}

void ConfigGpio(void)
{
	EALLOW;
	GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;
	GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;
	GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
	GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
	GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;
	GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;
	EDIS;
}

void InitLcd(void)
{
	DELAY_100US(5);
	WriteCmd12864(FUN_MODE);
	DELAY_US(5);
	
	WriteCmd12864(FUN_MODE);
	DELAY_US(5);
	
	WriteCmd12864(0x0C);
	DELAY_US(5);
	
	WriteCmd12864(CLEAR_SCREEN);
	DELAY_US(30);
	
	WriteCmd12864(AC_INIT);
	DELAY_US(4);

}
void Read_Busy() //读忙标志最高位为1,则busy,不能进行读写操作
{
	RS = LOW;
	RW = HIGH;
	E = HIGH;
	while(LCD_DATA & 0X80);
	E = LOW;
}
void WriteCmd12864(Uint16 cmd)
{
	Read_Busy();
	RS = LOW;
	RW = LOW;//写数据
	E = HIGH;
	LCD_DATA  = cmd;
	E = LOW;
}

void WriteData12864(Uint16 dat)
{
	Read_Busy();
	RS = HIGH;
	RW = LOW;//写数据
	E = HIGH;
	LCD_DATA  = dat;
	E = LOW;
}

void DisplayDdram(uchar *hz)
{
	while(*hz != '\0')
	{
		WriteData12864(*hz);//地址里面的值
		hz++;
	}
}

void gunping()
{
	WriteCmd12864(0x80);
	DisplayDdram(tab1);
	WriteCmd12864(0x90);
	DisplayDdram(tab2);
	
	WriteCmd12864(0xA0);
	DisplayDdram(tab3);
	WriteCmd12864(0xB0);
	DisplayDdram(tab4);
	
	WriteCmd12864(0x88);
	DisplayDdram(tab3);
	WriteCmd12864(0x98);
	DisplayDdram(tab4);
	WriteCmd12864(0xA8);
	DisplayDdram(tab5);
	WriteCmd12864(0xB8);
	DisplayDdram(tab6);
	
}
void gunping1()
{
	WriteCmd12864(0x80);
	DisplayDdram(tab5);
	WriteCmd12864(0x90);
	DisplayDdram(tab6);
	
	WriteCmd12864(0xA0);
	DisplayDdram(tab7);
	WriteCmd12864(0xB0);
	DisplayDdram(tab8);
	
	WriteCmd12864(0x88);
	DisplayDdram(tab7);
	WriteCmd12864(0x98);
	DisplayDdram(tab8);
	WriteCmd12864(0xA8);
	DisplayDdram(tab9);
	WriteCmd12864(0xB8);
	DisplayDdram(tab10);
	
}

void gunping2()
{
	WriteCmd12864(0x80);
	DisplayDdram(tab9);
	WriteCmd12864(0x90);
	DisplayDdram(tab10);
	
	WriteCmd12864(0xA0);
	DisplayDdram(tab11);
	WriteCmd12864(0xB0);
	DisplayDdram(tab12);
	
	WriteCmd12864(0x88);
	DisplayDdram(tab11);
	WriteCmd12864(0x98);
	DisplayDdram(tab12);
	WriteCmd12864(0xA8);
	DisplayDdram(tab13);
	WriteCmd12864(0xB8);
	DisplayDdram(tab14);
	
}


  • 8
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现51单片机光敏电阻LCD12864字库显示,可以按照以下步骤进行: 1. 确定所使用的LCD12864的控制器型号,例如常用的ST7565、KS0108等。 2. 根据控制器型号编写相应的驱动程序,可参考相关资料或开源代码。 3. 连接光敏电阻,读取光敏电阻的电压值,根据电压值控制LCD显示相关内容。 4. 准备字库文件,将需要显示的文字转换为字模,并存储到字库中。 5. 使用驱动程序中的函数调用字库,完成文字的显示。 具体实现过程中需要注意硬件连接、程序编写及调试等方面的问题。 ### 回答2: 51单片机光敏电阻是一种常见的电子元件,光敏电阻能够根据光的强弱来改变其电阻值。而LCD12864是一种液晶屏幕,具有128x64像素的显示区域,能够显示文字和图形。字库显示意味着LCD12864具有一组预先定义好的文字库,可以直接显示文字而不需要通过编程生成。 在使用51单片机光敏电阻和LCD12864字库显示时,我们可以通过测量光敏电阻的电阻值,来获取环境光的强度。根据光敏电阻的电阻值,我们可以调整LCD12864的背光亮度,以保证显示内容的清晰度。 通过编程,我们可以将需要显示的文字和图形存储在LCD12864字库中。当需要显示某个文字时,我们只需要根据其在字库中的位置来设置相应的控制信号,LCD12864就能够正确地显示出该文字。这样,我们可以方便地显示多种文字和图案,而不需要每次都通过编程生成。 同时,我们还可以通过编程控制LCD12864显示动态内容。例如,我们可以实现文字的滚动、闪烁和变色等效果,从而使显示更加生动和多样化。利用这些功能,我们可以在各种电子设备中应用51单片机光敏电阻和LCD12864字库显示,如温度计、天气预报、闹钟等。 总之,51单片机光敏电阻与LCD12864字库显示的组合能够实现光敏控制和丰富的显示效果。这种组合在各种电子设备中都有广泛的应用。 ### 回答3: 51单片机是一种广泛应用于嵌入式系统开发的单片机,它具有低功耗、高性能和丰富的外设接口等特点。光敏电阻是一种能够根据光照强度改变电阻值的传感器,常用于光强检测和调光控制等场合。 LCD12864是一种具有128x64像素点的液晶显示屏,它通过控制每个像素点的亮暗来实现图像和文字的显示。配备字库可以让LCD12864能够显示更多的文字和图形,提高显示效果。 在使用51单片机连接光敏电阻和LCD12864进行显示时,首先需要将光敏电阻与51单片机的模拟输入端连接,通过读取模拟输入端的电压值,可以获取光敏电阻所检测到的光照强度。 然后,根据光照强度的变化,可以通过编程控制LCD12864显示相应的信息。可以通过指令或函数来操作LCD12864的各个像素点和字库,以在屏幕上显示特定的文本和图形。 此外,还可以根据光敏电阻的变化来调整LCD12864的亮度,以适应不同光照条件下的显示需求。这样,通过51单片机、光敏电阻和LCD12864的组合,可以实现根据光照强度的变化来显示不同的信息,提高显示效果和用户体验。 总结来说,使用51单片机、光敏电阻和字库的LCD12864可以实现根据光照强度的变化来进行文字和图形的显示,还可以通过调节亮度来适应不同光照条件。这样的组合可以广泛应用于各种嵌入式系统中,例如室内照明控制、环境光强检测等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值