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

📄 yejing_view_1.c

📁 使用C8051单片机控制液晶和键盘
💻 C
📖 第 1 页 / 共 2 页
字号:
         {
             if(flag == 0xaa)    //液晶右半面上显示
             {
                 if(dis_flag == 0xaa)
                 {
                      yj_wdr(~HZBUF[i+j]);    //在输出的那一行中,每一个数逐个输出
                 }                           //此处取反,是将的周围作为黑点输出,而字本身变成了无色??
                 else
                 {
                      yj_wdr(HZBUF[i+j]);    //在输出的那一行中,每一个数逐个输出
                 }
             }
             else             //液晶左半面显示
             {
                 if(dis_flag == 0xaa)
                 {
                      yj_wdl(~HZBUF[i+j]);   //在输出的那一行中,每一个数逐个输出
                 }                            //此处取反,是将的周围作为黑点输出,而字本身变成了无色?
                 else
                 {
                      yj_wdl(HZBUF[i+j]);   //在输出的那一行中,每一个数逐个输出
                 }
             }
             dis_rcol++;         //输出下一列
             if(dis_rcol>=64)
             {
                 dis_rcol=dis_rcol-64;
                 yj_wir(dis_rpag);
                 yj_wir(dis_rcol|0x40);
                 flag=0xaa;
                 dis_rcol=0;
             }
         }
         i=i+8;    // 下一行
         dis_rpag++;   //翻页
      }
      return;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////液晶清屏///////////////////////////////////////////////////////////////////
