📄 wdd.c
字号:
Waitenble();
Di=1; //数据
RW=0; //写数据
delay(2);
Lcd_Bus=Wdata;
delay(1);
Enable=1; //忙线
delay(2);
Enable=0; //操作允许脉冲信号
}
//------------------读显示数据---------------------------------
unsigned char ReadByte()
{
unsigned char dat;
Waitenble();
Di=1; RW=1;delay(2);
Lcd_Bus=0xff;
Enable=1;delay(2); dat=Lcd_Bus; Enable=0;
return(dat);
}
//--------------------指定位置显示起始-------------------------
//posx 页码 posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
void Locate(unsigned char posx,unsigned char posy)
{
if(posy<64)
{
Cs2=1;Cs1=0;delay(10); //选中第x页左页显示 ,k=0--->7
Lcdwritecom(Page_Add+(posx&7)); //页地址加k,从第0页开始,换行
Lcdwritecom(Col_Add+(posy&63)); //列地址
}
else
{
Cs2=0;Cs1=1;delay(10); //选中第x页右页显示 ,k=0--->7
Lcdwritecom(Page_Add+(posx&7)); //页地址加k,从第0页开始,换行
Lcdwritecom(Col_Add+((posy-64)&63)); //列地址
}
}
//-----------------------------------------------------------------
//**************以上为基本操作函数***********************************
//-----------------------------------------------------------------
/*
//------------------显示12864图片---------------------------
//该程序以调试通过,但未使用
void Disp_Img(unsigned char code *img)
{
unsigned char j,k;
for(k=0;k<8;k++) //8页
{
Cs2=1;Cs1=0;delay(10); //选中k左页显示 ,k=0--->7
Lcdwritecom(Page_Add+k); //页地址加k,从第0页开始,换行
Lcdwritecom(Col_Add+0); //列地址
for(j=0;j<64;j++) //分页显示,k左页开始 ,共8页(64行)
{Lcdwritedata(img[k*128+j]);} //从k=0开始,选中第k行,每行128列
Cs2=0;Cs1=1; delay(10); //选中k右页显示
Lcdwritecom(Page_Add+k);
Lcdwritecom(Col_Add+0); //Col_Add改变否
for(j=64;j<128;j++) //显示右页,坐标从左页开页
Lcdwritedata(img[k*128+j]);
}
}
*/
/*---------------------指定位置显示汉字16*16-----------------------*/
//posx 页码 posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7; posy 0--127;
//cha为要显示的字符在字库点阵CHA_lib[][]中的位置
//-----------------------------------------------------------------
void cha_disp(unsigned char posx,unsigned char posy, unsigned char cha)
{ unsigned char i,temp;
temp=posy;
Locate(posx, posy);
for(i=0;i<16;i++)//每个字符为16列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx, --temp);temp=0;}
Lcdwritedata(CHA_lib[cha][i]);
}
temp=posy;
Locate(posx+1, posy);
for(i=16;i<32;i++)//每个字符为16列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx+1,--temp);temp=0;}
Lcdwritedata(CHA_lib[cha][i]);
}
}
/*---------------------指定位置反显(黑白)汉字16*16-----------------------*/
//posx 页码 posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7; posy 0--128;
//cha为要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//-----------------------------------------------------------------
void cpl_disp(unsigned char posx,unsigned char posy, unsigned char cha)
{ unsigned char i,temp;
temp=posy;
Locate(posx, posy);
for(i=0;i<16;i++)//每个字符为16列
{ if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx, --temp);temp=0;}
Lcdwritedata(~CHA_lib[cha][i]);
}
temp=posy;
Locate(posx+1, posy);
for(i=16;i<32;i++)//每个字符为16列
{ if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx+1, --temp);temp=0;}
Lcdwritedata(~CHA_lib[cha][i]);
}
}
//---------------------指定位置显示数字16*8(紧凑格式)-----------------------*/
//posx 页码 posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7; posy 0--128;
//输入 Numb 为要显示数字
//-----------------------------------------------------------------
void NO_disp(unsigned char posx,unsigned char posy,unsigned char Numb)
{ unsigned char i,temp;
temp=posy;
Locate(posx, posy);
for(i=0;i<8;i++)//每个字符为8列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx, --temp);temp=0;}
Lcdwritedata(CHA_lib[Numb][i]);
}
temp=posy;
Locate(posx+1, posy);
for(i=16;i<24;i++)//每个字符为16列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx+1, --temp);temp=0;}
Lcdwritedata(CHA_lib[Numb][i]);
}
}
//---------------------指定位置(黑白)反显数字16*8(紧凑格式)-----------------------*/
//posx 页码 posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7; posy 0--128;
//输入 Numb 为要显示数字
//-----------------------------------------------------------------
void NO_CPLdisp(unsigned char posx,unsigned char posy,unsigned char Numb)
{ unsigned char i,temp;
temp=posy;
Locate(posx, posy);
for(i=0;i<8;i++)//每个字符为8列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx, --temp);temp=0;}
Lcdwritedata(~CHA_lib[Numb][i]);
}
temp=posy;
Locate(posx+1, posy);
for(i=16;i<24;i++)//每个字符为16列
{if(temp++>63)//如果大约等于64,说明在右屏
{Locate(posx+1, --temp);temp=0;}
Lcdwritedata(~CHA_lib[Numb][i]);
}
}
/*------------------初始化LCD屏--------------------------*/
//------------------------------------------------------
void init_lcd(void)
{
Lcd_Rst=0; //复位,低电平有效
delay(10);
Lcd_Rst=1; //结束复位
delay(10);
Cs2=1; //
Cs1=0; //
// Lcdwritecom(Disp_Off);
Lcdwritecom(Page_Add+0);
Lcdwritecom(Start_Line+0);
Lcdwritecom(Col_Add+0);
Lcdwritecom(Disp_On);
Cs2=0; //
Cs1=1; //
// Lcdwritecom(Disp_Off);
Lcdwritecom(Page_Add+0);
Lcdwritecom(Start_Line+0);
Lcdwritecom(Col_Add+0);
Lcdwritecom(Disp_On);
}
//------------------清除显示---------------
void Clr_Scr(void)
{
unsigned char j,k;
//Waitenble();
#if(Disp_Off_EN==1)
delay(10);
Cs1=1;Cs2=0;Lcdwritecom(Disp_Off);
delay(10);
Cs1=0;Cs2=1;Lcdwritecom(Disp_Off);
#endif
Cs1=0;Cs2=1;
delay(10);
Lcdwritecom(Col_Add+0);
Lcdwritecom(Page_Add+0);
//Enable=1;
for(k=0;k<8;k++) //共8页
{Lcdwritecom(Page_Add+k);
for(j=0;j<64;j++)Lcdwritedata(0x00); //每页64列
}
//Enable=0;
delay(4);
Cs1=1;Cs2=0;
delay(10);
Lcdwritecom(Col_Add+0);
Lcdwritecom(Page_Add+0);
// Enable=1;
for(k=0;k<8;k++) //共8页
{Lcdwritecom(Page_Add+k);
for(j=0;j<64;j++)Lcdwritedata(0x00); //每页64列
}
// Enable=0;
delay(10);
#if(Disp_Off_EN==1)
Cs1=1;Cs2=0;Lcdwritecom(Disp_On);
delay(10);
Cs1=0;Cs2=1;Lcdwritecom(Disp_On);
#endif
}
//***********************************************************************************
//**********************以下实现菜单功能**********************************************
//***********************************************************************************
//----------------------用于描述和操作菜单的全局量---------------
#define Select_MAX 3
unsigned char Menu_NO;//当前显示的菜单号
unsigned char Select_NO;//当前菜单选中的列
struct Menu_node //菜单节点描述
{unsigned char last; //上一级菜单,0代表顶根目录
unsigned char DISP[Select_MAX+1][8];//菜单显示的内容,4x8个字符
unsigned char next[Select_MAX+1];//子菜单,当超过4个时建立假子菜单节点,0代表空
unsigned char add_menu[2];//子菜单超过4个时
};
//-------描述整个系统菜单结构的结构树------------------------
struct Menu_node code Tree[2] ={
{0,//0号为顶级菜单 ,开机界面
{{10,10,10,10,10,10,10,10},//第一排显示8个空格
{10,10,11,12,13,14,10,10},//第二排显示“学子科技”
{10,10,10,10,10,10,10,10},//第三排显示8个空格
{10,10,32,17,28,29,10,10}},//第四排显示“进入系统”
{0,0,0,1},//子菜单号,(3号选项对应子菜单为1号菜单
{0,0}//本菜单下无其它选项,无其他假子菜单节点
},
{0,//上一级菜单,为0号菜单,
{ {1,10,24,25,26,27,10,10},
{2,10,24,25,36,37,10,10},
{3,10,34,35,26,27,10,10},
{4,10,28,29,36,37,10,10}},
{0,0,0,0},
{0,0}
}
};
//***********************以下是实现菜单的一些功能函数********************
//---------------------------------------------------------------------
//刷新显示函数,执行该函数后显示Menu_NO指向的菜单
//---------------------------------------------------------------------
void Show_new(void)
{unsigned char i;
#if(Disp_Off_EN==1)
Cs1=1;Cs2=0;Lcdwritecom(Disp_Off);
Cs1=0;Cs2=1;Lcdwritecom(Disp_Off);
#endif
if(Select_NO!=0){for(i=0;i<8;i++)cha_disp(0,i*16,Tree[Menu_NO].DISP[0][i]);}//第一行
if(Select_NO!=1){for(i=0;i<8;i++)cha_disp(2,i*16,Tree[Menu_NO].DISP[1][i]);}//第二行
if(Select_NO!=2){for(i=0;i<8;i++)cha_disp(4,i*16,Tree[Menu_NO].DISP[2][i]);}//第三行
if(Select_NO!=3){for(i=0;i<8;i++)cha_disp(6,i*16,Tree[Menu_NO].DISP[3][i]);}//第四行
{for(i=0;i<8;i++)cpl_disp(Select_NO*2,i*16,Tree[Menu_NO].DISP[Select_NO][i]);}//反显选择项
#if(Disp_Off_EN==1)
Cs1=0;Cs2=1; Lcdwritecom(Disp_On);
Cs1=1;Cs2=0; Lcdwritecom(Disp_On);
#endif
}
//--------------------------------------------------------------------------------
//消息框,在画面显示(最多16字)短消息,
//输入:cha为要显示的内容数组的首地址,该数组存放要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//输入:n为要显示的字符个数
//输入:MOD为执行模式,0为延时后返回,1为一直等待按键按下后返回,2为在规定时间内等待按键按下
//返回:键值,无键按下情况下,返回255
//说明:退出后自动刷新显示,恢复界面
//---------------------------------------------------------------------------------
unsigned char Msgbox(unsigned char *cha,unsigned char n,unsigned char MOD)
{unsigned char i;
Clr_Scr();
if(n<9)
{for(i=0;i<n;i++)
{cha_disp(3,i*16+(8-n)*8,cha[i]);
}
}
else
{if(n>16)n=16;//最大只能显示16个字符
for(i=0;i<8;i++)
{cha_disp(1,i*16,cha[i]);
}
for(i=8;i<n;i++)
{cha_disp(3,i*16+(16-n)*8,cha[i]);
}
}
i=255;
if(MOD==0) //消息框消息框显示的延时
{delay(10000);delay(10000);delay(10000);delay(10000);delay(10000);delay(10000);
}
else if(MOD==1)
{delay(1000);do{i=key();delay(10);}while(i==255);//等待有按键按下
}
else if(MOD==2)
{for(n=0;n<200;n++) //延时,如果有键按下,立刻返回
{delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
delay(50);i=key();if(i!=255)break;
}
}
Show_new();
return i;
}
//---------------------------------------------------------------------------------
//数据输入框,可在画面显示(最多16字)提示信息,
//输入:cha为要显示提示信息内容数组的首地址,该数组存放要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//输入:n为要提示信息的字符个数
//输入:dat为初始数据,最大值为999999,
//返回:按确定键后返回设定的数据,最大值为999999;如果按下退出键,则返回输入的初始数据dat
//说明:退出后自动刷新显示,恢复界面
//
//---------------------------------------------------------------------------------
signed long Inputbox_dat(unsigned char *cha,unsigned char n,signed long dat)
{unsigned char i;
Clr_Scr();
if(n<9)
{for(i=0;i<n;i++)
{cha_disp(3,i*16+(8-n)*8,cha[i]);
}
}
else
{if(n>16)n=16;//最大只能显示16个字符
for(i=0;i<8;i++)
{cha_disp(1,i*16,cha[i]);
}
for(i=8;i<n;i++)
{cha_disp(3,i*16+(16-n)*8,cha[i]);
}
}
{
signed long temp=dat;//备份,如果按下退出键,返回该备份
unsigned char dat_buf[6];//最大输入六位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -