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

📄 lcd.c.bak

📁 单片机乒乓球游戏机 可以再proteus仿真
💻 BAK
字号:
/*************************************
 * 控制器:KS0108 
 * MCU:AT89C52 ,晶体频率:6MHz 
 * 取模方式:纵向字节倒序 
 * CS1和CS2为低电平有效  
 * copyright:tiany
 * time:2008-9-20
**************************************/
#include <reg52.h>
#include "LCD.h"

//全局变量=====
uchar status;
uchar cbyte;

void Delay_us(uint DelayTime)        //*******us延时*****//
{
   while(DelayTime) DelayTime--;
}



/*--------------------------
*忙信号检测 
----------------------------*/ 
void LCD_Check_Busy(void)
{
  /* while(1)
	{
	  LCD_EN = 0;
 	  LCD_RS = 0;
	  LCD_RW = 1;
	  LCD_BUS = 0xFF;
	  LCD_EN = 1;
	  if(!LCD_Busy) break;   /***在proteus中仿真查忙会引起死循环,程序的BUG!***/
    // }*/
   LCD_EN = 0;
}
  
/*---------------------------------------------------------------------------- 
写入控制指令代码。 
函数入口参数:Command ------ 写入的控制指令代码 。 
              CS_Num  ------ 左右半屏的选数值 
----------------------------------------------------------------------------*/ 
void LCD_WriteCommand(uchar Command, uchar CS_Num) 
{ 
  LCD_Check_Busy();
  if(CS_Num==L)			/*选左半屏*/
   {
     LCD_CS1 = 0;
	   LCD_CS2 = 1;
	}
  else if(CS_Num==R)	/*选右半屏*/
   {
     LCD_CS1 = 1;
	   LCD_CS2 = 0;
	}
  LCD_EN = 0;           
  LCD_RS = 0;           
  LCD_RW = 0;          
  LCD_BUS = Command;   
  LCD_EN = 1;          
  Delay_us(1);         
  LCD_EN = 0;          
  LCD_CS1 = 1;         
  LCD_CS2 = 1;          
} 
/*---------------------------------------------------------------------------- 
写入定位信息 
函数入口参数:hang ------ 写入的行位置 
              lie  ------ 写入的列位置 
----------------------------------------------------------------------------*/ 
void Locatexy(uchar hang,uchar lie)
{
   uchar  x, y, right;
   switch(lie&0xc0)
    {
    case 0:   { right = L;break;} //置左半屏标志
    case 0x40:{ right = R;break;}//置右半屏标志
     }
   x=lie&0x3f|SETX; //把列数据变成列命令 40
   y=hang&0x07|SETY;//把行数据变成行命令 b8
   LCD_WriteCommand(y, right);/***送行命令***/
   LCD_WriteCommand(x, right);/***送列命令***/
   
   if(right==R)
    status = R;
   else
    status = L;//置左又半区标志
}
/*---------------------------------------------------------------------------- 
写入显示数据。 
函数入口参数: data    --------写入的显示数据 。 
               hang,lie--------写入定位位置
----------------------------------------------------------------------------*/ 
void LCD_WriteData(uchar Data,uchar hang,uchar lie) 
{ 
  Locatexy(hang,lie);//定位显示位置
  if(status==L)		 /*选择左半屏*/
   {
     LCD_CS1 = 0;
	 LCD_CS2 = 1;
	}
  else if(status==R)  /*选择右半屏*/
   {
     LCD_CS1 = 1;
	 LCD_CS2 = 0;
	}
  LCD_Check_Busy();
  LCD_EN = 0;
  LCD_RS = 1;       
  LCD_RW = 0;       
  LCD_BUS = Data;  
  LCD_EN = 1;       
  Delay_us(1);     
  LCD_EN = 0;    
  LCD_CS1= 1;    
  LCD_CS2= 1;       
} 
//=========数据读取====================
uchar LCD_ReadData(uchar  hang,uchar lie)
{   
   uchar rdata;
   Locatexy(hang,lie);//定位显示位置
   if(status==L)
   {  
    LCD_Check_Busy();
    LCD_CS1= 0;    
    LCD_CS2= 1; 
   }
   else
   {
    LCD_Check_Busy();
    LCD_CS1= 1;    
    LCD_CS2= 0; 
   }
  P0 =0xFF;   //数据送到P0口
  LCD_EN = 0;  
  LCD_RS = 1;       
  LCD_RW = 1;
  LCD_EN = 1; 
  Delay_us(1);
  rdata=P0;
  
  LCD_RS = 1;       
  LCD_RW = 1; 
  //P0 =0xFF;   //数据送到P0口 要读两次,第二次的才正确
  Delay_us(1);
  rdata=P0;
  
  LCD_EN = 0;    
  LCD_CS1= 1;    
  LCD_CS2= 1; 
  return rdata;
}
/*---------------------------------------------------------------------------
液晶模块的清屏
---------------------------------------------------------------------------*/
void LCD_CLR(uchar Side_Num)
{
   uchar i,k;
   for(i=0;i<8;i++)				  
   {	
     if(Side_Num==L)
	     for(k=0;k<64;k++)
	      {
		    LCD_WriteData(0x00,i,k);
		  }
	 else if(Side_Num==R)
	     for(k=64;k<128;k++)
	      {
		    LCD_WriteData(0x00,i,k);
		  }
    }
}
void CLR(uchar hang,uchar lie)

/*---------------------------------------------------------------------------
初始化
---------------------------------------------------------------------------*/
void LCD_Initial(void) 
{   
   LCD_WriteCommand(DISPOFF,L);	  /*显示关*/
   LCD_WriteCommand(DISPOFF,R);
   Delay_us(1);
   LCD_WriteCommand(DISPON,L);	  /*显示开*/
   LCD_WriteCommand(DISPON,R);  
   LCD_WriteCommand(DISPFIRST,L);  /*起始行*/
   LCD_WriteCommand(DISPFIRST,R);			    
   LCD_CLR(L);
   LCD_CLR(R);
} 
/*---------------------------------------------------------------------------
输出全屏图片: 128*64
---------------------------------------------------------------------------*/
void put_picture(uchar* pictureName)//128*64
{
  uchar i,j;
  uint  x;
    for(j=0;j<8;j++)
	{
     x=j*128; 
     for(i=0;i<128;i++)
      {
          cbyte=*(pictureName+x);
          LCD_WriteData(cbyte,j,i);
          x++;
      }     
    }   
}
/*---------------------------------------------------------------------------
输出半屏图片: 64*64
---------------------------------------------------------------------------*/
void put_picture_half(uchar* pictureName,uchar Side_Num)//64*64
{
  uchar i,j;
  uint  x;
    for(j=0;j<8;j++)
    {
      x=j*64; 
      if(Side_Num==L)
      {
       for(i=0;i<64;i++)
        {
          cbyte=*(pictureName+x);
          LCD_WriteData(cbyte,j,i);
          x++;
        } 
      }  
      else if(Side_Num==R)
      {
       for(i=64;i<128;i++)
        {
          cbyte=*(pictureName+x);
          LCD_WriteData(cbyte,j,i);
          x++;
        } 
      }   
    }
}
/*---------------------------------------------------------------------------
输出英文和数字:8*8
---------------------------------------------------------------------------*/
void put_char(uchar* Data, uchar hang, uchar lie,uchar reverse)//8*8
{
   uchar i;
   uint x;
   x=0;
   for(i=0;i<8;i++)
    {
      if(reverse) cbyte=~(*(Data+x));
       else cbyte=*(Data+x);
       
      LCD_WriteData(cbyte,hang,lie);
      x++;
      lie++;
    }

}
/*---------------------------------------------------------------------------
输出汉字: 16*16
---------------------------------------------------------------------------*/
void put_chinese(uchar* Data, uchar hang, uchar lie,uchar reverse)//16*16
{   
  uchar i,j,lie0;
  uint x;
  x=0;
  lie0=lie;
  for(j=0;j<2;j++)
   {
     for(i=0;i<16;i++)
      {
       if(reverse) cbyte=~(*(Data+x));
       else cbyte=*(Data+x);  
        LCD_WriteData(cbyte,hang,lie);
        x++;
        lie++;
      }   
     lie=lie0;
     hang++;   
   } 
}

//===================================================
//  屏幕向上移动
//===================================================
void MoveUp()
{ 
   uint hang;
   uchar lie;
   //uchar hang2;
       for(hang=0;hang<8;hang++)
       {
            for(lie=0;lie<128;lie++)
            { 
               uchar buf; 
               //uchar lie2=lie+1;
               buf =LCD_ReadData(hang,lie);
               //if(hang==0)
                //continue ;
               //else
               // hang2=hang-1; 
               LCD_WriteData(buf,hang,lie);       
            }
           Delay_us(1000);  
       }
} 

⌨️ 快捷键说明

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