void yj_clear()
{
    unsigned char i;
    unsigned char j;
    unsigned rol=0x40;
    unsigned pag=0xb8;

    for(i=0;i<8;i++)            // (左边)
    {
       yj_wil(pag);     //页设置指令
       yj_wil(rol);    //列地址设置指令

       for(j=0;j<64;j++)
       {
           yj_wdl(0x00);   //向液晶中写数据
       }
       pag++;            //翻页,把RAM中8页全部清理
    }

    rol=0x40;
    pag=0xb8;

    for(i=0;i<8;i++)    //右边
    {
       yj_wir(pag);
       yj_wir(rol);

       for(j=0;j<64;j++)
       {
           yj_wdr(0x00);
       }
       pag++;
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////启动显示////////////////////////////////////////////////////
void yj_opdis()            //启动显示(左边和右边)
{
    yj_wil(0x3f);
    yj_wir(0x3f);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////液晶显示模块指令系统/////////////////////////////////////////////
void yj_wil(unsigned char dis_com)         //液晶写指令(左边)
{
     unsigned char i=0;

     do{
          i = urswa_l;                //本来urswa_r = 0x8001;
          i = i & 0x80;               //将除低八位的低7位置0
     }while(i!=0);                    //当I!=0时,do。但此处i = 0;如果I不等于0。说明液晶内部在工作,则等待
     uwica_l = dis_com;               // 此处开始往液晶里写命令
     return;
}


void yj_wdl(unsigned char dis_dat)         //液晶写数据(左边)
{
     unsigned char i=0;

     do{
          i = urswa_l;
          i = i & 0x80;
     }while(i!=0);
     uwdsda_l = dis_dat;
     return;
}

void yj_wir(unsigned char dis_com)       //液晶写指令(右边)
{
     unsigned char i=0;

     do{
          i = urswa_r;    //urswa_r = 0x8001;
          i = i & 0x80;   //将除低八位的第一位的其他位置0
     }while(i!=0);        // 当I!=0时,do。但此处i = 0;如果I不等于0。说明液晶内部在工作
     uwica_r = dis_com;   //此处开始往液晶里写命令
     return;
}

void yj_wdr(unsigned char dis_dat)        //液晶写数据(右边)
{
     unsigned char i=0;

     do{
          i = urswa_r;
          i = i & 0x80;
     }while(i!=0);
     uwdsda_r = dis_dat;
     return;
}
/////////////////////////////////////////////中断初始化程序/////////////////////////////////////////
void ext_time()
{
    P1=0xff;            //指令符-----p1的8个管脚:P1.0~~P1.7
    ufg = 0x00;
    menuct = 0;
    keydata = 0;
    com_count = 0;
    clear_flag = COMF_OFF;               // #define COMF_OFF      0x00(在头文件中)
    recv_ok_flag = REV_FALSE;             // #define REV_FALSE     0x00
    trans_ok_flag = TRANS_FALSE;         // #define TRANS_FALSE   0x00


    EA   = 0;              //禁止所以中断,EA=1---开放中断,各个中断由它的中断屏蔽所决定
    TMOD = 0x21;            /* TMOD--定时器方式寄存器---定时器1是自动从装载的8位计数器,定时器0的方式是16位 计数器*/

    TH0  = 0xd8;           //定时器0的高8位字节,
    TL0  = 0xf0;            //定时器0的低八位
    TH1 = 0xfd;             //  定时器1     波特率9600BPS @ 11.0592MHz??
    TL1 = 0xfd;
    PCON = PCON & 0x7f;     // SMOD0 位清零,使能UART0 的波特率/2 功能。PCON--电源控制寄存器
    SCON = 0x50;            // 串行口工作方式设置,8 位UART,可变波特率--并允许接收
    IP   = 0x10;            //;置RS232为高优先级中断,T0为低优先级中断
    IE   = 0x82;            //允许定时器0中断
    TR0  = 1;               //定时器0允许
    TR1 = 1;                //定时器1允许
}

/////////////////////////////////////////定时器中断,键盘扫描程序//////////////////////////////////
void timerint0(void) interrupt 1 using 2
{
  static unsigned char keydatabk = 0;
  static unsigned char count = 0;
  static unsigned char uflag1 =0x00;
  unsigned char bak;

  if(ufg == 0x00)                //前面的初定义 : data unsigned char ufg;  ufg = 0x00;----此处意思是先扫描key1,key3,key5
  {
    P10 = 0;                     //头文件中sbit  P10 = 0x90;------将P10管脚设置低电平,低电平就是接地,可以把高电平拉低
    bak = P1;                   // 将P1管脚的寄存器的值给bak----读取P1的状态
    bak = P1 & 0x38;            //取P3,4,6的值
    if(bak != 0x38)             //如果P1.3,P1.4,P1.5不都是1的话,(说明key1,3,5中有键被按下)
    {
      if((keydatabk ^ bak)!=0)   //如果bak与0x00不同的话,
      {
          keydatabk = bak ;      //把从端口扫描的值给keydatabk;
          uflag1 = 0xbb;
          count = 0;
      }
      else
      {
          if(uflag1 == 0xbb)          //下一次扫描的时候,如果扫描到相同的值,说明按键还没有被放开
          {
              count++;
          }
      }
    }
    else          //如果P1.2,P1.3,P1.4都是1的话,(说明key1,3,5三个键没有按下)
    {
      uflag1 = 0x00;
      keydatabk = 0;
      count = 0;
    }
    if(keydatabk == 0x00)
    {
       ufg = 0xaa;   //如果没有健按下,就将ufg赋值成0xaa,然后进行下次扫描,即key2,4,6扫描,如果有键按下,P11扫描就不进行
    }
    P10 = 1;           //将P1.0设置成高电平
  }
  else if(ufg == 0xaa)       //扫描KEY2,4,6
    {
     P11 = 0;                      //将P11管脚设置成低电平
     bak = P1;
     bak = P1 & 0x38;               //取P13,14,15值
     if(bak != 0x38)                 //如果按键被按下
     {
       if((keydatabk ^ bak)!=0)
       {
          keydatabk = bak;           //把从端口扫描的值给keydatabk;
          uflag1 = 0xaa;
          count = 0;
       }
       else
       {
          if(uflag1 == 0xaa)          //下一次扫描的时候,如果扫描到相同的值,说明按键还没有被放开
          {
              count++;
          }
       }
     }
     else
     {
       uflag1 = 0x00;     //如果P1.2,P1.3,P1.4都是1的话,(说明key2,4,6三个键没有按下)
       keydatabk = 0;
       count = 0;
     }
     if(keydatabk == 0x00)      //如果没有健按下,就将ufg赋值成0x00,然后进行下次扫描,即key1,3,5扫描,如果有键按下,P11扫描就不进行
     {
       ufg = 0x00;
     }
     P11 = 1;             //将P1.0设置成高电平
  }

  if(count == 2)              //确定是某一键按下
  {
     if(uflag1 == 0xaa)        //如果是对KEY2,4,6扫描
     {
        keydata = keydatabk;     //将按键值保存,以便接下来对其进行判断
     }
     else if(uflag1 == 0xbb)     //如果是对KEY1,3,5扫描
     {
        keydata = keydatabk | 0x40;    //变换后保存
     }
     uflag1 = 0x00;
     count = 0;
  }
  if(clear_flag == COMF_SET)         //循环
  {
     com_count++;
     if(com_count == COMF_CT)        //
     {
         com_count = 0;
         clear_flag = COMF_CLEAR;
     }
  }

}


///////////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -