📄 st7565.c
字号:
void display(void)
{
Uint16 i,j;
Uint16 pe=99;
Uint16 te=25;
/****** 清屏 ******/
for(j=0;j<8;j++)
{
lcd_w(0,addr[j]);
lcd_w(0,0x10);
lcd_w(0,0x00);
for (i=0;i<128;i++)lcd_w(1,0x00);
}
/*****************/
/***** 分界线 *****/
//列线
for(i=0;i<6;i++)
{
lcd_w(0,addr[2+i]);
lcd_w(0,0x12);
lcd_w(0,0x00);
lcd_w(1,0xff);
}
lcd_w(0,addr[1]);
lcd_w(0,0x12);
lcd_w(0,0x00);
lcd_w(1,0xfc);
//行线,部分,没包含图标的补线
lcd_w(0,addr[1]);
lcd_w(0,0x12);
lcd_w(0,0x01);
for(i=0;i<111;i++)lcd_w(1,0x04);
/*****************/
/***** 顶上图标 ******/
if(mod==0)
{
if(rev!=0)disp_pic(0);//fn_fg:使用参数校正功能
if(status==2)disp_pic(3);// rn_fg:泵转
//if()disp_pic(2);//堵塞标志??
if(((zz*10000)/flow)<errer && status==2)disp_pic(1);//错误标志
}
//显示电池
lcd_w(0,addr[0]);
lcd_w(0,0x16);
lcd_w(0,0x08);
for(i=0;i<20;i++)lcd_w(1,dc[i]);//dc图标,根据电池的电量改变数组值
/*****************/
/******** 左侧图标 *********/
switch(mod)
{
case run_fg:disp_lf(2,0);//左侧 RUN
if(status==2 && pe!=0)disp_per(pe);//%减计数,如果等于0即正常完成则消失
break;
case set_fg:disp_lf(4,1);//左侧SYS
break;
case fun_fg:disp_lf(6,2);//左侧FUN
break;
default: break;
}
//显示标识符
if(mod==0)//运行菜单
{
switch(run_i)//要求mod=RUN,同时上翻下翻的显示
{
case te_fg: disp_bsf(0,3);//设置值
disp_bsf(1,4);//
disp_dw(4,1);//min
disp_dw(7,0);//slm
break;
case ft_fg: disp_bsf(0,1);//时间--流量
disp_bsf(1,0);//
disp_dw(4,1);//min
disp_dw(7,0);//slm
break;
case sf_fg: disp_bsf(0,2);//温度--流量
disp_bsf(1,0);//
disp_dw(4,2);//温度
disp_dw(7,0);//slm
break;
default: break;
}
}
else if(mod==1)//设置菜单
{
disp_bsf(2,0);//温度--流量
disp_bsf(4,1);//
disp_bsf(6,2);//
disp_dw(3,0);//温度
disp_dw(5,1);//slm
disp_dw(7,2);//slm
}
if(mod==2)//功能菜单
{
disp_letter(2,2);
disp_letter(4,0);
disp_letter(6,1);
disp_num(6,((float)errer)/100);
}
//显示数字
if(mod==1)//设置菜单
{
disp_num(2,((float)flow)/100);//进入菜单默认设置
disp_num(4,((float)time)/100);//
disp_num(6,((float)rev)/100);//
}
else if(mod==0)
{
disp_num(3,((float)te)/100);
disp_num(6,zz);
}
}
//顶上图标
void disp_pic(Uint16 sel)
{
Uint16 i;
lcd_w(0,addr[0]);
lcd_w(0,0x12+sel);
lcd_w(0,0x00);
for(i=0;i<14;i++)lcd_w(1,pic_f[sel][i]);//rn图标
//补充行线
lcd_w(0,addr[1]);
lcd_w(0,0x12+sel);
lcd_w(0,0x00);
if(sel==0)lcd_w(1,0xfd);//补全断线,fn影响部分列线
for(i=0;i<14;i++)lcd_w(1,0x05);
}
//百分比
void disp_per(Uint16 perc)
{
Uint16 i,j,k;
Uint16 temp[3];
temp[0]=(perc%100/10);
temp[1]=(perc%10);
temp[2]=10;
for(i=0;i<2;i++)//占用2个page
{
lcd_w(0,addr[6+i]);//显示的位置
lcd_w(0,0x10);
lcd_w(0,0x03);
for(k=0;k<3;k++)//显示2位数据
{
if(i)lcd_w(1,0x7f);
else lcd_w(1,0xfe);
for(j=i*8;j<8*(i+1);j++)lcd_w(1,per_num[temp[k]][j]);
}
if(i)lcd_w(1,0x7f);
else lcd_w(1,0xfe);
}
}
//RUN Set fuc
void disp_lf(Uint16 z,Uint16 sel)
{
Uint16 i,j;
for(i=0;i<2;i++)//占用2个page
{
lcd_w(0,addr[z+i]);//显示的位置
lcd_w(0,0x10);
lcd_w(0,0x00);
for(j=i*32;j<32*(i+1);j++)lcd_w(1,lf[sel][j]);
}
}
//标识符
void disp_bsf(Uint16 ud,Uint16 sel)
{
Uint16 i,j;
Uint16 z;
if(mod==0)
{
if(ud==0)z=2;//显示的位置
else z=5;
}
else z=ud;
if(mod==1)
{
for(i=0;i<2;i++)//menu_sel菜单选择
{
lcd_w(0,addr[i+2*(menu+1)]);//显示的位置
lcd_w(0,0x12);
lcd_w(0,0x02);
for(j=i*4;j<4*(i+1);j++)lcd_w(1,menu_sel[j]);
}
for(i=0;i<2;i++)//占用2个page
{
lcd_w(0,addr[z+i]);//显示的位置
lcd_w(0,0x12);
lcd_w(0,0x06);
for(j=i*24;j<24*(i+1);j++)lcd_w(1,bsf_set[sel][j]);
}
}
else if(mod==0)
{
for(i=0;i<3;i++)//占用3个page
{
lcd_w(0,addr[z+i]);//显示的位置
lcd_w(0,0x12);
lcd_w(0,0x01);
for(j=i*32;j<32*(i+1);j++)lcd_w(1,bsf_run[sel][j]);
}
}
}
//显示单位
void disp_dw(Uint16 ud,Uint16 sel)
{
Uint16 j;
lcd_w(0,addr[ud]);//显示的位置
lcd_w(0,0x16);
lcd_w(0,0x01);
for(j=0;j<24;j++)lcd_w(1,dw[sel][j]);
}
//数据
void disp_num(Uint16 z,float w)
{
Uint16 i,j,k;
Uint16 ud;
Uint16 temp[3];
Uint16 x;
x=w/1;
w=(w-x)*100;
temp[0]=(x%10);
temp[1]=((int)w%100/10);
temp[2]=((int)w%10);
for(i=0;i<2;i++)//占用2个page
{
lcd_w(0,addr[z+i]);//显示的位置
lcd_w(0,0x14);
lcd_w(0,0x01);
if(w<0)lcd_w(1,0xff);
for(k=0;k<3;k++)//显示3位数据
{
for(j=i*9;j<9*(i+1);j++)lcd_w(1,num[temp[k]][j]);
if(mod==0)ud=6;
else if(mod==1)ud=2;
if(k==0 && i==0 && z==ud)
for(j=0;j<2;j++)lcd_w(1,0x00);//上面空间对齐
if(k==0 && i==1 && z==ud)
for(j=0;j<2;j++)lcd_w(1,0x60);//下面小数点
}
}
}
//显示字母
void disp_letter(Uint16 ud,Uint16 sel)
{
Uint16 i,j,k;
Uint16 temp[3];
switch(sel)
{
case 0:
temp[0]=17;//r
temp[1]=18;//s
temp[2]=19;//t
break;
case 1:
temp[0]=4;//e
temp[1]=17;//r
temp[2]=17;//r
break;
case 2:
temp[0]=1;//
temp[1]=2;//
temp[2]=3;//
break;
default:break;
}
for(i=0;i<2;i++)//menu_sel菜单选择
{
lcd_w(0,addr[i+2*(menu+1)]);//显示的位置
lcd_w(0,0x12);
lcd_w(0,0x02);
for(j=i*4;j<4*(i+1);j++)lcd_w(1,menu_sel[j]);
}
lcd_w(0,addr[ud]);//显示的位置
lcd_w(0,0x12);
lcd_w(0,0x06);
for(k=0;k<3;k++)//显示3位数据
for(j=0;j<9;j++)lcd_w(1,letter[temp[k]][j]);
}
//显示图片
void disp_bmp()
{
Uint16 i=0,j=0;
for(j=0;j<4;j++)
{
lcd_w(0,addr[4+j]);
lcd_w(0,0x10);
lcd_w(0,0x00);
for(i=0;i<128;i++)
{
lcd_w(1,tab1[i+j*128+512]);
}
}
for(j=0;j<4;j++)
{
lcd_w(0,addr[0+j]);
lcd_w(0,0x10);
lcd_w(0,0x00);
for(i=0;i<128;i++)
{
lcd_w(1,tab1[i+j*128]);
}
}
}
void lcd_w(Uint16 sel,Uint16 dat) //sel:1写数据,0写命令
{
Uint16 i;
lcd_a0 = sel;
for (i=0;i<8;i++)
{
if ((dat & 0x80)==0) dat_clr;//数据送0
else dat_set; //数据送1
dat <<= 1; //左移?右移?我的164是左移,板的程序右移
clk_clr; //CLK低电平
clk_set; //CLK高电平
}
}
void lcd_Init(void)
{
lcd_w(0,0xE2); //DB 11100010B ;RESET
lcd_w(0,0x2C); //DB 00101100B
lcd_w(0,0x2E);
lcd_w(0,0x2F); //DB 00101111B ;SET POWER CONTROL
lcd_w(0,0xA3); //DB 10100011B ;SET LCD BIAS
lcd_w(0,0x24); //DB 00100100B ;SET V5 VOLTAGE RATIO
lcd_w(0,0x81); //DB 10000001B ;SET ELECTRONIC VOLUME MODE
lcd_w(0,0x20); //DB 00110010B ;SET ELECTRONIC VOLUME REGISTER
lcd_w(0,0x00); //DB 00000000B ;INITIAL DISPLAY LINE
lcd_w(0,0xa0); //DB 10100000B ;ADC SELECT
lcd_w(0,0xC8); //DB 11000000B ;COMMON OUTPUT MODE
lcd_w(0,0xA2); //DB 10100010B ;DISPLAY ALL POINTS OFF
lcd_w(0,0xA6); //DB 10100110B ;NORMAL DISPLAY
lcd_w(0,0xAD); // ;STATIC INDICATOR
lcd_w(0,0x00);
lcd_w(0,0xAF); //DB 10101111B ;DISPLAY ON
lcd_w(0,0xAF); //DB 10101111B
lcd_w(0,0x03); //DB 00000011B
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -