📄 lcd.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 + -