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

📄 lcd1.c

📁 这个是我DSP板的LCD显示程序
💻 C
字号:













/************************************
*函数名:void lcd_writCM(char dt)
*功  能:向lcd写入命令
*输  入:
*返  回:void
*命令表:0x01 将ddram填满"20h",并且设定ddram的位置计数器(ac)到"00h"
	 	 0x02 设定ddram的位置计数器(ac)到"00h"但不改变ddram
*************************************/
void lcd_writeCM(char dt)
{
	unsigned char busy;
	unsigned int wait = 0;
	RS_LCD = 0;
	RW_LCD = 1;
	do
	{
		DATABUS = 0xFF;
		E_LCD = 1;
		busy = DATABUS;
		E_LCD = 0;
		if(wait++>1200) 	 //超过一定时间,不等待
		break;
	}while(busy&0x80);               //如果忙,一直等待
	RS_LCD = 0;			         //写指令的时序
	RW_LCD = 0;   
	DATABUS = dt;
	E_LCD  = 1;
	E_LCD  = 0;
	RW_LCD = 1;
}

/************************************
*函数名:void lcd_writDT(char dt)
*功  能:向lcd写入一字节数据
*输  入:
*返  回:void
*************************************/
void lcd_writeDT(char dt)
{
	unsigned char busy;
	unsigned int wait = 0;
	RS_LCD = 0;
	RW_LCD = 1;
	do
	{
		DATABUS = 0xFF;
		E_LCD = 1;
		busy = DATABUS;
		E_LCD = 0;
		if(wait++ >1200)  //超过一定时间,不等待
		break;
	}while(busy&0x80);        //如果忙,一直等待
	RS_LCD = 1;			  //写数据的时序
	RW_LCD = 0; 
	DATABUS = dt;
	E_LCD  = 1;
	E_LCD  = 0;
	RW_LCD = 1;
}

#if 0
/************************************
*函数名:char lcd_Read(void)
*功  能:读取lcd
*输  入:void
*返  回:char
*************************************/
char lcd_Read(void)
{
	unsigned char dt;
	DATABUS = 0xFF;
	RS_LCD = 1;
	RW_LCD = 1;
	dt = DATABUS;
	E_LCD  = 1;
	E_LCD  = 0;
	RW_LCD = 0;
	return dt;
}


/************************************
*函数名:char lcd_Busy(void)
*功  能:判忙并读取ac
*输  入:void
*返  回:char
*注备:毫无用处,经测试,返回值和
char lcd_Read(void)一模一样,都为
最后一次写入的数据,why?
*************************************/
bit lcd_Busy(void)
{
	unsigned char dt;
	bit lcdbusy_flag;
	DATABUS = 0xFF;
	RS_LCD = 0;
	RW_LCD = 1;
	dt = DATABUS;
	E_LCD  = 1;
	E_LCD  = 0;
	RW_LCD = 0;
	lcdbusy_flag = dt&0x80;
	return lcdbusy_flag;
}
#endif //char lcd_Busy(void)编译关闭


/************************************
*函数名:void lcd_init(void)
*功  能:初始化lcd
*输  入:void
*返  回:void
*************************************/
void lcd_init(void)
{
	Delay1ms(100);
	lcd_writeCM(0x30);//设定基本指令集
	Delay1us(100);
	lcd_writeCM(0x30);//设定基本指令集
	Delay1us(40);
	lcd_writeCM(0x0c);//显示开
	Delay1us(100);
	lcd_writeCM(0x01);//清除
	Delay1ms(40);
	lcd_writeCM(0x06);//设定AC+1
	Delay1us(100);
	lcd_writeCM(0x80);//设定起始地址
	Delay1us(100);
}

/************************************
*函数名:void lcd_SetXY(void)
*功  能:在液晶上定位显示位置
*输  入:void
*返  回:void
*************************************/
void lcd_SetXY(void)
{
	lcd_adr = (0x80+lcd_x);			//计算出x坐标
	switch(lcd_y)				//计算出y坐标
	{
		case 1:							//第2行
			lcd_adr = lcd_adr+16;break;  
		case 2:							//第3行
			lcd_adr = lcd_adr+8;break;
		case 3:							//第4行
			lcd_adr = lcd_adr+24;break;
		default:
			break;
	}
	lcd_writeCM(lcd_adr);  //设定DDRAM位址到位址计数器
}

