📄 lcd.c
字号:
{hz_temp[i] =~(*(ptr + i));}
if(fx == 1)
{hz_temp[i] =*(ptr + i);}
k = hz_temp[i];
}
for (i = 0; i < 8;i++)
{
hzdata[i] = 0;
j = i;
hzdata[i] = (((hz_temp[0] << j) & 0x80) >>7) | (((hz_temp[1] << j) & 0x80) >> 6);
hzdata[i] |= (((hz_temp[2] << j) & 0x80) >> 5) | (((hz_temp[3] << j) & 0x80) >> 4);
hzdata[i] |= (((hz_temp[4] << j) & 0x80) >> 3) | (((hz_temp[5] << j) & 0x80) >> 2);
hzdata[i] |= (((hz_temp[6] << j) & 0x80) >> 1) | ((hz_temp[7] << j) & 0x80) ;
}
k = page1 >> 3;
if(k > 7) k &= 0x07 ;
j = page1 & 0x07;
if(j == 0) {ii = 0; ij = 0xf0;}
else if(j == 1) {ii = 1; ij = 0xe1;}
else if(j == 2) {ii = 0x03; ij = 0xc3;}
else if(j == 3) {ii = 0x07; ij = 0x87;}
else if(j == 4) {ii = 0x0f; ij = 0x0f;}
else if(j == 5) {ii = 0x1f; ij = 0xf7;}
else if(j == 6) {ii = 0x3f; ij = 0xfc;}
else if(j == 7) {ii = 0x7f; ij = 0xf8;}
if(val)// 清除原位置内容
{
for(i = 0; i < 8; i++)
{
st_data = disp_ram[k][column1 + i-2 ];
disp_ram[k][column1 + i - 2] = (st_data & ii) | (hzdata[i] << j) ;
if(k < 7)
{
st_data = disp_ram[k+1][column1+i-2];
disp_ram[k+1][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
}
else
{
st_data = disp_ram[0][column1+i-2];
disp_ram[0][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
}
}
}
else//保留原位置内容
{
for(i = 0; i < 8; i++)
{
st_data = disp_ram[k][column1 + i-2 ];
disp_ram[k][column1 + i - 2] = st_data | (hzdata[i] << j) ;
if(k < 7)
{
st_data = disp_ram[k+1][column1+i-2];
disp_ram[k+1][column1+i-2] = st_data | (hzdata[i] >> (8-j));
}
else
{
st_data = disp_ram[0][column1+i-2];
disp_ram[0][column1+i-2] = st_data | (hzdata[i] >> (8-j));
}
}
}
}
//**************************************************************************************************************************
//显示12*12汉字,思路是先放前面的12个字符,这将会分两页来完成,写每页的时候先把要显示的区域清空,
//再写上要写的内容。再写后面的12个字符,这将会出现在第二和第三页上,也是先把要显示的区域清空?//写第二页的的时候要注意保留写前12个字符时的内容,所以清空第二页的时候有可能是保留上下两头的数据,
void display_hz1212(unsigned char* hz_idptr,unsigned char page,unsigned char column)
{
unsigned char xdata i,j,k,st_data;
unsigned char xdata ii,ij,jj;
unsigned char xdata hzdata[24];
unsigned char xdata page1,column1;
page1 = page;
column1 = column;
if(column1 > 117) column1 = 2;
for(i = 0;i < 24;i ++)
{
hzdata[i] = *hz_idptr ++;
}
k = page1/8;//传入的page1是行地址,k为实际的页地址
if(k > 7) k = (k % 8);
j = page1%8;//j为除以8后的数,表示离标准的页地址中的第一行的距离
if(j == 0) {ii = 0; ij = 0xf0;jj = 0xFF;}
else if(j == 1) {ii = 1; ij = 0xe1;jj = 0xFF;}//当要显示的输出现在页的第1行(之前是第0行),需要把之后的7行都清空
else if(j == 2) {ii = 0x03; ij = 0xc3;jj = 0xFF;}//ii表示上面的第一页需要与上(清空)的数。ij表示下面的第三页需要与上(清空)的数
else if(j == 3) {ii = 0x07; ij = 0x87;jj = 0xFF;}
else if(j == 4) {ii = 0x0f; ij = 0x0f;jj = 0xFF;}
else if(j == 5) {ii = 0x1f; ij = 0xf7;jj = 0xFE;}
else if(j == 6) {ii = 0x3f; ij = 0xfc;jj = 0xFC;}
else if(j == 7) {ii = 0x7f; ij = 0xf8;jj = 0xF8;}
for(i = 0; i < 12; i++)//送前12个数
{
st_data = disp_ram[k][column1+i-2];//先取出要覆盖的页所在的数值然后并上要显示的数值
//当column=0时,存入disp_ram[0][126]中,当column=1时,存入disp_ram[0][127]中,
disp_ram[k][column1+i-2] = (st_data & ii) | (hzdata[i] << j) ;
if(k < 7)
{
st_data = disp_ram[k+1][column1+i-2];//头一页不够显示上8个BIT时,下一页接着显示
disp_ram[k+1][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
}
else//当要从最后一页开始显示时,放不下,回到第一页开始显示
{
st_data = disp_ram[0][column1+i-2];
disp_ram[0][column1+i-2] = (st_data & ~ii) | (hzdata[i] >> (8-j));
}
}
k ++;//送后16个数,要么只在第二页,要么在第二页第三页都有
if(k > 7) k = 0;
for(i = 0; i < 12; i++)
{
st_data = disp_ram[k][column1+i-2];//如果从BD4之前的行开始显示,跨越的页数不会超过3
if(j <= 4) disp_ram[k][column1+i-2] = (st_data & ij) | (hzdata[i+12] << j) ;
//如果从BD4之后的行开始显示,跨越的页数为3
else disp_ram[k][column1+i-2] = (st_data & ii) | (hzdata[i+12] << j) ;
if(j >= 5)
{
if(k < 7)
{//开始处理第三页内容
st_data = disp_ram[k+1][column1+i-2];
disp_ram[k+1][column1+i-2] = (st_data & jj) | (hzdata[i+12] >> (8-j));
}
else
{
st_data = disp_ram[0][column1+i-2];
disp_ram[0][column1+i-2] = (st_data & jj) | (hzdata[i+12] >> (8-j));
}
}
}
}
//**************************************************************************************************************************
//显示汉字串,入口为欲显示字符代码串指针,显示列值,行值,间隔
void disp_chn_str(unsigned char *addr_da, unsigned char disp_y,unsigned char disp_x,unsigned char x_step,unsigned char zishu)
{
unsigned char ia;
unsigned int int_chn;
unsigned int chn_aint;
unsigned char block_addr;
unsigned char * ptr;
ia = *addr_da++;
while((ia)&&(zishu))
{
if(ia & 0x80)
{
*((char*)(&int_chn)) = ia;
*(((char*)(&int_chn)) + 1) = *addr_da++;
}
else
{
*((char*)(&int_chn)) = ia;
*(((char*)(&int_chn)) + 1) = 0x30;
}
ia = *addr_da++;
for(block_addr = 0; block_addr < 236; block_addr++)
{
*((char*)(&chn_aint)) = hz_lib[block_addr][0];
*(((char*)(&chn_aint)) + 1) = hz_lib[block_addr][1];
if(chn_aint == int_chn)
{ptr = &hz_lib[block_addr][2]; break; }
}
display_hz1212(ptr, disp_y, disp_x);
disp_x += x_step;
if(zishu != 1)
{zishu -= 2;}
}
}
//**************************************************************************************************************************
void LCD_SHOW_TIME(void)
{
LCD_DispStr(Clock_Date_Str,TimeShowAddrY1,TimeShowAddrX);
LCD_DispStr(Clock_Time_Str,TimeShowAddrY2,TimeShowAddrX);
}
/*
//**************************************************************************************************************************
void LCD_SHOW_ADC(void)
{
xdata unsigned char i;
xdata float tempf;
for(i=0;i<7;i++)
{
tempf=(float)(RTUaddress4[i*2+12]*256 + RTUaddress4[i*2+13])*2500/4095;
sprintf(Str_Buffer,"AI%f",(float)(i+1));
LCD_DispStr(Str_Buffer,i*8,72);
sprintf(Str_Buffer,":%4.3f:",tempf/1000);
LCD_DispStr(Str_Buffer,i*8,90);
}
}
*/
/*
//**************************************************************************************************************************
void LCD_SHOW_DAC(void)
{
sprintf(Str_Buffer,"AO1:%4.3fV",(float)(RTUaddress4[28]*256 + RTUaddress4[29])/1000);
LCD_DispStr(Str_Buffer,0,5);
sprintf(Str_Buffer,"AO2:%4.3fV",(float)(RTUaddress4[30]*256 + RTUaddress4[31])/1000);
LCD_DispStr(Str_Buffer,8,5);
}
/*
/*
//**************************************************************************************************************************
void LCD_SHOW_DI(void)
{
//sprintf(DI_Data,"DI:%8.0b",RTUaddress4[9]);
DI_Data[3] =((RTUaddress4[9] & 0x80)/0x80 | 0x30);
DI_Data[4] =((RTUaddress4[9] & 0x40)/0x40 | 0x30);
DI_Data[5] =((RTUaddress4[9] & 0x20)/0x20 | 0x30);
DI_Data[6] =((RTUaddress4[9] & 0x10)/0x10 | 0x30);
DI_Data[7] = 0x20;
DI_Data[8] =((RTUaddress4[9] & 0x08)/0x08 | 0x30);
DI_Data[9] =((RTUaddress4[9] & 0x04)/0x04 | 0x30);
DI_Data[10]=((RTUaddress4[9] & 0x02)/0x02 | 0x30);
DI_Data[11]=((RTUaddress4[9] & 0x01)/0x01 | 0x30);
LCD_DispStr(DI_Data,48,5);
}
*/
//**************************************************************************************************************************
void LCD_SHOW_BatVol(void)
{
xdata unsigned int temp;
temp=RTUaddress4[10]*256 + RTUaddress4[11];
temp=(unsigned int)((float)temp/4095*2500*4.378);
sprintf(Str_Buffer,"%3.2fV",(float)temp/1000);
LCD_DispStr(Str_Buffer,52,95);
}
//**************************************************************************************************************************
void LCD_SHOW_WellSaveStation(void)
{
sprintf(Str_Buffer,"W:%02.0f",(float)NowWellNum);
LCD_DispStr(Str_Buffer,52,60);
Display_Data();
}
//**************************************************************************************************************************
void LCD_SHOW_InstantaneousSpeed(void)
{
sprintf(Str_Buffer,"S:%4.1fc/m ",InstantaneousSpeed);
LCD_DispStr(Str_Buffer,52,10);
Display_Data();
}
/*
//**************************************************************************************************************************
void LCD_SHOW_KEY(unsigned char keybutton)
{
sprintf(Str_Buffer,"%03.0f",(float)keybutton);
LCD_DispStr(Str_Buffer,32,5);
}
*/
//**************************************************************************************************************************
// The End
//**************************************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -