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

📄 yejing_view_1.c

📁 使用C8051单片机控制液晶和键盘
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#include <dis.h>

unsigned char xdata uwica_r _at_  0x8000;      //写指令代码地址(左)1000,0000,0000,0000
unsigned char xdata urswa_r _at_  0x8001;      //读状态字地址(左)  1000,0000,0000,0001
unsigned char xdata uwdsda_r _at_  0x8002;     //写显示数据地址(左)1000,0000,0000,0010
unsigned char xdata urdsda_r _at_  0x8003;     //读显示数据地址(左)1000,0000,0000,0011

unsigned char xdata uwica_l _at_  0xb000;      //写指令代码地址(右) 1011,0000,0000,0000
unsigned char xdata urswa_l _at_  0xb001;      //读状态字地址(右)   1011,0000,0000,0001
unsigned char xdata uwdsda_l _at_  0xb002;     //写显示数据地址(右) 1011,0000,0000,0010
unsigned char xdata urdsda_l _at_  0xb003;     //读显示数据地址(右) 1011,0000,0000,0011

/////////



void yj_wil(unsigned char dis_com);
void yj_wdl(unsigned char dis_dat);
void yj_wir(unsigned char dis_com);
void yj_wdr(unsigned char dis_dat);
void yj_opdis();
void yj_clear();
void yj_disp(unsigned char dis_code,unsigned char dis_rpag,       /////////////////////////液晶显示
             unsigned char dis_rcol,unsigned char dis_flag);
void scr_main();
void scr1();
void scr1_1();
void scr2_1();
void scr3_1();

void ext_time();
void timerint0(void);
data unsigned char ufg;
data unsigned char keydata=0;
data unsigned char menuct=0;
unsigned char recv_ok_flag;
unsigned char trans_ok_flag;
unsigned char  clear_flag;
int   com_count;

code unsigned char HZBUF[]={
      0xF0,0xF8,0x0C,0xC4,0x0C,0xF8,0xF0,0x00,//0
      0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,
      0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,//1
      0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
      0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,//2
      0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
      0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,//3
      0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
      0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,//4
      0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
      0x7C,0x7C,0x44,0x44,0x44,0xC4,0x84,0x00,//5
      0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
      0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,//6
      0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
      0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,//7
      0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
      0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,//8
      0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
      0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,//9
      0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
      };

void menu_main()
{  scr_main();  }
void dsp_1()
{  menuct=0;
   scr1();
}
void dsp_2()
{  menuct=1;
   scr1();
}
void dsp_3()
{  menuct=2;
   scr1();
}
void dsp_1_1()
{  scr1_1();
}
void dsp_2_1()
{  scr2_1();
}
void dsp_3_1()
{  scr3_1();
}


unsigned char tab_i;
typedef struct
{
   unsigned char keyindex;
   unsigned char keydownstate;
   unsigned char keyupstate;
   unsigned char keyokstate;
   unsigned char keyescstate;
   void  (*currentoperate)();
}  keytabstruct;
void (*keyfun_ptr)();


#define size_of_menu 7
keytabstruct code keytab[size_of_menu]=
{
  {0,0,0,1,0,(*menu_main)},
  {1,2,3,4,0,(*dsp_1)},
  {2,3,1,5,0,(*dsp_2)},
  {3,1,2,6,0,(*dsp_3)},
  {4,4,4,1,1,(*dsp_1_1)},
  {5,5,5,2,2,(*dsp_2_1)},
  {6,6,6,3,3,(*dsp_3_1)},
};
////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{    ext_time();
     yj_opdis();
     yj_clear();
     scr_main();
     tab_i=1;
     while(keydata!=OK_KEY);
     keydata=0;
     yj_clear();
     scr1();