/************************************
*函数名:void lcd_CH(unsigned char *buf)
*功  能:显示字符串
*输  入:
		 汉字:x范围 0~7 y范围 0~3
		 英文:x范围 0~15 y范围 0~3
*返  回:void
*注  备:此函数使用了全局变量
		 使用之前应设置全局变量,
		 已经做了防溢出处理
*************************************/
void lcd_CH(char *buf)
{
	bit i=1;
	EA = 0;
	lcd_SetXY();
	Delay1us(100);
	while((*buf)!='\0')		//字符串没结束
	{
		lcd_writeDT(*buf++);
		Delay1us(30);
		if((i=~i))	lcd_x++;
		if(lcd_x>7)
		{
			lcd_x=0;
			lcd_y++;
			if(lcd_y>3) lcd_y=0;	//防止溢出
			lcd_SetXY();
			Delay1us(100);
		}
	}
	EA = 1;
}

#if NEEDBMP

/************************************
*函数名:Nonius_Ctrl(NONIUS)
*功  能:游标控制
*输  入:CM1{on,off,left,right,reverse}NONIUS
*返  回:void
*************************************/
void Nonius_Ctrl(NONIUS)
{
	lcd_SetXY();
	switch(NONIUS)
	{
		case on:				//游标显示开
			lcd_writeCM(0x0e);
			Delay1us(30);
			break;
		case off:				//游标显示关
			lcd_writeCM(0x0c);
			Delay1us(30);
			break;
		case left:				//游标左移
			if(lcd_x>0)
			{
				lcd_writeCM(0x10);
				lcd_x--;
				Delay1us(30);
			}
			else
			{
				lcd_y--;
				if(lcd_y<0) lcd_y=3;
				lcd_x=7;
				lcd_SetXY();
				Delay1us(30);
			}
			break;
		case right:				//游标右移
			if(lcd_x<7)
			{
				lcd_writeCM(0x14);
				lcd_x++;
				Delay1us(30);
			}
			else
			{
				lcd_y++;
				if(lcd_y>3) lcd_y=0;
				lcd_x=0;
				lcd_SetXY();
				Delay1us(30);
			}
			break;
		case reverse:			//游标反白
			lcd_writeCM(0x0f);
			Delay1us(30);
			break;
		default:break;
	}
}

/************************************
*函数名:lcd_disBMP(unsigned char *dt)
*功  能:显示图形点阵(128*64)  横向取模
*输  入:unsigned char *dt
*返  回:void
*************************************/
void lcd_disBMP(unsigned char *dt)
{
//	unsigned char adr;
	unsigned char i,j;
	EA = 0;
	lcd_writeCM(0x34);//设定扩充指令集
	Delay1us(100);
	lcd_writeCM(0x36);//开绘图模式
	Delay1us(100);
	for(i=0;i<32;i++)
	{
		lcd_writeCM(0x80|i); //写y的地址
		lcd_writeCM(0x80); //写x的地址
		for(j=0;j<16;j++)
		{
			lcd_writeDT(*dt++);
			Delay1us(20);
		}
	}
	for(i=0;i<32;i++)
	{
		lcd_writeCM(0x80|i); //写y的地址
		lcd_writeCM(0x88); //写x的地址
		for(j=0;j<16;j++)
		{
			lcd_writeDT(*dt++);
			Delay1us(20);
		}
	}
	EA = 1;
}

/************************************
*函数名:void lcdgraph_init(void)
*功  能:初始化lcd到图形模式
*输  入:void
*返  回:void
*************************************/
void lcdgraph_init(void)
{
	Delay1ms(100);
	lcd_writeCM(0x34);//设定扩充指令集
	Delay1us(100);
	lcd_writeCM(0x36);//开绘图模式
	Delay1us(40);
	lcd_writeCM(0x0c);//显示开
	Delay1us(100);
	lcd_writeCM(0x01);//清除
	Delay1ms(40);
	lcd_writeCM(0x06);//设定AC+1
	Delay1us(100);
	lcd_writeCM(0x80);//设定起始地址
	Delay1us(100);
}

#endif	//NEEDBMP



#endif //_LCD_CHINESE_H_

⌨️ 快捷键说明

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