CPLD管脚不够所以用了串行的LCD12864 时序改不对

宝猪哥 2017-09-01 01:22:01
求串行的verilog LCD12864驱动
...全文
326 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxj001 2017-09-01
  • 打赏
  • 举报
回复
/*****LCD功能初始化指令*****/
#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 EXPEND_MODE     0x34   //工作模式:8位扩充指令集
#define SET_reverse     0x04   //反白显示第一行(扩充指令集)

/*****汉字位置表*****/
const  unsigned char addr_tab[]={
	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
	0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
	0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
//====LOGO-BMP数据,保存在FLASH===------
const  unsigned char  bmp1[];

/*****(n*1ms)延时子程序*****/
void Delayms(unsigned int time)   //16MHz内部时钟精确测试
	{   
		unsigned int i;   
		while(time--)
			{
				i=1768;
				for(;i--;)NOP();
			}
	}

//串行发送一字节数据基础驱动
void SPI_INIT(void)
	{
		SPI_CR1=0x24;
		//SPI_CR1=0x2C;
		SPI_CR2=0x83;
		SPI_Cmd(ENABLE);
		
	}


void SendByte(unsigned char dat)  //采用STM8 的硬件SPI端口
	{
		SPI_BiDirectionalLineConfig(SPI_DIRECTION_TX);
		SPI_SendData(dat);
		while(SPI_SR_BSY);
	}

/*****写指令*****/
void LCD_WriteCmd(unsigned char Cbyte)
	{
		CS = 1;
		//CheckBusy();
		SendByte(0xf8);               //11111,RW(0),RS(0),0
		SendByte(0xf0&Cbyte);         //高四位
		SendByte(0xf0&Cbyte<<4);      //低四位(先执行<<)
		//CS = 0;
	}

/*****写数据*****/
void LCD_WriteData(unsigned char Dbyte)
	{
		CS = 1;
		//CheckBusy();
		SendByte(0xfa);              //11111,RW(0),RS(1),0
		SendByte(0xf0&Dbyte);        //高四位
		SendByte(0xf0&Dbyte<<4);   //低四位(先执行<<)
		//CS = 0;
	}

/*****初始化LCD*****/
void LCD_Init(void)
	{ 
		Delayms(50);  //LCD忙读取好像采不到,其实采用延时更简单
		LCD_WriteCmd(0x30);        //选择基本指令集
		Delayms(1);
		LCD_WriteCmd(0x30);          //选择8bit数据流
		Delayms(1);
		LCD_WriteCmd(0x0c);          //开显示(无游标、不反白)
		Delayms(1);
		LCD_WriteCmd(0x01);          //清除显示,并且设定地址指针为00H
		Delayms(20);
	}

/*****显示汉字*****/
void TXT_Disp(unsigned char x,unsigned char y,unsigned char  *TXT)
	{ 
		LCD_WriteCmd(addr_tab[8*x+y]);  //写地址
		while(*TXT>0)
			{ 
				LCD_WriteData(*TXT);    //写数据
				TXT++;   
			}
	}

2,432

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