loop:while(keydata==0);                 //等待按键
     switch(keydata)                    //判断按键
       {
          case  DOWN_KEY:                               //按下NOWN_KEY的相应动作
                tab_i=keytab[tab_i].keydownstate;
                keyfun_ptr=keytab[tab_i].currentoperate;
                yj_clear();
                (*keyfun_ptr)();
                break;
          case  UP_KEY:
                tab_i=keytab[tab_i].keyupstate;
                keyfun_ptr=keytab[tab_i].currentoperate;
                yj_clear;
                (*keyfun_ptr)();
                break;
          case  OK_KEY:
                tab_i=keytab[tab_i].keyokstate;
                keyfun_ptr=keytab[tab_i].currentoperate;
                yj_clear();
                (*keyfun_ptr)();
                break;
          case  ESC_KEY:
                tab_i=keytab[tab_i].keyescstate;
                keyfun_ptr=keytab[tab_i].currentoperate;
                yj_clear();
                (*keyfun_ptr)();
          default:
                keydata=0;
                break;
       }
     keydata=0;
     goto loop;

}
//////////////////////////////////////////////////////////////////////////////////////////////////
void scr_main()
{
     yj_disp(0,2,20,0x00);
     yj_disp(1,2,28,0x00);
     yj_disp(2,2,36,0x00);
     yj_disp(3,2,44,0x00);
}
/////////////////
void scr1()
{
   unsigned char sflag;

   if(menuct==0)
   {
      sflag=0xaa;
   }
   else
   {
      sflag=0x00;
   }
   yj_disp(1,0,20,sflag);
   yj_disp(1,0,28,sflag);
   yj_disp(1,0,36,sflag);
   yj_disp(1,0,44,sflag);

   if(menuct==1)
   {
      sflag=0xaa;
   }
   else
   {
      sflag=0x00;
   }
   yj_disp(2,2,20,sflag);
   yj_disp(2,2,28,sflag);
   yj_disp(2,2,36,sflag);
   yj_disp(2,2,44,sflag);

   if(menuct==2)
   {
      sflag=0xaa;
   }
   else
   {
      sflag=0x00;
   }
   yj_disp(3,4,20,sflag);
   yj_disp(3,4,28,sflag);
   yj_disp(3,4,36,sflag);
   yj_disp(3,4,44,sflag);
}
///////////////
void scr1_1()
{
   yj_disp(1,2,48,0x00);
   yj_disp(1,2,56,0x00);
   yj_disp(5,2,64,0x00);
   yj_disp(5,2,72,0x00);
}
///////////
void scr2_1()
{
   yj_disp(2,2,48,0x00);
   yj_disp(2,2,56,0x00);
   yj_disp(5,2,64,0x00);
   yj_disp(5,2,72,0x00);
}
/////////
void scr3_1()
{
   yj_disp(3,2,48,0x00);
   yj_disp(3,2,56,0x00);
   yj_disp(5,2,64,0x00);
   yj_disp(5,2,72,0x00);
}
///////////////////////////////////////////////////////////////////////////////////////////
void yj_disp(unsigned char dis_code,unsigned char dis_rpag,     //dis_code--在数组HZBUF[]中的行数,
              unsigned char dis_rcol,unsigned char dis_flag)    //dis_rpag--显示RAM共64行,分8页,每页分8行,此处表示在哪一页
                                                                //dis_rcol--在液晶平面上显示的列数,
{                                                               //dis_flag--是要将字作为黑色输出(0x00),还是字的周围作为黑色输出(0xaa)
      int i=0;
      int j;
      int ch;
      unsigned char k=0;
      unsigned char flag=0x00;

      i=dis_code * 16;                      //确定在HZBUF[]中的坐标。在HZBUF[]中,每两行(16个数)算一行
      dis_rpag = dis_rpag & 0x07;          // 先将前5位置成00000,后三位不变
      dis_rpag = dis_rpag | 0xb8;          // 再将前5位置成10111,后三位不变,后三位表示此处显示在RAM中的哪一页
      k=dis_rcol;                          // 将行数赋给K。由K来保持行数,因为下面要对dis_col进行运算

      for(ch=1;ch<3;ch++)
      {
         dis_rcol=k;
         if(k>=64)               //行数大于64就要在液晶右半平面显示:
         {
            dis_rcol=dis_rcol-64;
            yj_wir(dis_rpag);      //在往上数第8行,已经将液晶置于"页设置状态",这里就将第几页送给液晶(液晶内RAM共8页)
            yj_wir(dis_rcol | 0x40);  //此处进行列设置,将要在哪一列显示的数给液晶进行显示
            flag=0xaa;               //标志位---区分是在液晶右半面上显示还是在左半面显示
         }
         else                 //行数小于64行的时候,在左边显示
         {
            yj_wil(dis_rpag);
            yj_wil(dis_rcol | 0x40);
            flag=0x00;               //标志位---区分是在液晶右半面上显示还是在左半面显示
         }

         for(j=0;j<8;j++)       // 循环八次,把HZBUF[]中所选那一行的八个数据都输出

⌨️ 快捷键说明

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