⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串口+8个键盘程序.c

📁 用stc89c51,单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
 } 
 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 + -