📄 lcd_part_12864j.c
字号:
{
case 0: //processing start data
if(xstd > 8)
{
if(xsdl > 8) //开始位置LCD原始数据大于8bit,
{ //st7920 横向为16bit数据,数据需读两次
B = sd1; //开始位置LCD原始数据(0-7)
gcount = 8;
xsdl = xsdl - 8;
}
else
{
B = sd2; //开始位置LCD原始数据(8-15)
gcount = xsdl;
dstate = 1;
}
}
else
{
B = sd1; //开始位置LCD原始数据(0-7)
gcount = xsdl;
dstate = 1;
}
break;
case 1: //processing data
if(dlen > 8)
{
B = Byte[bcount]; //写入8bit数据处理
dlen = dlen - 8;
gcount = 8;
bcount++;
}
else
{
B = Byte[bcount]; //写入数据不足8bit结尾处理
gcount = dlen;
if(ovxend > 128)
bcount = bcount + ((ovxend - 128)/8); //大于128bit的数据组需要跳读才能正常显示
bcount++; //横向多出部分进行消隐
dstate = 2;
}
break;
case 2: //processing end data
if(xetd > 8)
{
if(xedl > 8)
{
temp1 = 16 - xedl; //结尾位置LCD原始数据大于8bit,
B = ed1; //st7920 横向为16bit数据,数据需读两次
B = B << temp1; //结尾位置LCD原始数据(0-7)
gcount = xedl - 8;
xedl = 0;
}
else
{
gcount = 0; //结尾位置LCD原始数据(8-15)
g = tlen + 1; //jumping Out the writing lcd's data program
dstate = 0; //由于结尾原始数据无需修改,直接跳出
}
}
else
{
temp1 = 8 - xedl; //结尾位置LCD原始数据小于8bit(8-15)
B = ed2;
B = B << temp1;
gcount = xedl;
dstate = 0;
}
break;
default:
break;
}
}
//-------------------------------------------------------
// Target's data process
if(gcount != 0)
{
switch (g1) //击中目标!!
{
case 7:
P0_7 = B_7;
g1--;
break;
case 6:
P0_6 = B_7;
g1--;
break;
case 5:
P0_5 = B_7;
g1--;
break;
case 4:
P0_4 = B_7;
g1--;
break;
case 3:
P0_3 = B_7;
g1--;
break;
case 2:
P0_2 = B_7;
g1--;
break;
case 1:
P0_1 = B_7;
g1--;
break;
case 0:
P0_0 = B_7;
wr_lcd(dat,P0); //writing lcd's data
g1 = 7;
break;
}
//-------------------------------------------------------
// Open fire
B = B << 1; //move data; 开枪!!
gcount--;
g++;
}
}
}
//-------------------------------------------------------
// Complete writing lcd's data task
wr_lcd (comm,DISPLAY_ON);
return error;
}
/******************************************************************************************
* 函数名称 :lcd_china
* 功能描述 :LCD中文显示函数,汉字显示从左上角0位开始,总共显示32个字,中文两个字节,
* 英文只有1个字节,所以英文个数要偶数个才能正常显示,奇数个加空格。
* 参数 : 参数名称: 输入/输出 类型 描述
* *chn input uchar ASCII数据组,最大32汉字
* 返回值 :
* 作者 :lujian
* 创建日期 :2003-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 :0.0.2 修改人:lujian 修改日期:2009-3-16
* 修改说明 :
******************************************************************************************/
void lcd_china(uchar code *chn)
{
uchar i, j, c;
c = strlen(chn);
wr_lcd(comm,FUN_MODE);
for(j=0;j<4;j++)
{
switch (j)
{
case 0:
wr_lcd(comm,0x80); break;
case 1:
wr_lcd(comm,0x90); break;
case 2:
wr_lcd(comm,0x88); break;
case 3:
wr_lcd(comm,0x98); break;
}
for(i=0;i<16;i++)
{
if(c > 0)
{
wr_lcd(dat,chn[j*16+i]); //writing lcd's data of ASCII
c--;
}
else
{
wr_lcd(dat,0x20);
}
}
}
}
/******************************************************************************************
* 函数名称 :coundisplay
* 功能描述 :反显函数,在lcd内任意范围反显,条件x1大于或等于x2,y1大于等于y2
* 参数 : 参数名称: 输入/输出 类型 描述
* x1 input uchar 第一点行位置数据(0-127)
* y1 input uchar 第一点列位置数据(0-63)
* x2 input uchar 第二点位置数据(0-127)
* y2 input uchar 第二点位置数据(0-63)
* 返回值 :
* 作者 :lujian
* 创建日期 :2003-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 :0.0.2 修改人:lujian 修改日期:2009-3-16
* 修改说明 :
******************************************************************************************/
bit coundisplay(uchar x1, uchar y1, uchar x2, uchar y2)
{
uchar xrange, dc, gcount, g, g1, temp1, yt, TDATA;
uchar dstate, start, end, xetd, tlen;
uchar cdata[16];
//-------------------------------------------------------
// Boundary detection
if(x1 > x2 || x1 > 127 || x2 > 127)
{
return FALSE;
}
if(y1 > y2 || y1 > 63 || y2 > 63)
{
return FALSE;
}
wr_lcd(comm,DISPLAY_OFF); //Entry mode set
xrange = x2 - x1 + 1;
start = (x1 /16)*16;
xetd = x2 % 16;
if(xetd!=0)
xetd = 16 - xetd;
end = x2 + xetd;
tlen = end - start;
//-------------------------------------------------------
//main program
//-------------------------------------------------------
for(yt = y1;yt < (y2+1); yt++)
{
dc = 0;
gcount = 0;
dstate = 0;
g = start;
g1 = 7;
B = 0xff;
temp1 = x1 /16; //Reading the start data form lcd.
XYadr(temp1,yt);
rd_lcd();
while(g <= x2)
{
if(gcount == 0) //data empty!!装货物!!
{
TDATA = rd_lcd(); //read lcd's data
gcount = 8;
}
if(g >= x1 && g <= x2)
{
switch (g1)
{
case 7:
ACC = TDATA;
B_7 = ACC_7;
g1--;
break;
case 6:
ACC = TDATA;
B_6 = ACC_7;
g1--;
break;
case 5:
ACC = TDATA;
B_5 = ACC_7;
g1--;
break;
case 4:
ACC = TDATA;
B_4 = ACC_7;
g1--;
break;
case 3:
ACC = TDATA;
B_3 = ACC_7;
g1--;
break;
case 2:
ACC = TDATA;
B_2 = ACC_7;
g1--;
break;
case 1:
ACC = TDATA;
B_1 = ACC_7;
g1--;
break;
case 0:
ACC = TDATA;
B_0 = ACC_7;
cdata[dc] = ~B; //save counter data; 每满8个打包货物(在此数据取反)
dc++;
g1 = 7;
break;
}
}
TDATA = TDATA << 1; //move data;
gcount--;
g++;
}
if(g1 != 7)
{
cdata[dc] = ~B; //save Less than 8 bits of counter data; 打包不足8个的货物(在此数据取反)
}
lcd_display(cdata, x1, yt, xrange, 1); //writing counter data; 重写打包数据(即需要反显的数据)
}
//-------------------------------------------------------
// Complete writing lcd's data task
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -