📄 lcd.c~
字号:
void Lcd_disp_a_h(unsigned char *data_str,unsigned char x,unsigned char y,unsigned char mode)
{
unsigned int data_hz;
unsigned char data_ascii;
while (*data_str)
{
if(y>112||x>6)
continue;
if(chkbit(*data_str,7))
{
data_hz = *data_str++;
data_hz = (data_hz<<8)|*data_str++;
Lcd_disp_hz(data_hz,x,y,mode);
y += 16;
}
else
{
data_ascii = *data_str++;
Lcd_disp_ascii(data_ascii,x,y,mode);
y += 8;
}
}
}
void Lcd_dispf_a_h(unsigned char flash *data_str,unsigned char x,unsigned char y,unsigned char mode)
{
unsigned int data_hz;
unsigned char data_ascii;
while (*data_str)
{
if(y>112||x>6)
return;
if(chkbit(*data_str,7))
{
data_hz = *data_str++;
data_hz = (data_hz<<8)|*data_str++;
Lcd_disp_hz(data_hz,x,y,mode);
y += 16;
}
else
{
data_ascii = *data_str++;
Lcd_disp_ascii(data_ascii,x,y,mode);
y += 8;
}
}
while (y<=128)
{
Lcd_disp_ascii(' ',x,y,mode);
y += 8;
}
}
/******************************************************************************************
在一个矩形窗口内显示一串文本
in : data_str - 要显示的汉字内码字符串
x1,y1 - 窗口左上角的坐标 (0~6,0~127)
x2,y2 - 窗口右下角的坐标 (0~6,0~127)
mode - 显示模式
0正常模式
1反显模式
2裁减模式-超出窗口长度部分裁减
4闪烁模式
注:显示模式可以组合 eg:0x00|0x01|0x02|0x04
******************************************************************************************/
void Lcd_outtextxyf(unsigned char flash *data_str,unsigned char x1,unsigned char y1,
unsigned char x2,unsigned char y2,unsigned char mode)
{
unsigned int data;
unsigned char x,y;
if((y1>127)||(x1>7))
return;
if(y2>127)
y2 = 127;
if(x2>7)
x2 = 7;
x = x1;
y = y1;
while(*data_str)
{
data = *data_str++;
data = (data<<8)|*data_str++;
if(y > (y2-16))
{
y = y1;
x += 2;
}
if(((x > x2) && chkbit(mode,1)) || (x>6))
continue;
Lcd_disp_hz(data,x,y,mode);
y += 16;
}
}
/******************************************************************************************
显示图象
note : x1,x2,y1,y2应与实际的图象大小匹配,否则无法正确显示
in : pic_data_ptr - 图象数据指针
data_len - 图象数据长度
x1,y1 - 图象左上角坐标(0~7,0~127)
x2,y2 - 图象右下角坐标(0~7,0~127)
mode - 显示模式(0正常,1反显)
******************************************************************************************/
void Lcd_disp_picf(unsigned char flash *pic_data_ptr,unsigned int data_len,unsigned char x1,
unsigned char y1,unsigned char x2,unsigned char y2,unsigned char mode)
{
unsigned char i,j;
unsigned char data;
unsigned char cs_bck,cs;
#asm("wdr");
if((y1>127)||(x1>7))
return;
if(y2>127)
y2 = 127;
if(x2>7)
x2 = 7;
if(y1>63)
cs_bck = 2;
else cs_bck = 1;
for(i=x1;i<x2+1;i++)
{
cs = cs_bck;
Lcd_set_addr(i,cs,0);
Lcd_set_addr(y1,cs,1);
for(j=y1;j<y2+1;j++)
{
if(data_len == 0)
return;
data_len--;
data = *pic_data_ptr++;
if(chkbit(mode,0))
data = ~data;
if((j>63)&&(cs == 1))
{
cs = 2;
Lcd_set_addr(i,cs,0);
Lcd_set_addr(j-64,cs,1);
}
Lcd_write_data(data,cs);
}
}
}
void Lcd_disp_buffer(unsigned char *pic_data_ptr,unsigned int data_len,unsigned char x1,
unsigned char y1,unsigned char x2,unsigned char y2,unsigned char mode)
{
unsigned char i,j;
unsigned char data;
unsigned char cs_bck,cs;
if((y1>127)||(x1>7))
return;
if(y2>127)
y2 = 127;
if(x2>7)
x2 = 7;
if(y1>63)
cs_bck = 2;
else cs_bck = 1;
for(i=x1;i<x2+1;i++)
{
cs = cs_bck;
Lcd_set_addr(i,cs,0);
Lcd_set_addr(y1,cs,1);
for(j=y1;j<y2+1;j++)
{
if(data_len == 0)
return;
data_len--;
data = *pic_data_ptr++;
if(chkbit(mode,0))
data = ~data;
if((j>63)&&(cs == 1))
{
cs = 2;
Lcd_set_addr(i,cs,0);
Lcd_set_addr(j-64,cs,1);
}
Lcd_write_data(data,cs);
}
}
}
/******************************************************************************************
闪烁显示预处理
note : 1.目前只支持16X16字符的闪烁显示
2.以像素为单位的图象的闪烁显示暂不支持(太耗代码空间hehe)
3.本函数应用到全局变量Flash_data_buf与Flash_data_pos
4.部分重叠的两个闪烁字符后一个会覆盖前一个
5.x,y指的是字符左上角的像素坐标
6.本函数模块内专用,上层程序不要调用本函数
in : code - 汉字内码
x - 闪烁字符页地址 0~7(bit7活动位)
y - 闪烁字符Y地址 0~127
mode - 显示模式
******************************************************************************************/
void Lcd_flash_preproc(unsigned int code,unsigned char x,unsigned char y,unsigned char mode)
{
unsigned char i;
unsigned char write_flag=0;
unsigned char write_pos;
unsigned char empty_flag=0;
unsigned char search_flag=0;
for(i=0;i<32;i++)
{
if(chkbit(Flash_data_buf[i].x,7))
{
if((abs_c(clrbit(Flash_data_buf[i].x,7)-x)<16)&&
(abs_c(Flash_data_buf[i].y - y)<16))
{
if(chkbit(mode,2))
{
if(search_flag == 0)
{
write_pos = i;
search_flag = 1;
}
else
{
Flash_data_buf[i].x = clrbit(Flash_data_buf[i].x,7);
}
}
else
{
Flash_data_buf[i].x = clrbit(Flash_data_buf[i].x,7);
}
}
}
else
{
if(empty_flag == 0)
{
empty_flag = 1;
write_pos = i;
write_flag = 1;
}
}
}
if(chkbit(mode,2))
{
if((write_flag)||(search_flag))
{
Flash_data_buf[write_pos].code = code;
Flash_data_buf[write_pos].x = setbit(x,7);
Flash_data_buf[write_pos].y = y;
Flash_data_buf[write_pos].mode = clrbit(mode,2);
}
}
}
void Lcd_flash_preproc_ascii(unsigned char code,unsigned char x,unsigned char y,unsigned char mode)
{
unsigned char i;
unsigned char write_flag=0;
unsigned char write_pos;
unsigned char empty_flag=0;
unsigned char search_flag=0;
for(i=0;i<64;i++)
{
if(chkbit(Flash_data_buf_ascii[i].x,7))
{
if((abs_c(clrbit(Flash_data_buf_ascii[i].x,7)-x)<16)&&
(abs_c(Flash_data_buf_ascii[i].y - y)<8))
{
if(chkbit(mode,2))
{
if(search_flag == 0)
{
write_pos = i;
search_flag = 1;
}
else
{
Flash_data_buf_ascii[i].x = clrbit(Flash_data_buf_ascii[i].x,7);
}
}
else
{
Flash_data_buf_ascii[i].x = clrbit(Flash_data_buf_ascii[i].x,7);
}
}
}
else
{
if(empty_flag == 0)
{
empty_flag = 1;
write_pos = i;
write_flag = 1;
}
}
}
if(chkbit(mode,2))
{
if((write_flag)||(search_flag))
{
Flash_data_buf_ascii[write_pos].code = code;
Flash_data_buf_ascii[write_pos].x = setbit(x,7);
Flash_data_buf_ascii[write_pos].y = y;
Flash_data_buf_ascii[write_pos].mode = clrbit(mode,2);
}
}
}
/******************************************************************************************
清除一个16X16大小的区域
******************************************************************************************/
void Lcd_clr(unsigned char x,unsigned char y)
{
unsigned char i,j;
unsigned char d_data;
unsigned char cs;
unsigned char cs_bck=1;
unsigned char draw_y;
if(y>127)
return;
else if(y>63)
{
y -= 64;
cs_bck = 2;
}
x = clrbit(x,7);
for(i=0;i<2;i++)
{
draw_y = y;
cs = cs_bck;
x += i;
if(x>7)
break;
Lcd_set_addr(x,cs,0);
Lcd_set_addr(y,cs,1);
for(j=0;j<8;j++)
{
d_data = 0x00;
Lcd_write_data(d_data,cs);
draw_y++;
if((draw_y > 63)&&(cs == 1))
{
cs = 2;
Lcd_set_addr(x,cs,0);
Lcd_set_addr(draw_y-64,cs,1);
}
else if((draw_y >63)&&(cs == 2)&&(cs_bck == 2))
{
break;
}
}
}
}
/******************************************************************************************
闪烁显示
note : 1.该函数必须应用于主循环中
2.本函数应用到的全局变量
Flash_data_buf
Flash_state
Lcd_flash_timer
3.闪烁频率定为500ms闪烁一次
******************************************************************************************/
void Lcd_flash(void)
{
unsigned char i;
unsigned char x,y,mode;
unsigned int code;
if(Lcd_flash_timer)
return;
Lcd_flash_timer = 100;
if(Flash_state)
{
for(i=0;i<64;i++)
{
if(chkbit(Flash_data_buf[i].x,7))
Lcd_clr(Flash_data_buf[i].x,Flash_data_buf[i].y);
}
}
else
{
for(i=0;i<64;i++)
{
if(chkbit(Flash_data_buf[i].x,7))
{
x = Flash_data_buf[i].x;
y = Flash_data_buf[i].y;
code = Flash_data_buf[i].code;
mode = Flash_data_buf[i].mode;
Lcd_disp_hz(Flash_data_buf[i].code,Flash_data_buf[i].x,Flash_data_buf[i].y,Flash_data_buf[i].mode);
}
}
}
Flash_state = !Flash_state;
}
void Lcd_flash_ascii(void)
{
unsigned char i;
unsigned char x,y,mode;
unsigned char code;
if(Lcd_flash_timer)
return;
Lcd_flash_timer = 100;
if(Flash_state_ascii)
{
for(i=0;i<64;i++)
{
if(chkbit(Flash_data_buf_ascii[i].x,7))
Lcd_clr(Flash_data_buf_ascii[i].x,Flash_data_buf_ascii[i].y);
}
}
else
{
for(i=0;i<64;i++)
{
if(chkbit(Flash_data_buf_ascii[i].x,7))
{
x = Flash_data_buf_ascii[i].x;
y = Flash_data_buf_ascii[i].y;
code = Flash_data_buf_ascii[i].code;
mode = Flash_data_buf_ascii[i].mode;
Lcd_disp_ascii(Flash_data_buf_ascii[i].code,Flash_data_buf_ascii[i].x,Flash_data_buf_ascii[i].y,Flash_data_buf_ascii[i].mode);
}
}
}
Flash_state_ascii = !Flash_state_ascii;
}
/*
*********************************************************************************
* data_str: 显示字符串地址
* x,y 字符串显示起始位置
* mode: 显示模式( 0x0 | 0x01 | 0x02)
* 正常 反显 是否换行
*
*********************************************************************************
*/
void char_disp_buffer(unsigned char flash *data_str,unsigned char x,unsigned char y, unsigned char mode)
{
unsigned char hz_pos;
unsigned int code;
unsigned char x_bck,y_bck;
unsigned char i;
x_bck = x;
y_bck = y;
while(*data_str)
{
x_bck = x;
//y_bck = y;
if(chkbit((*data_str),7)&&(y<112))
{
code = *data_str++;
code = (code<<8)|*data_str++;
for(hz_pos=0;hz_pos<Db_len;hz_pos++)
{
if(code == Hz_16[hz_pos].index)
{
for(i=0;i<32;i++)
{
if(i==16)
{
x_bck++;
y_bck=y;
}
if(chkbit(mode,1))
Disp_buffer[x_bck][y_bck++] = ~Hz_16[hz_pos].data[i];
else
Disp_buffer[x_bck][y_bck++] = Hz_16[hz_pos].data[i];
}
break;
}
}
if(hz_pos == Db_len)
continue;
y += 16;
}
else
{
for(i=0;i<16;i++)
{
if(i==8)
{
x_bck++;
y_bck=y;
}
if(chkbit(mode,1))
Disp_buffer[x_bck][y_bck++] = ~Ascii_16[*data_str][i];
else
Disp_buffer[x_bck][y_bck++] = Ascii_16[*data_str][i];
}
*data_str++;
y += 8;
}
if((chkbit((*data_str),7)&&(y>=112))||(y>=120))
break;
}
if(y<128)
{
x_bck = x;
y_bck = y;
for(i=0;i<2;i++)
{
while(y_bck<128)
{
if(chkbit(mode,1))
Disp_buffer[x_bck][y_bck++] = 0xff;
else
Disp_buffer[x_bck][y_bck++] = 0x0;
}
x_bck++;
y_bck=y;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -