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

📄 lcd.c

📁 新手上路
💻 C
字号:
/* lcd.c
*
*
*/
#include "intrins.h"
#include "STC89C51RC.H"
#include "lcd.h"

unsigned char pdata disp_buffer[15];//1621显示缓存
unsigned int code character[] = //注:最高位为C笔划判断位
{
0x8998,0x0040,0x039a,0x829a,0x8a0a,0x8a92,0x8b92,0x8088,//0,1,2,3,4,5,6,7,
0x8b9a,0x8a9a,0x0000,0x8b8a,0x80da,0x0990,0x80d8,0x0b92,//8,9, ,a,b,c,d,e, 第三个是空格
0x0b82,0x8992,0x8b0a,0x00d0,0x8018,0x0045,0x0910,0x8d0c,//f,g,h,i,j,k,l,m,
0x892c,0x8998,0x0b8a,0x8999,0x0b8b,0x8a92,0x00c0,0x8918,//n,o,p,q,r,s,t,u,
0x0924,0x8929,0x0425,0x8a1a,0x00b4,0x8fff//v,w,x,y,z,*,第六个是全显
};
/***************************************
功能:初始化LCD
描叙:每次上电都需要初始化LCD
参数:无
返回:无
调用:void lcd_write_13(unsigned int)
***************************************/
void lcd_init()
{
	lcd_write_13(LCD_EN);//LCD使能
	lcd_write_13(LCD_BIAS_COM);//设置BIAS和COM,因为这句搞死我了
	lcd_clrall();//把所有显示清除
	lcd_write_13(LCD_ON);//LCD显示开
}

/***************************************
功能:显示所有点
描叙:点亮所有可以显示的点
参数:无
返回:无
调用:lcd_update(0x00,15);
耗时:
***************************************
void lcd_dispall()
{
	unsigned char i;
	for(i = 14; i > 0; i--)//把显示缓冲全部清0
	{
		disp_buffer[i] = 0xff;
	}
	lcd_update(0,15);//把显示缓冲数据全部送给LCD
}*/

/***************************************
功能:清除所有显示
描叙:清除所有可以显示的点
参数:无
返回:无
调用:lcd_update(0x00,15);
耗时:
***************************************/
void lcd_clrall()
{
	unsigned char i;
	for(i = 15; i > 0; i--)//
	{
		disp_buffer[i-1] = 0x00;
	}
/*	unsigned char j = 0;
	for(i = 15; i > 0; i--)//把显示缓冲全部清0
	{
		disp_buffer[j] = 0x00;
		j++;
	}*/
	lcd_update(0,15);//把显示缓冲数据全部送给LCD
}
/***************************************
功能:写13位数据至HT1621
描叙:写半个字节至指定地址,写命令需要用此函数
参数:j需要送出去的13位数据
返回:无
耗时:196US
***************************************/
void lcd_write_13(unsigned int j)
{
	unsigned char i;
	HT1621_CS = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	for(i = 13; i > 0; i--)
	{
		HT1621_CLK = 0;
		HT1621_DAT = j & 0x1000;//读取j的第4位
		j <<= 1;
		_nop_();
		_nop_();
		_nop_();
		HT1621_CLK = 1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
	HT1621_CS = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

/***************************************
功能:从显示缓冲中写部分数据至LCD
描叙:连续写数据至HT1621显示
参数:缓冲数组起始下标,字节数,
返回:无
调用:
耗时:不确定,根据需要写数据多少来确定
***************************************/
void lcd_update(unsigned char s_byte_add,unsigned char num)
{
	unsigned char i,j;
	unsigned int a;
	a = (s_byte_add << 1) | 0x0140;//把缓冲字节地址拆开,把地址前面加上101
	HT1621_CS = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	for(i = 9; i > 0; i--)//发送101加6位起始地址
	{
		HT1621_CLK = 0;
		HT1621_DAT = a & 0x0100;//读第8位送给数据线
		a <<= 1;
		_nop_();
		_nop_();
		_nop_();
		HT1621_CLK = 1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
	for(num; num > 0; num--)
	{
		j = disp_buffer[s_byte_add];//数组里保存要送往1621RAM的数据
		s_byte_add++;
		for(i = 8; i > 0; i--)
		{
			HT1621_CLK = 0;
			HT1621_DAT = j & 0x80;//读取最高位
			j <<= 1;
			_nop_();
			_nop_();
			_nop_();
			HT1621_CLK = 1;
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
	HT1621_CS = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

/***************************************
功能:写LCD上的16个单独显示单元
描叙:
参数:x写前8位为0后8位为1,w写还是清除,y要显示的位
返回:无
调用:
耗时:
***************************************/
/*void write_bit(bit x,bit w,unsigned char y)
{
	unsigned char a;
	if(x)a = 14;
	else a = 0;
	
}*/

/***************************************
功能:写LCD上的8个字符
描叙:
参数:写某位,显示什么
返回:无
调用:fine_char1();fine_char2();
耗时:
***************************************/
void write_char(unsigned char x,unsigned char Char)//空格的ASCII是0x20,怎么办?
{
//	if(Char == 29)Char = 10;
	if(Char > 60)Char -= 54;//为了使26个字母对应字库11至36
	switch(x)
	{
		case 1: fine_char1(1,2,Char);
		break;
		case 2: fine_char2(2,3,Char);
		break;
		case 3: fine_char1(4,5,Char);
		break;
		case 4: fine_char2(5,6,Char);
		break;
		case 5: fine_char1(8,9,Char);
		break;
		case 6: fine_char2(9,10,Char);
		break;
		case 7: fine_char1(11,12,Char);
		break;
		case 8: fine_char2(12,13,Char);
		break;
		default:break;
	}
	if(character[Char] & 0x8000) disp_buffer[7] |= (0x80 >> --x);
	else disp_buffer[7] &= ~(0x80 >> --x);
	lcd_update(7,1);//把C笔划刷新
}

/***************************************
功能:采用这两个函数又省下200多字节CODE
描叙:只被write_char调用,计算出显示数据并刷新LCD
参数:要写的字符在缓冲数组A,B下标中,Char是要显示的字符下标
返回:无
调用:
耗时:
***************************************/
void fine_char1(unsigned char a,unsigned char b,unsigned char Char)
{
	unsigned int temp;
	temp = 0x000f & disp_buffer[b];//
	temp += character[Char] << 4;
	disp_buffer[a] = temp >> 8;
	disp_buffer[b] = temp & 0x00ff;
	lcd_update(a,2);
}

/***************************************
功能:采用这两个函数又省下200多字节CODE
描叙:只被write_char调用,计算出显示数据并刷新LCD
参数:要写的字符在缓冲数组A,B下标中,Char是要显示的字符下标
返回:无
调用:
耗时:
***************************************/
void fine_char2(unsigned char a,unsigned char b,unsigned char Char)
{
	unsigned int temp;
	temp = (0x00f0 & disp_buffer[a]) << 8;//
	temp += (0x0fff & character[Char]);
	disp_buffer[a] = temp >> 8;
	disp_buffer[b] = temp & 0x00ff;
	lcd_update(a,2);
}

/***************************************
功能:写字符串
描叙:
参数:起始位,字符串指针
返回:无
调用:write_char(x,*p);
耗时:
***************************************
void write_string(unsigned char x,unsigned char *p)
{
	while(*p)
	{
		write_char(x,*p);
		x++;
		p++;
	}
}*/

⌨️ 快捷键说明

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