📄 lcd240.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <hzk.h>
#define lcd_data XBYTE[0x0000] /*液晶显示数据入口*/
#define lcd_com XBYTE[0x8000] /*液晶显示命令入口*/
bdata unsigned char flag;
sbit f_bw=flag^0;
/*******************************************************************/
/*检查是否可以操作液晶*/
void lcd_ready(void)
{
idata unsigned char l_status=0;
while(l_status!=3)
{
l_status=lcd_com;
l_status=l_status&0x03;
}
}
/***********************************************/
/*液晶全屏清除程序*/
void lcd_clr(void)
{
data unsigned char l_adr,h_adr;
data unsigned int i;
l_adr=0;
h_adr=0;
lcd_ready();lcd_com=0x90; /*关闭显示*/
lcd_ready();lcd_com=0xc0; /*数据写,地址加1*/
lcd_ready();lcd_com=0xb0; /* 采用自动写方式 */
lcd_ready();lcd_data=l_adr;
lcd_ready();lcd_data=h_adr;
lcd_ready();lcd_com=0x24; /*地址设置*/
for (i=0;i<8192;i++)
{
lcd_ready();
lcd_data=0x00;
lcd_ready();
lcd_com=0xc4 ; /*写入一个数据*/
}
lcd_ready();lcd_com=0xb2; /* 不采用自动方式 */
lcd_ready();lcd_com=0xc4; /*数据写,地址不变*/
lcd_ready();lcd_com=0x98; /*打开显示*/
}
/***********************************************/
/*液晶初始化*/
void lcd_init(void)
{
lcd_ready();lcd_com=0x90; /*关闭显示*/
lcd_ready();lcd_data=0;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x40; /* 文本区首址为 0000 */
lcd_ready();lcd_data=0;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x42; /* 图形区首址为 0000 */
lcd_ready();lcd_data=30;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x41; /* 文本区域设置 30字节每行*/
lcd_ready();lcd_data=30;
lcd_ready();lcd_data=0;
lcd_ready();lcd_com=0x43; /* 图形区域设置 30字节每行 */
lcd_ready();lcd_com=0x80; /* or显示方式 */
lcd_clr();
lcd_ready();lcd_com=0xb2; /* 不采用自动方式 */
lcd_ready();lcd_com=0xc4; /*数据写,地址不变*/
lcd_ready();lcd_com=0x98; /*打开显示*/
}
/* 8 x 16 汉字字符显示程序 */
void lcd_showa(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
参数y为显示汉字的纵向地址 最大值127 (0--127)
参数arr[]为显示数据表名称 */
data unsigned int adr_pt; /*液晶显示地址指针,用于确定显示位置*/
data unsigned char hz_pt; /*汉字短语内部寻址指针*/
data unsigned int hzk_pt; /*汉字库寻址指针,用于在汉字库中提取数据*/
data unsigned char j;
data unsigned char l_adr; /* 液晶显示RAM地址低位 */
data unsigned char h_adr; /* 液晶显示RAM地址高位 */
hz_pt=0; /*第一个数据*/
adr_pt=30*y+x; /*确定显示首址*/
while (arr[hz_pt]!=0xff) /*短语结束标志为0xff*/
{
l_adr=adr_pt%256;
h_adr=(adr_pt-l_adr)/256; /*计算显示RAM地址*/
hzk_pt=arr[hz_pt]*16; /*计算显示字符的起始地址*/
for (j=0;j<16;j++)
{
lcd_ready();
lcd_data=l_adr;
lcd_ready();
lcd_data=h_adr;
lcd_ready();
lcd_com=0x24; /*地址设置*/
if (f_bw) /*反向显示*/
{ lcd_ready();
lcd_data=~hzk0816[hzk_pt];
}
else
{ lcd_ready();
lcd_data=hzk0816[hzk_pt];
}
lcd_ready();
lcd_com=0xc4; /*写入一个数据*/
hzk_pt++; /*汉字库寻址指针加1*/
l_adr=l_adr+30;
if(l_adr<30) h_adr++;
}
adr_pt=adr_pt+1;
hz_pt++; /*短语内部指针加1,显示下一个字符*/
}
f_bw=0;
}
/* 8 x 16 , 16 x 16汉字字符显示程序 */
void lcd_showb(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
参数y为显示汉字的纵向地址 最大值127 (0--127)
参数arr[]为显示数据表名称 */
idata unsigned int adr_pt; /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt; /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char l_adr; /* 液晶显示地址低位 */
idata unsigned char h_adr; /* 液晶显示地址高位 */
hz_pt=0;
adr_pt=30*y+x; /*确定显示首址*/
while (arr[hz_pt]!=0xff) /*短语结束标志为0xff*/
{
l_adr=adr_pt%256;
h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/
/* 本次采用8X16 16X16 两种字库,一个索引的方法处理*/
/* 短语中,遇到254,则表明下一个字符从16X8字库中取出*/
/* 短语由0XFF结束*/
if (arr[hz_pt]==254)
{
hz_pt++;
hzk_pt=arr[hz_pt]*16;/*计算显示字符的起始地址*/
for (j=0;j<16;j++)
{
lcd_ready();
lcd_data=l_adr;
lcd_ready();
lcd_data=h_adr;
lcd_ready();
lcd_com=0x24; /*地址设置*/
if (f_bw)
{ lcd_ready();
lcd_data=~hzk0816[hzk_pt];
}
else
{ lcd_ready();
lcd_data=hzk0816[hzk_pt];
}
lcd_ready();
lcd_com=0xc4; /*写入一个数据*/
hzk_pt++; /*汉字库寻址指针加1*/
l_adr=l_adr+30;
if(l_adr<30) h_adr++;
}
adr_pt=adr_pt+1;
hz_pt++; /*短语内部指针加1,显示下一个字符*/
}
else
{
hzk_pt=arr[hz_pt]*32; /*计算显示字符的起始地址*/
for (j=0;j<16;j++)
{
lcd_ready();
lcd_data=l_adr;
lcd_ready();
lcd_data=h_adr;
lcd_ready();
lcd_com=0x24; /*地址设置*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk1616[hzk_pt]; }
else
{ lcd_ready(); lcd_data=hzk1616[hzk_pt]; }
lcd_ready();
lcd_com=0xc0; /*写入一个数据*/
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk1616[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk1616[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
l_adr=l_adr+30;
if(l_adr<30) h_adr++;
}
adr_pt=adr_pt+2;
hz_pt++; /*短语内部指针加1,显示下一个字符*/
}
}
f_bw=0;
}
/* 24 x 24汉字字符显示程序 */
void lcd_showc(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
参数y为显示汉字的纵向地址 最大值127 (0--127)
参数arr[]为显示数据表名称 */
idata unsigned int adr_pt; /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt; /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char l_adr; /* 液晶显示地址低位 */
idata unsigned char h_adr; /* 液晶显示地址高位 */
hz_pt=0;
adr_pt=30*y+x; /*确定显示首址*/
while (arr[hz_pt]!=0xff) /*短语结束标志为0xff*/
{
l_adr=adr_pt%256;
h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/
hzk_pt=arr[hz_pt]*72; /*计算显示字符的起始地址*/
for (j=0;j<24;j++)
{
lcd_ready();
lcd_data=l_adr;
lcd_ready();
lcd_data=h_adr;
lcd_ready();
lcd_com=0x24; /*地址设置*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk2424[hzk_pt]; }
else
{ lcd_ready(); lcd_data=hzk2424[hzk_pt]; }
lcd_ready();
lcd_com=0xc0; /*写入一个数据*/
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk2424[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk2424[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk2424[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk2424[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
l_adr=l_adr+30;
if(l_adr<30) h_adr++;
adr_pt=adr_pt+2;
hz_pt++; /*短语内部指针加1,显示下一个字符*/
}
}
f_bw=0;
}
/* 32 x 32汉字字符显示程序 */
void lcd_showd(unsigned char x,unsigned char y,unsigned char arr[])
{
/*参数x为显示汉字的横向地址 最大值29 (0--29)
参数y为显示汉字的纵向地址 最大值127 (0--127)
参数arr[]为显示数据表名称 */
idata unsigned int adr_pt; /*液晶显示地址指针,用于确定显示位置*/
idata unsigned char hz_pt; /*汉字短语内部寻址指针*/
idata unsigned int hzk_pt; /*ASCII寻址指针,用于在字库中提取数据*/
/*idata unsigned int hzk2_pt; /*汉字库寻址指针,用于在字库中提取数据*/
idata unsigned char j;
idata unsigned char l_adr; /* 液晶显示地址低位 */
idata unsigned char h_adr; /* 液晶显示地址高位 */
hz_pt=0;
adr_pt=30*y+x; /*确定显示首址*/
while (arr[hz_pt]!=0xff) /*短语结束标志为0xff*/
{
l_adr=adr_pt%256;
h_adr=(adr_pt-l_adr)/256; /*计算显示位置的低位,高位地址*/
hzk_pt=arr[hz_pt]*128; /*计算显示字符的起始地址*/
for (j=0;j<32;j++)
{
lcd_ready();
lcd_data=l_adr;
lcd_ready();
lcd_data=h_adr;
lcd_ready();
lcd_com=0x24; /*地址设置*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk3232[hzk_pt]; }
else
{ lcd_ready(); lcd_data=hzk3232[hzk_pt]; }
lcd_ready();
lcd_com=0xc0; /*写入一个数据*/
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk3232[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk3232[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk3232[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk3232[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
if (f_bw)
{ lcd_ready(); lcd_data=~hzk3232[hzk_pt]; }
else
{ lcd_ready((); lcd_data=hzk3232[hzk_pt]; }
lcd_ready();
lcd_com=0xc0;
hzk_pt++; /*汉字库寻址指针加1*/
l_adr=l_adr+30;
if(l_adr<30) h_adr++;
adr_pt=adr_pt+2;
hz_pt++; /*短语内部指针加1,显示下一个字符*/
}
}
f_bw=0;
}
main()
{ unsigned char p[]={0,254,1,2,3,255};
unsigned int i;
lcd_init();
while(1)
{
lcd_showb(1,1,p);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -