📄 lcd.c
字号:
wrt_lcd_cmd(0x40); //设置DDRAM中的页地址(Y地址)
for(j=0;j<64;j++)
{
//输入一区中的一逻辑行
//send_str(1, p);
//_nop_();
_nop_();
wrt_lcd_data(*p);
p++;
}
}
xaddr++;
k--;
}while(k!=0);
select_p(3);
}
//=====================================================================================
/*
void write_lcd_mem1(uchar xaddr,uchar yaddr,uchar len,uchar xdata *disbuf)
{
uchar i;
uchar j;
uchar k;
uchar xdata *p;
uchar templen;
templen=len;
p=&disbuf[xaddr*192+yaddr*8];
xaddr=xaddr+0xb8; //设置DDRAM中的页地址(X地址)
k=2;
do //输入全屏
{
if(xaddr>0x0bf) break;
i=0;
do //输入一逻辑行
{
if(yaddr/8)i+=yaddr/8;
select_p(i); //选第几部分共3部分每部分64列
wrt_lcd_cmd(0xc0); //第0行显示
wrt_lcd_cmd(xaddr); //设置DDRAM中的页地址(X地址)
wrt_lcd_cmd(0x40+(yaddr%8)*8); //设置DDRAM中的页地址(Y地址)
j=0;
do //输入一区中的一逻辑行
{
wrt_lcd_data(*p);
j++;
if((j%8)==0)templen--;
if(templen==0){break;}
p++; //偶数位对应偶数16行
}while(j<64);
if(templen==0){break;}
i++;
}while(i<3);
xaddr++;
templen=len;
p=&disbuf[(xaddr-0xb8)*192+yaddr*8];
k--;
}while(k!=0);
select_p(3);
}
*/
/******************************************************************/
/* 函数功能:清LCD模块显示 */
/* 入口参数: */
/* xaddr 清显起始行(0~3) */
/* num 清显行数(1~(8-(xaddr)/2)) */
/******************************************************************/
void clear_lcd(uchar addr,uchar num)
{
uchar xdata i;
uchar xdata *p;
uchar xdata buf[1536];
addr*=2;
p=&buf[addr*192];//一行为192个BYTE共8行
while(num!=0)
{
i=192;
do
{ //清两行一行汉字
*p=0x00; //第一行
p++;
*p=0x00;
p++;
i--;
}while(i!=0);
write_lcd_mem(addr,buf); //清两行一行汉字
addr+=2; //清两行一行汉字
if(addr>7) break;
num--;
}
}
/****************************************************************************/
/* 函数功能:LCD模块放大显示 */
/* 入口参数: */
/* xaddr 显示起始行地址 0~3 */
/* n 显示起始列地址 0~23 */
/* bx 放大控制 */
/* 0 长放大1倍(汉字:12*2;ASCII码:24*2); */
/* 1 宽放大1倍(汉字:6*4;ASCII码:12*4); */
/* >1 长和宽都放大1倍(汉字:6*2;ASCII码:12*2); */
/* *buf 进行放大显示的AscII码或汉字内码数据 */
/****************************************************************************/
/*void bigx1(uchar xaddr,uchar n,uchar bx,uchar xdata *buf)
{
uchar i;
uchar leng;
uchar xdata *p;
uchar xdata c_buf[1536];
uchar xdata l_temp[50]; //暂存寄存数组
uchar xdata m_buf[1024]; //点阵显示数据暂存寄存数组
leng=strlen(buf);
i=24-n;
if(bx!=0) i=i/2;
if(leng>i) leng=i;
convert(buf,m_buf); //转化显示代码
p=&c_buf[xaddr*192+n*16];
buf=m_buf;
while(leng!=0)
{
switch(bx)
{
case 0:
bighx1_a(buf,p);
p+=16;
break;
case 1:
bigwx1_a(buf,p);
p+=32;
break;
default:
bigwx1_a(buf,l_temp);
bighx1_a(&l_temp[0],p);
p+=16;
bighx1_a(&l_temp[16],p);
p+=16;
}
buf+=16;
leng--;
}
write_lcd_mem(xaddr,c_buf); //2002,12,31 升级修改
xaddr+=2;
if(bx!=1) write_lcd_mem(xaddr,c_buf);
}
*/
/******************************************************************/
/* 函数功能:LCD模块反显控制 */
/* 入口参数: */
/* xaddr 反显起始行地址 0~3 */
/* n 反显起始列地址 0~23 */
/* leng 反显区域长度 1~(24-n) */
/******************************************************************/
void con_disp2(uchar xaddr,uchar yaddr,uchar length,uchar *buf)
{
uchar i,xtemp;
uchar xdata *p;
uchar xdata c_buf[1536];
uchar xdata l_temp[50]; //暂存寄存数组
memset(c_buf,0,1536);
xaddr*=2;
p=&c_buf[(uint)xaddr*192];
xtemp=xaddr;
i=0;
while(i<24) //把输入的字符串(*buf)分成24字节长一组(一行)存到l_temp数组中
{ //分成24字节一组由分隔符(\r)控制,用户输入数据到buf时必须给出
if(*buf==0) {break;} //显示数据取完
l_temp[i]=*buf;
buf++;
i++;
}
l_temp[i]=0; //以'\0'作为一组的结束标志
convert(l_temp,p); //转化显示代码并存到c_buf中
con_data(length*8,p+(uint)yaddr*8);
con_data(length*8,p+(uint)yaddr*8+192);
write_lcd_mem(xtemp,c_buf);
}
//=================================================================================
void con_disp(uchar xaddr,uchar yaddr,uchar length,uchar *buf)
{
uchar i,xtemp;
// uchar EAStatus;
uchar xdata *p;
bit final=0; //内部显示内码数据映射寄存区结束标志位
bit single;
uchar xdata c_buf[1536];
uchar xdata l_temp[50]; //暂存寄存数组
// EAStatus = EA;
//EA = 0;
//i=length;
//_lcd_cmd(0x3f); //开显示
//_nop_ ( );
//_lcd_cmd(0x0c0); //设置显示起始行第0行开始
memset(c_buf,0,1536);
if(yaddr%2) single=1;
else single=0;
xaddr*=2;
p=&c_buf[(xaddr*192)+16*yaddr];
xtemp=xaddr;
//xtemp*=2;
while(xtemp<8)
{
i=0;
while(1) //把输入的字符串(*buf)分成24字节长一组(一行)存到l_temp数组中
{ //分成24字节一组由分隔符(\r)控制,用户输入数据到buf时必须给出
//if(*buf==0) {final=1;break;} //显示数据取完
if(*buf==0x0d) {final=1;buf++;break;}
if(is_chinese(buf))
{
;
}
else
{
if(single) single=0;
else single=1;
}
if((yaddr+i)==23)
{
if((single)&&(*buf>=0xa0)) {l_temp[i]=' ';i++;break;}
}
if((yaddr+i)>23) break;
l_temp[i]=*buf;
buf++;
i++;
}
l_temp[i]=0; //以'\0'作为一组的结束标志
convert1(l_temp,p,length); //转化显示代码并存到c_buf中
write_lcd_mem(xtemp,c_buf);//write_lcd_mem(xaddr); //2002,12,31 升级修改
if(final) break;
p+=384;
xtemp+=2;
}
// EA = EAStatus;
}
/******************************************************************/
/* 函数功能:LCD模块显示(汉字16X16 AscII码8X8) */
/* 入口参数: */
/* xaddr 显示起始行地址 0~3 */
/* n 显示起始列地址 0~23 */
/* *buf 显示AscII码或汉字内码数据(最大为 4*25 ASCII码字符串) */
/******************************************************************/
void lcd_disp(uchar xaddr,uchar yaddr,uchar *buf)
{
uchar i,xtemp;
//uchar EAStatus;
uchar xdata *p;
bit final=0; //内部显示内码数据映射寄存区结束标志位
bit single;
uchar xdata c_buf[1536];
uchar xdata l_temp[50]; //暂存寄存数组
//EAStatus = EA;
//EA = 0;
init_lcd(0x3f); //开显示
_nop_ ( );
init_lcd(0x0c0); //设置显示起始行第0行开始
memset(c_buf,0,1536);
if(yaddr%2) single=1;
else single=0;
xaddr*=2;
p=&c_buf[(xaddr*192)+16*yaddr];
xtemp=xaddr;
while(xtemp<8)
{
i=0;
while(1) //把输入的字符串(*buf)分成24字节长一组(一行)存到l_temp数组中
{ //分成24字节一组由分隔符(\r)控制,用户输入数据到buf时必须给出
if(*buf==0) {final=1;break;} //显示数据取完
if(*buf=='\r') {buf++;break;}
if(is_chinese(buf))
{
single=0;
}
else
{
single=1;
}
if((yaddr+i)==23)
{
if(single==0)
{
l_temp[i]=' ';
i++;
break;
}
}
if((yaddr+i)>23)
break;
if(single==0)
{
l_temp[i]=*buf;
buf++;
i++;
}
l_temp[i]=*buf;
buf++;
i++;
}
l_temp[i]=0; //以'\0'作为一组的结束标志
convert(l_temp,p); //转化显示代码并存到c_buf中
write_lcd_mem(xtemp,c_buf);//write_lcd_mem(xaddr); /*2002,12,31 升级修改*/
if(final) break;
p+=384;
xtemp+=2;
}
//EA = EAStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -