📄 lcd_t6963c.c
字号:
//LCD命令地址
#define address_dictate_LCD 0x7001
//LCD数据地址
#define address_data_LCD 0x7000
//reverse 光标标志
//读取状态字
unsigned char state_LCD_read()
{
unsigned char state_LCD;
unsigned char *p_dictate_LCD=(unsigned char *)address_dictate_LCD;
state_LCD=*p_dictate_LCD;
return state_LCD;
}
//判断指令数据读写状态
void judge_state_readwrite_dictatedata()
{
while((state_LCD_read()&0x03)!=3)
;
}
//判断数据自动读状态
void judge_state_automatismread_data()
{
while((state_LCD_read()&0x04)!=4)
;
}
//判断数据自动写状态
void judge_state_automatismwrite_data()
{
while((state_LCD_read()&0x08)!=8)
;
}
//指令写入函数
void write_dictate(unsigned char command)
{
unsigned char *p_dictate_LCD=(unsigned char *)address_dictate_LCD;
judge_state_readwrite_dictatedata();
*p_dictate_LCD=command;
}
//数据读出函数
unsigned char read_data()
{
unsigned char onedata;
unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
judge_state_readwrite_dictatedata();
onedata=*p_data_LCD;
return onedata;
}
//数据写入函数
void write_data(unsigned char onedata)
{
unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
judge_state_readwrite_dictatedata();
*p_data_LCD=onedata;
}
//数据自动写入函数
void automatismwrite_data(unsigned char onedata)
{
unsigned char *p_data_LCD=(unsigned char *)address_data_LCD;
judge_state_automatismwrite_data();
*p_data_LCD=onedata;
}
//一字节参数指令写入函数
void write_dictate_oneparameter(unsigned char parameter,unsigned char command)
{
addr_cs(1);
write_data(parameter);
write_dictate(command);
}
//两字节参数指令写入函数
void write_dictate_twoparameter(unsigned char parameter1,unsigned char parameter2,unsigned char command)
{
addr_cs(1);
write_data(parameter1);
write_data(parameter2);
write_dictate(command);
}
//清除屏幕(清所有8K存储空间)
void clear_screen()
{
unsigned int i;
write_dictate_twoparameter(0x00,0x00,0x24); //设置显示存储器首地址
write_dictate(0xb0); //设置自动写状态
for(i=10240;i>0;i--)
automatismwrite_data(0x00);
write_dictate(0xb2); //关闭自动写状态
}
//划横线
void line_x(unsigned x_line)
{
register unsigned char i;
register unsigned int address_display;
address_display=x_line*0x14+0x0800; //计算显示存储器地址
for(i=0;i<20;i++)
{
write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24);
write_dictate_oneparameter(0xff,0xc0);
address_display++;
}
}
//ASCII码写入函数
//x:0~19; y:0~127
void write_asc(unsigned char x,unsigned char y,unsigned char ascii,unsigned char reverse)
{
register unsigned char i,j;
register unsigned int address_display;
unsigned char account_ascii;
const unsigned char *p_ascii_sign;
const unsigned char *p_ascii_lattice;
address_display=y*0x14+x+0x0800; //计算显示存储器地址
for(;;)
{
i=0;
account_ascii=sizeof(ascii_model)/sizeof(ascii_model[0]);
while(i<account_ascii)
{
p_ascii_sign=ascii_model[i].ascii_sign;
if(*p_ascii_sign==ascii)
{
p_ascii_lattice=ascii_model[i].ascii_lattice;
for(j=0;j<16;j++) //计数值16
{
write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24);
if(reverse==0)
{
write_dictate_oneparameter(*(p_ascii_lattice++),0xc0); //写入西文字符字模
}
else
{
write_dictate_oneparameter(~*(p_ascii_lattice++),0xc0); //写入西文字符字模
}
address_display+=20; //修改显示存储器地址,显示下一列(共16列)
}
break;
}
else
i++;
}
break;
}
}
//汉字写入函数
//x_hz:0~19; y_hz:0~127
void write_chinese(unsigned char x,unsigned char y,unsigned char hz0,unsigned char hz1,unsigned char reverse)
{
register unsigned char i,j;
register unsigned int address_display;
unsigned char account_hz;
const unsigned char *p_zimo;
address_display=y*0x14+x+0x0800;
for(;;)
{
i=0;
account_hz=sizeof(zimo_hz)/sizeof(zimo_hz[0]);
while(i<account_hz)
{
if((hz0==zimo_hz[i].hzcode[0]&&hz1==zimo_hz[i].hzcode[1])||(i==account_hz-1))
{
p_zimo=zimo_hz[i].hz_dianzhen;
for(j=0;j<16;j++) //计数值16
{
write_dictate_twoparameter((address_display&0xff),(address_display>>8),0x24); //设置显示存储器地址
if(reverse==0)
{
write_dictate_oneparameter(*(p_zimo++),0xc0); //写入汉字字模左部
write_dictate_oneparameter(*(p_zimo++),0xc0); //写入汉字字模右部
}
else
{
write_dictate_oneparameter(~*(p_zimo++),0xc0); //写入汉字字模左部
write_dictate_oneparameter(~*(p_zimo++),0xc0); //写入汉字字模右部
}
address_display+=20; //修改显示存储器地址,显示下一列(共16列)
}
break;
}
else
i++;
}
break;
}
}
//显示函数
void display(unsigned char reverse)
{
unsigned char x_screen,y_screen; //字符在LCD的显示行,列位置
unsigned char *p; //显示字符形码的内存映射地址
unsigned char ascii,chinese0,chinese1;
x_screen=*p_address;
y_screen=*(p_address+1);
while(*p_content!=0)
{
if(*p_content<=128)//显示ascii
{
ascii=*p_content;
write_asc(x_screen++,y_screen,ascii,reverse);
p_content++;
}
else //显示汉字
{
chinese0=*p_content;
chinese1=*(p_content+1);
write_chinese(x_screen,y_screen,chinese0,chinese1,reverse);
p_content=p_content+2;
x_screen=x_screen+2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -