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

📄 yejin.c

📁 LCD模块 能够在按下一个键后 在液晶上显示相应的数据
💻 C
字号:
#include<reg51.h>
#include<math.h>
sbit  RS=P2^6;
sbit  RW=P2^5;
sbit  E=P2^4;
sbit  CS1=P2^3;
sbit  CS2=P2^2;
 unsigned char code jin[8][32]=
   {

        {
        0x40,0x40,0x20,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x50,0x20,0x60,0x20,0x00,
        0x40,0x40,0x42,0x42,0x4A,0x72,0x42,0x7F,0x42,0x62,0x5A,0x42,0x42,0x40,0x40,0x00 ,
        },
         {
        0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x60,0x90,0x08,0x00,0x00,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x21,0x40,0x78,0x00 ,
         } ,
          {
          0x80,0x82,0x8C,0x20,0x10,0xFC,0x93,0x92,0xF2,0x9A,0x96,0x92,0xF0,0x00,0x00,0x00,
          0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x4F,0x52,0x54,0x50,0x5C,0x40,0x00 ,
          },
          {
           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

         } ,
          {
         0x00,0x04,0x04,0xC4,0xB4,0x8C,0x87,0x84,0xF4,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
         0x00,0x00,0x20,0x18,0x0E,0x04,0x20,0x40,0xFF,0x00,0x02,0x04,0x18,0x30,0x00,0x00 ,
         } ,
          {
        0x04,0x04,0xE4,0x24,0x24,0x64,0xB4,0x2F,0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,
      0x00,0x00,0x7F,0x04,0x05,0x05,0x05,0x7F,0x05,0x05,0x05,0x25,0x44,0x3F,0x00,0x00 ,

         } ,

          {
        0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
      0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00   ,
         } ,
          {
        0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
        0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00 ,

         }
  }
         ;

 unsigned char code Num[11][16]=
   {

        {
       0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

        },
         {
        0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
         } ,
          {
         0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

          },
          {
         0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

         } ,
          {
        0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
         } ,
          {
        0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

         } ,

          {
       0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

         } ,
          {
        0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

         } ,
           {
        0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

         },
           {
        0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,


         } ,
          {
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,

         }
  }
         ;
 static const char tab[16]={0x01,0x02,0x03,0x0c,	/*键盘码00,01,02,03,*/
                            0x04,0x05,0x06,0x0d,	/*键盘码04,05,06,07,*/
                            0x07,0x08,0x09,0x0e,	/*键盘码08,09,0a,0b,*/
                            0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/

 unsigned char scan(void);
void Delayus(unsigned int t) ; /*延时函数*/
void BUSYLOOP(unsigned char cs); //*判忙函数*//
void Write_command(unsigned char CMD,unsigned char bb,unsigned char cs); //*发控制字函数*//
void Write_data(unsigned char CMD,unsigned char bb,unsigned char cs,unsigned char page); //*发数据函数*//
void CHUSHIHUA(); //*初始化函数*//
void CLEAR(); //*清屏*//
void Display( unsigned char *ptr,unsigned char bb,unsigned char cs,unsigned char page,unsigned char adress_y); //**显字符串函数**//
void Display_Num( unsigned char *ptr,unsigned char bb,unsigned char cs,unsigned char page,unsigned char adress_y); //**显字符串函数**//
void delay1ms();
void delay(unsigned i);
void main()
{
   int j,i;
   unsigned char temp,key_temp;
   j=0;
   temp=jin[0][0];
   CHUSHIHUA();
   CLEAR();
   for(i=0;i<8;i++)
    {
     for(j=0;j<64;j++)
      {
       Write_data(0x00,0,1,i)  ;
      }
    }

     Write_command(0xc0,1,0);

     Write_command(0x40,1,0); //  write  y adress
   //  Display( jin[0],1,0,0,0);
   while(1)
     {


      for(i=0;i<8;i++)
       {
         key_temp=scan();
         key_temp=tab[key_temp];
       Display_Num( Num[key_temp],1,0,0,i<<3);
       }
     for(i=0;i<8;i++)
     {
        key_temp=scan();
         key_temp=tab[key_temp];
       Display_Num( Num[key_temp],1,1,0,i<<3);
     }

 //    Display( jin,1,0,2,40);
       Write_command(0x3f&temp|0xc0,1,2);
       temp-=16;
     delay(500);
     }
     while(1)
     {
      for(i=0;i<4;i++)
       {
       Display( jin[i],1,0,0,i<<4);
       }
     for(i=0;i<4;i++)
       Display( jin[i+4],1,1,0,i<<4);

 //    Display( jin,1,0,2,40);
       Write_command(0x3f&temp|0xc0,1,2);
       temp-=16;
     delay(500);
     }
    while(1)
     {
      ;
      }

}
/*********************************************延时**************************************/
void Delayus(unsigned int t)
{
  int i,j;
  for (i=0;i<t;i++)
  {
   for (j=0;j<t;j++)
   j=j;
   }
}

//*********************判忙函数************************//
void BUSYLOOP(unsigned char cs)
{
  unsigned char  BUSY;
  if(cs==1)
   {
   CS1=0;
   CS2=1;
   }
   else if(cs==0)
   {
   CS1=1;
   CS2=0;
   }
   else
   {
   CS1=1;
   CS2=1;
   }
   P0=0x0ff;
   RS=0;
   RW=1;
   do {
   E=0;
   BUSY=P0;
   E=1;
   }
while(BUSY>0x7F);
}

//*********************写控制字函数****************************//
void Write_command(unsigned char CMD,unsigned char bb,unsigned char cs)
{
 if(bb)
 {
 BUSYLOOP(cs);
 }

   if(cs==1)
   {
   CS1=0;
   CS2=1;
   }
   else if(cs==0)
   {
   CS1=1;
   CS2=0;
   }
   else
   {
   CS1=1;
   CS2=1;
   }
  RS=0;

  RW=0;
  E=0;
  P0=CMD;
  E=1;
  //nop();
  Delayus(1);
  E=0;
}

//*********************写数据函数****************************//
void Write_data(unsigned char CMD,unsigned char bb,unsigned char cs,unsigned char page)
{
 if(bb)
 {
 BUSYLOOP(cs);
 }

 // Write_command(adress_y&0x3f|0x40,0,cs);
  Write_command(page&0x07|0xb8,0,cs);
   if(cs==1)
   {
   CS1=0;
   CS2=1;
   }
   else if(cs==0)
   {
   CS1=1;
   CS2=0;
   }
   else
   {
   CS1=1;
   CS2=1;
   }
  RS=1;
  RW=0;
   E=0;
  P0=CMD;
  E=1;

  Delayus(1);
  E=0;
}

//*************************液晶初始化********************************//
void CHUSHIHUA()
{
   Write_command(0x3e,0,0);
   Write_command(0x3e,0,0);
   Write_command(0x3f,0,0);
   Write_command(0x3f,0,0);
   Write_command(0xb8,0,0); //  write  page num
   Write_command(0x40,0,0); //  write  y adress
   Write_command(0xc0,0,0); //  write  start adress
   Write_command(0x3e,0,1);
   Write_command(0x3e,0,1);
   Write_command(0x3f,0,1);
   Write_command(0x3f,0,1);
   Write_command(0xb8,0,1); //  write  page num
   Write_command(0x40,0,1); //  write  y adress
   Write_command(0xc0,0,1); //  write  start adress
}
/***************************清 屏*************************************/
void CLEAR()
{
 int i,j ;
   for(i=0;i<8;i++)
   {
    for(j=0;j<64;j++)
    {
    Write_data(0x00,0,0,i)  ;
    }
   }
  for(i=0;i<8;i++)
   {
    for(j=0;j<64;j++)
    {
    Write_data(0x00,0,1,i)  ;
    }
   }
}
void Display( unsigned char *ptr,unsigned char bb,unsigned char cs,unsigned char page,unsigned char adress_y)
{
  unsigned char temp,i;
  if(bb)
  {
 BUSYLOOP(cs);
  }
 // Write_command(page&0x07|0xb8,bb,cs);
  Write_command(adress_y&0x3f|0x40,bb,cs);


  for(i=0;i<16;i++)
  {
    temp=*(ptr+i);
    Write_data(temp,bb,cs,page) ;
  }
 // Write_command((page+1)&0x07|0xb8,bb,cs);
  Write_command(adress_y&0x3f|0x40,bb,cs);
   for(i=16;i<32;i++)
  {
    temp=*(ptr+i);
   Write_data(temp,bb,cs,page+1) ;
  }
}
void Display_Num( unsigned char *ptr,unsigned char bb,unsigned char cs,unsigned char page,unsigned char adress_y) //**显字符串函数**//
 {
  unsigned char temp,i;
  if(bb)
  {
 BUSYLOOP(cs);
  }
 // Write_command(page&0x07|0xb8,bb,cs);
  Write_command(adress_y&0x3f|0x40,bb,cs);


  for(i=0;i<8;i++)
  {
    temp=*(ptr+i);
    Write_data(temp,bb,cs,page) ;
  }
 // Write_command((page+1)&0x07|0xb8,bb,cs);
  Write_command(adress_y&0x3f|0x40,bb,cs);
   for(i=8;i<16;i++)
  {
    temp=*(ptr+i);
   Write_data(temp,bb,cs,page+1) ;
  }
}
void delay1ms()
{
 IE=00;
 TMOD=0x10;
 TH1=0xfc;
 TL1=0x23;
 TR1=1;

 while(!TF1);
 TF1=0;
}
void delay(unsigned i)
{
 int k;
 for(k=0;k<i;k++)
 delay1ms();
}
 unsigned char scan(void)				/*扫描键盘副程式*/
 {
        unsigned	char data a1,i;			/*A1=0XF7列扫描初值,I行*/
      unsigned	char data m;
      unsigned	char  FLAG0;			/*设按键回应旗号为0,键盘扫描计数指标为0*/
      unsigned    char data ptr;
       a1=0xf0 ;
       FLAG0=0;
       ptr=0;
        m=0xf0 ;
       while(m==0xf0)
       {
          P1=0xff;
          a1=0xf0;
          P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
          m=P1;
       }
       for(i=0;i<4;i++)
       {
          delay1ms();
        }
        a1=0xf0;
        m=0xf0 ;
       while(m==0xf0)
       {
           P1=0xff;
          a1=0xf0;
          P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
           m=P1;
       }
          a1=0xfe;
        for(i=0;i<4;i++)		/*键盘4个扫描列*/
      {
               P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
               m=P1;
                switch(m&0xf0)		/*取行的高4位元,侦测那一行被按*/
            {
            	case 0x70: ptr=i+12;	/*第一行被按否?是则扫描指标=列X4*/
                          FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xb0: ptr=i+8;	/*第二行被按否?是则扫描指标=列X4+1*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xd0: ptr=i+4;	/*第三行被按否?是则扫描指标=列X4+2*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xe0: ptr=i;	/*第四行被按否?是则扫描指标=列X4+3*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                 default:  break;	/*跳出此循环*/
            }
         if(FLAG0==1)break;		/*不为1,则扫描列右移,扫描下一列*/
         a1=a1<<1|0x01;
         		/*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
       }
       a1=0xf0;
    while(m!=0xf0)
       {
         P1 =0xff;
         a1=0xf0;
         P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
          m=P1;
       }

       if(FLAG0==1)
         return ptr;
       else return 0x40;
 }					/*返回主程式*/

⌨️ 快捷键说明

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