📄 串口+8个键盘程序.c
字号:
}
else //如果不是最后的索引
{
if(SelectLine!=4) //如果当前不是屏幕最底行(SelectLine是LCD液晶屏的最后一行)
{
SelectIndex++; //选择索引自加
SelectLine++; //选择行下移
SetALineReverse (SelectLine); //刷新选择行
DIS12864M (); //刷新显示
}
else //如果是屏幕最低行" 是LCD液晶屏的最后一行"
{
FirstLineDisIndex++; //第一行显示下移//将第一个先显示的行移走,换成它的下一行
SelectIndex++; //选择索引自加
DIS12864M(); //刷新显示
}
}
}
//----------------------------------------
//
// 某一项功能函数 实际应该改为实际功能函数
//
//----------------------------------------
void ShutDown (void)
{
unsigned char code font[] = {"系统关闭"};
unsigned char i;
SentAIns(0x01);
SentAIns(0x92);
for(i=0;i<8;i++) SentAData(font[i]);
}
void MenuCancelOption(void);
void NoThisFunction (void)
{
unsigned char code Font[] = {"没有这个功能"};
unsigned int i,j;
SentAIns(0x01);
SentAIns(0x91);
for(i=0;i<12;i++) SentAData(Font[i]);
i = 65535;
j = 10;
do
{
do
{
i--;
}while(i);
j--;
}while(j);
MenuCancelOption();
}
void TemperatureShow(void)
{
unsigned char code Font[] = {"测试温度:"};
unsigned int i,j;
//TempConvert ();
SentAIns(0x01);
SentAIns(0x90);
for(i=0;i<10;i++) SentAData(Font[i]);
// for(i=0;i<6;i++) SentAData(TempFont[i]);
i = 65535;
j = 10;
do
{
do
{
i--;
}while(i);
j--;
}while(j);
MenuCancelOption();
}
//----------------------------------------
//
// 具体功能散转函数
// 函数原形:void FunctionAction
// 没有参数,没有返回值
// 调用方式:void FunctionAction (void);
//
//----------------------------------------
void FunctionAction (void)
{
switch (LastIndex) //根据进入前的索引LastIndex判断具体函数
{
case 8: ShutDown(); break;
case 5: TemperatureShow(); break;
default: NoThisFunction(); break; //如果没有具体操作,显示没有这个功能
}
}
//----------------------------------------
//
// 进入某项功能函数
// 函数原形:void MenuEnterOption (void);
// 没有参数,没有返回值
// 调用方式:void MenuEnterOption (void);
//
//----------------------------------------
void MenuEnterOption (void)
{
LastIndex = SelectIndex; //标记进入前的索引号(以便判断具体功能)根据进入前的索引LastIndex判断具体函数
SelectIndex = sOption[SelectIndex].EnterIndex; //更新选择索引为之前索引号对应进入索引
if(SelectIndex != OPTIONMETE-1) //如果当前索引不是功能选择索引
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行显示为进入表单第一项
SelectLine = 1; //设定第一行为选择行
DIS12864M (); //刷新菜单
}
else FunctionAction (); //如果是功能选择项,进入功能分支判断函数
}
//----------------------------------------
//
// 菜单退出功能函数
// 函数原形:void MenuCancelOption (void);
// 没有参数,没有返回值
// 调用方式:void MenuCancelOption (void);
//
//----------------------------------------
void MenuCancelOption (void)
{
if(SelectIndex != OPTIONMETE-1) //如果不是从功能返回
SelectIndex = sOption[SelectIndex].CancelIndex; //选择索引为选项返回索引
else //如果是从功能返回
SelectIndex = LastIndex; //索引等于进入前保存索引
if(Level[sOption[SelectIndex].KeyLevel][2]>=4) //如果返回表单选项数目大于4个
{
if(SelectIndex > Level[sOption[SelectIndex].KeyLevel][1]-3) //根据返回选项确定显示首项
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1]-3;
SelectLine = 4-(Level[sOption[SelectIndex].KeyLevel][1]-SelectIndex);
DIS12864M (); //刷新显示
}
else //一般显示方式
{
FirstLineDisIndex = SelectIndex; //第一行显示索引
SelectLine = 1; //选择第一行
DIS12864M (); //刷新菜单
}
}
else //如果返回表单选项数目不足4个
{
FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行显示索引为表单第一项
SelectLine = SelectIndex - Level[sOption[SelectIndex].KeyLevel][0]+1; //选择行标志为当前选择索引对应行
DIS12864M (); //刷新菜单
}
}
//----------------------------------------
//
// 菜单操作按键处理散转函数
// 函数原形:void KeyCodeAction (unsigned char KeyCode);
// 键码作为参数,没有返回值
// 调用方式:void KeyCodeAction (unsigned char KeyCode);
// 实际使用应根据自己的按键重新编写case项
//
//----------------------------------------
void KeyCodeAction (unsigned char KeyCode)
{
switch (KeyCode)
{
case 'U': MenuUpOneOption(); break; //如果是向上按键,则菜单向上,以下类似
case 'D': MenuDownOneOption(); break;
case 'E': MenuEnterOption(); break;
case 'C': MenuCancelOption(); break;
default: break;
}
}
//----------------------------------------
//
// 菜单更新函数
// 函数原形:void MenuReflash (void);
// 没有参数,没有返回值
// 调用方式:void MenuReflash (void);
// 实际应配合自己的按键编码获取程序使用
//
//----------------------------------------
void MenuReflash (void)
{
unsigned char Keytemp; //保存按键编码变量
GetKeyCode(); //保存按键编码
//如果按键编码有效
Keytemp =KeyCodeConvert(send); //根据按键编码获取按键说明字母
KeyCodeAction (Keytemp); //根据按键说明字母散转 U D E C
}
char KeyCodeConvert(char send)
{
if(send==0x08)
return ('E');
if(send==0x07)
return('D');
if(send==0x06)
return ('C');
if(send==0x03)
return ('U');
}
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50);
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1; //data
else
std=0; //command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i<4;i++)
{
sclk=1;
sclk=0;
}
}
}
/*-----------------------------------------------*/
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
//当data1=0xff,data2=0x00时,在x0,y0处前半反白显示8xl*yl.
//当data1=0x00,data2=0xff时,在x0,y0处后半反白显示8xl*yl.
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
for(jj=0;jj<yl;jj++)
{
for(ii=0;ii<xl;ii++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y0+jj);
wr_lcd (comm,x0+ii);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
wr_lcd (comm,0x36);
}
void SentAIns(char LCD_Comand) //进入液晶普通指令模式
{
wr_lcd (0,LCD_Comand);
}
void SentAData(char LCD_Data)
{
wr_lcd (1,LCD_Data);
}
void SetALineReverse (char SelectLine) //填充所需反白
{//char line;
//lat_disp (0x00,0x00);
switch(SelectLine)
{
case 1:
con_disp (0xff,0xff,0x80,0x80,4,16);///反白
break;
case 2:
con_disp (0xff,0xff,0x90,0x90,4,16);///反白
break;
case 3:
con_disp (0xff,0xff,0x88,0x80,4,16);///反白
break;
case 4:
con_disp (0xff,0xff,0x98,0x90,4,16);///反白
break;
default:break;
}
}
void init_lcd ()
{
rst=1;
psb=0;
//wr_lcd (comm,0x30); /*30---基本指令动作*/
//wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
SentAIns(0x30); //进入液晶普通指令模式
SentAIns(0x01); //清屏
delay (100);
// wr_lcd (comm,0x06); /*光标的移动方向*/
//wr_lcd (comm,0x0c); /*开显示,关游标*/
SentAIns(0x06); //进入液晶普通指令模式
SentAIns(0x0c); //清屏
}
void start_init()
{
EA=1; //开总中断
ES=1; //允许串行中断
SCON=0x50;//串口模式1
PCON=0; //波特率不翻倍
TMOD=0x20; //定时器1工作方式2
TL1=TH1=0xFD; //波特率9600bps(11.0592M)
TR1=1; //启动定时器1
send=0;
Speaker=0;//关
}
void delay (uint us) //delay time
{
while(us--);
}
void key_delay(int delay_time)
{ unsigned int x,w;
for(x=0;x<delay_time;x++)
{ w=0;
while(w<3000)w++;
}
}
void Disp_String(uint a,uint b,uchar *dd)
{
uint line,i;
switch(a)
{
case 1:
line=0x00;
break;
case 2:
line=0x10;
break;
case 3:
line=0x08;
break;
case 4:
line=0x18;
break;
default:
break;
}
wr_lcd(0,0x80+line+b-1);
for(i=0;(i<16)&&*(dd+i);i++)//i<16
wr_lcd(1,*(dd+i));
}
void lat_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data1);
}
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2+1);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data2);
wr_lcd (dat,data2);
}
}
x=x2;
}
wr_lcd (comm,0x36);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -