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

📄 main.c

📁 驱动15X20D液晶屏
💻 C
字号:
/************************** ************************************************
Copyright (c) HUST ESRI 1999-2007. All Rights Reserved.
文件名:	main.c

摘要:LCD测试程序(RTX51 FULL)
作者:	turtle
完成日期:	2008.03.28

源版本:	
**************************************************************************/

#include "inc\ConstDef.h"	//硬件相关常数定义
#include "inc\main.h"	//硬件相关常数定义
uchar temp;
void main (void)
{
	
//=========系统初始化
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;	//关闭看门狗

	SysClkInit();		//初始化系统时钟
	PortInit();			//初始化GPIO和交叉开关
	DelayL(10);
//=========外设与变量初始化

   	P7 = 0x00;			//打开指示灯
	
	LCD_Reset();
	lcd_initial();
	lcd_clear();
	lcd_regwrite(0x00,0xcD);//打开屏
	temp=lcd_regread(0x00);
	SetXY(4,24);
	lcd_datawrite(0xD1);
	lcd_datawrite(0xEE);
	DelayS(1);
	SetXY(4,56);
	lcd_datawrite(0xE8);
	lcd_datawrite(0xAF);
	DelayS(1);
	SetXY(4,88);
	lcd_datawrite(0xE8);
	lcd_datawrite(0xAF);



/*	lcd_regwrite(0x00,0xc5);
	DelayS(1);
	lcd_photo(tab2);
*/	 
	while(1)
	{
	      if(INT2==0)
           {

	   	       	 DelayS(200);

			    if(INT2==0)
				
				{
				temp=0;
               
		        while(INT2==0)
		        {
		         temp=1;
		        }
		  
		   // MouseUp();//按键释放时候的操作
		  
		       
			   }
             }

	}
}


// ===============================================================
//                      子函数
// ===============================================================
/*-------------------------------------------------------------------
* 功能: 长时间延时
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 长时间延时,工作在11.0592M时,此函数近似延时28ms
-------------------------------------------------------------------*/
void DelayL(uchar Time)
{
	uchar i,j,k;
	while(Time--)
	{
		for(k=0; k<CLK_BASE; k++)
			for(j=0; j<100; j++)
				for(i=0; i<100; i++)
					_nop_();
	}
}
 
/*-------------------------------------------------------------------
* 功能: 短时间延时
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 工作在11.0592M时,此函数近似延时0.11ms
-------------------------------------------------------------------*/
void DelayS(uchar Time)
{
	uchar i;
	while(Time--)
	{
		for(i=0; i<250; i++)
			{_nop_(); _nop_(); _nop_(); _nop_(); _nop_();}
	}
}

/*-------------------------------------------------------------------
* 功能: 系统时钟初始化
* 调用: NULL
* 输入: NULL
* 返回:	NULL
* 说明: 切换至11.0592M外部晶振
-------------------------------------------------------------------*/
void SysClkInit (void)
{
	int i;
	OSCXCN = 0x67;				// 使用22MHz的外部晶振
	for(i=0; i<3000; i++);		// 延时,等待外部晶振起振
	while(!(OSCXCN&0x80));		// 等待外部晶振起振完成
	OSCICN = 0x08;				// 启用外部晶振,启用时钟丢失检测器
}

/*-------------------------------------------------------------------
* 功能: C8051端口初始化
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 配置各端口输入输出状态。如非必要,关闭不相关端口的弱上拉
-------------------------------------------------------------------*/
void PortInit (void)
{
	XBR0 = 0x07;		//允许SMBus、UART0、SPI0
	XBR2 = 0x46;		//允许交叉开关和弱上拉,允许UART1

    P0MDOUT = 0x1D; // Output configuration for P0 
    P1MDOUT = 0xF9; // Output configuration for P1 
    P2MDOUT = 0x0D; // Output configuration for P2 
    P3MDOUT = 0xFF; // Output configuration for P3 
    P74OUT = 0xF3;  // Output configuration for P4-7

    P1MDIN = 0xFF;  // Input configuration for P1
}
/*-------------------------------------------------------------------
* 功能: 液晶屏的相关程序
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 对LCD的寄存器和DDRAM
-------------------------------------------------------------------*/
void lcd_regwr(uchar regnada) 
{
  LCD_DB = regnada;
  LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
  LCD_COMMAND |=LCD_CS2_ENABLE;
  LCD_COMMAND |=LCD_RD_DISABLE;
  LCD_COMMAND &=LCD_RS_REG; 
  LCD_COMMAND &=LCD_WR_ENABLE;
  ;
  LCD_COMMAND |=LCD_WR_DISABLE;
  LCD_COMMAND |=LCD_RS_DDRAM;
  LCD_COMMAND |=LCD_CS1_DISABLE;
  
}
//.............................................
void lcd_datawrite(uchar wrdata) 
{                       //写资料到DDRAM
  //while(LCD_BUSY == 1);
  LCD_DB = wrdata;
  LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
  LCD_COMMAND |=LCD_CS2_ENABLE;
  LCD_COMMAND |=LCD_RD_DISABLE;
  LCD_COMMAND |=LCD_RS_DDRAM; 
  LCD_COMMAND &=LCD_WR_ENABLE;
  ;
  LCD_COMMAND |=LCD_WR_DISABLE;
  LCD_COMMAND |=LCD_RS_REG;
  LCD_COMMAND |=LCD_CS1_DISABLE;
}

uchar lcd_regread(uchar regname) 
{                           //读缓存器
  uchar reg_rddata;
  lcd_regwr(regname);
  LCD_DB= 0xff;
  P74OUT = 0x03;  // Output configuration for P4-7
  DelayS(10);
  LCD_COMMAND &=LCD_RS_REG;	
  LCD_COMMAND |=LCD_CS2_ENABLE;
  LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
 
  LCD_COMMAND |=LCD_WR_DISABLE;
  LCD_COMMAND &=LCD_RS_REG; 
  LCD_COMMAND &=LCD_RD_ENABLE;
  ;
  reg_rddata=LCD_DB;
  LCD_COMMAND |=LCD_RD_DISABLE;
  LCD_COMMAND |=LCD_RS_DDRAM;
  LCD_COMMAND |=LCD_CS1_DISABLE;
  ;
  P74OUT = 0xF3;
  DelayS(10);
  return(reg_rddata);
  
}
//=============================================
void LCD_Reset(void) 
{               
  DelayL(10); // delay 120ms 等待上电复位
  LCD_COMMAND &=LCD_RST_ENABLE; // RST置低电平
  DelayL(10);
  LCD_COMMAND |=LCD_RST_DISABLE; // RST置高电平
  DelayL(10);

}

void lcd_regwrite(uchar regname,uchar regdata) 
{                                   //写资料到缓存器
  lcd_regwr(regname);
  DelayS(1);
  lcd_regwr(regdata);
}
//.............................................
void lcd_initial(void) 
{                   //初始化
  lcd_regwrite(0x00,0xc9); // lcd control register(lcr)
  lcd_regwrite(0x01,0xe2); // misc.register(mir)
  lcd_regwrite(0x02,0x10); // advance power setup register(apsr)
  lcd_regwrite(0x03,0x80); // advance display setup regiser(adsr)
  lcd_regwrite(0x10,0x69); // cursor control register(ccr)
  lcd_regwrite(0x11,0x00); // distance of word or lines register(dwlr)
  lcd_regwrite(0x12,0x91); // memory access mode register(awrr)
  lcd_regwrite(0x21,0x27); // display window right register(dwrr)
  lcd_regwrite(0x31,0xef); // display window bottom register(dwbr)
  lcd_regwrite(0x41,0x00); // display window left register(dwlr)
  lcd_regwrite(0x51,0x00); // display window top register(dwtr)
  lcd_regwrite(0x20,0x27); // active window right register(awrr)
  lcd_regwrite(0x30,0xef); // active window bottom register(awbr)
  lcd_regwrite(0x40,0x00); // active window left register(awlr)
  lcd_regwrite(0x50,0x00); // active window top register(awtr)
  lcd_regwrite(0x60,0x00); // cursor position x register(cpxr)
  lcd_regwrite(0x61,0x00); // begin segment position register(bgsg)
  lcd_regwrite(0x70,0x00); // cursor position y register(cpyr)
  lcd_regwrite(0x71,0x00); // shift action range,begin commom register(bgcm)
  lcd_regwrite(0x72,0xef); // shift action range,end commom register(edcm)
  lcd_regwrite(0x80,0xaa); // blink time register(btr)
  lcd_regwrite(0x81,0x00); // frame rate polarity change at common_fa register(fdca)
  lcd_regwrite(0x91,0x00); // frame rate polarity change at common_fb register(fdcb)
  lcd_regwrite(0x90,0x06); // shift clock control register(sccr)
  lcd_regwrite(0xa0,0x11); // interrupt setup & status register(frcb)
  lcd_regwrite(0xa1,0x00); // key scan control register(kscr)
  lcd_regwrite(0xa2,0x00); // key scan data register(ksdr)
  lcd_regwrite(0xa3,0x00); // key scan data expand register(kser)
  lcd_regwrite(0xb0,0x27); // interrupt column setup register(intx)
  lcd_regwrite(0xb1,0xef); // interrupt row setup register(inty)
  lcd_regwrite(0xc0,0x00); // touch panel control register(tpcr)
  lcd_regwrite(0xc1,0x24); // adc status register(adcs)
  lcd_regwrite(0xc8,0x80); // touch panel segment high byte data register(tpxr)
  lcd_regwrite(0xc9,0x80); // touch panel common high byte data register(tpyr)
  lcd_regwrite(0xca,0x00); // touch panel segment/common low byte data register(tpzr)
  lcd_regwrite(0xd0,0x80); // lcd contrast control register (lccr)
  lcd_regwrite(0xe0,0x00); // pattern data register(pdr)
  lcd_regwrite(0xf0,0xa0); // font control register(fcr)
  lcd_regwrite(0xf1,0x0f); // font size control register
}
//.............................................
void lcd_clear(void) 
{                   //清屏
  uchar reg_rddata;
  lcd_regwrite(0xe0,0x00);
  reg_rddata =lcd_regread(0xf0);
  reg_rddata |= 0x08;
  lcd_regwrite(0xf0,reg_rddata);
}


void SetXY(uchar x,uchar y)
{                                
	lcd_regwrite(0x60,x); // active window top register(awtr)
    
	lcd_regwrite(0x70,y); // active window top register(awtr)
	
}

void lcd_photo(uchar code *pho) 
{                          //显示图形
  uchar i,j,k;
  uchar code *pp;
  SetXY(0,0);
  for(k=0;k<4;k++)
  {
    pp=pho;
    for(j=0;j<60;j++)
    {
      for(i=0;i<40;i++)
      {
        lcd_datawrite(*pp);
        ++pp;
      }
    }
  }
}


⌨️ 快捷键说明

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