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

📄 main.c

📁 16位单片机xc164用于QH2001显示。
💻 C
字号:
/*----------------------------------------------
   
	 选用16位单片机:  英飞凌  XC164CS-16F
   
	 选用的液晶模块:QH2001,内部采用KS0108B控制器。
	 接线:
 
 液晶接口            单片机接口
 	1	  CSB              P4_P0
	2	  CSA              P4_P1		
  3 	VSS	               GND			    
  4  VDD								  +5V
	 5	VO								
	 6  RS               P4_P2			
   7  RW               P4_P3			
  8  E                 P4_P4		  
 9 --16	DB0 --DB7		  P0L
		 19  RST           P4_P5
申明:此程序是根据网上的程序改的。

-------------------------------------------------*/



#include "MAIN.H"
//控制管脚定义  
   //P0L数据通道 
	#define	   CSB     P4_P0			//片选2																					  
	#define    CSA     P4_P1			//片选1
	#define    RS      P4_P2			//指令数据通道		 DI
	#define    RW      P4_P3			//读写选择
	#define    E       P4_P4		  //使能信号, 在下降沿写入数据	(WR)
	#define    RST     P4_P5			//复位

unsigned char huan[]={//欢[16*16]下半列排
0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00};
unsigned char ying[]={//迎[16*16]下半列排
0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00};
unsigned char guang[]={//光[16*16]下半列排
0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,
0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00};
unsigned char lin[]={//临[16*16]下半列排
0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C,
0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00};

unsigned char tanhao[]={0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
			0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00};

unsigned char jinghao[]={0x40,0xc0,0x78,0x40,0xc0,0x78,0x40,0x00,
				0x04,0x3f,0x04,0x04,0x3f,0x04,0x04,0x00};

unsigned char w2[]={0xf8,0x08,0x00,0xf8,0x00,0x08,0xf8,0x00,
				0x03,0x3c,0x07,0x00,0x07,0x3c,0x03,0x00};

unsigned char w[]={0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
				0x0f,0x30,0x0c,0x03,0x0c,0x30,0x0f,0x00};

unsigned char o2[]={0xe0,0x10,0x08,0x08,0x08,0x10,0xe0,0x00,
				0x0f,0x10,0x20,0x20,0x20,0x10,0x0f,0x00};

unsigned char u[]={0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
				0x00,0x1f,0x20,0x20,0x20,0x10,0x3f,0x20};

unsigned char r[]={0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
				0x20,0x20,0x3f,0x21,0x20,0x00,0x01,0x00};

unsigned char o[]={0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
				0x00,0x1f,0x20,0x20,0x20,0x20,0x1f,0x00};

unsigned char e2[]={0x08,0xf8,0x88,0x88,0xe8,0x08,0x10,0x00,
				0x20,0x3f,0x20,0x20,0x23,0x20,0x18,0x00};

unsigned char a2[]={0x00,0x00,0xc0,0x38,0xe0,0x00,0x00,0x00,
				0x20,0x3c,0x23,0x02,0x02,0x27,0x38,0x20};

unsigned char v[]={0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
				0x00,0x01,0x0e,0x30,0x08,0x06,0x01,0x00};

unsigned char dot[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00};

unsigned char 	a[]={0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
				0x00,0x19,0x24,0x22,0x22,0x22,0x3f,0x20};

unsigned char c[]={0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
				0x00,0x0e,0x11,0x20,0x20,0x20,0x11,0x00};

unsigned char m[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
				0x20,0x3f,0x20,0x00,0x3f,0x20,0x00,0x3f};	 


void delayms(int tickms)	  //延时子程序
{ 
	int i,count;
	_nop_();
	_nop_();
	_nop_();

	for(i=tickms;i>0;i--)
	{ 
		for(count=0;count<1000;count++) 
		{
			_nop_();_nop_();_nop_();_nop_();_nop_();
			_nop_();_nop_();_nop_();_nop_();_nop_();
			_nop_();_nop_();_nop_();_nop_();_nop_();
			_nop_();_nop_();_nop_();_nop_();_nop_();
		}
	}
}
void  CheckState()
{
 //	unsigned char dat;

	RS=0;					 //
 	RW=1;					 //		read
 	P0L=0x00;			
 	do
	{
		E=1;
		E=0;

	}
	while (P0L&0x80);			//
}

/*----------------------------------------------
   写显示数据
   形参dat:显示数据
-------------------------------------------------*/
void WriteByte(unsigned char dat)
{
	CheckState();
	RS=1;									//
	RW=0;									// write
    //	DP0L=0x00ff;           //P0L as output
	P0L=dat;
	E=1;
	E=0;
}
/*----------------------------------------------
   读显示数据
   形参dat:显示数据
-------------------------------------------------*/

unsigned char ReadByte()
{
	unsigned char dat;
	CheckState();
	RS=1; 
	RW=1;
	E=1; 
	dat=P0L;
	E=0;
	return(dat);
}

/*-------------------------------------------------
  向LCD发送命令
  形参command :命令
--------------------------------------------------*/
void SendCommandToLCD(unsigned char command)
{
	CheckState();
	RS=0;
  	RW=0;
    //	DP0L=0xff;	 			  //P0L as output
	P0L=command;
	E=1;
	E=0;

}

/*-------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
	line=line & 0x07; 	  	    // 0<=line<=7
    line=line|0xb8;	   	  	    //1011 1xxx
    SendCommandToLCD(line);
}
    //设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
	column=column &0x3f; 		 // 0=<column<=63
	column=column | 0x40; 		 //01xx xxxx
	SendCommandToLCD(column);
}

//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
	startline=startline & 0x07;              //??0x3f
	startline=startline|0xc0; 				 //1100 0000
	SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(unsigned char onoff)
{
	onoff=0x3e | onoff; //0011 111x
	SendCommandToLCD(onoff);
}

/*------------------清除内存---------------*/
void Clr_Scr()
{
	unsigned char j,k;
 	CSA=1;
//	delayms(10); 
	CSB=1;
//	delayms(10); 
 	SetLine(0);
 //	delayms(10); 
	SetColumn(0);
 	for(k=0;k<8;k++)
 	{
		SetLine(k);       //第K页
 	 	for(j=0;j<64;j++)
    	WriteByte(0x00);
 	}
}

/*------------------初始化LCD屏--------------------------*/
void init_lcd()
{
 	RST=0;
//	delayms(10); 
 	RST=1;
//	delayms(10); 
 	CSA=1;
//	delayms(10); 
	CSB=1;
//	delayms(10); 
	SetOnOff(0x3e);	   //关显示
 //	delayms(10); 
	SetLine(0x00);		   // 设定页
 //	delayms(10); 
	SetStartLine(0x00);
 //	delayms(10); 
	SetColumn(0x00);
 //	delayms(10); 
	SetOnOff(0x3f);       //开显示	
//	delayms(10);
	 
}
/*----------------------------------------------------------------------
说明:12864液晶横放,汉字按正常方式显示,pag:0~7(从上到下);
	  row:0~7(从左到右,水平行,一行可显示8个汉字)
功能:指定位置显示汉字16*16
------------------------------------------------------------------------*/
void word_disp(unsigned char pag,unsigned char row, unsigned char *hzk)
{
	unsigned char j=0,i=0,k=0;
 	for(j=0;j<2;j++)
	{
		if (row < 4)
	 	{
			k=row;
			CSA = 1;	//CSA=1,CSB=0,select leftwindow
			CSB = 0;
		}
		else
		{
			k = row-4;
			CSA = 0;	//CSA=0,CSB=1,select rightwindow
			CSB = 1;
		}
  		SetLine(pag+j);
  		SetColumn(k*16);
  		for(i=0;i<16;i++)
    	{
			WriteByte(hzk[16*j+i]);
		}
	}
}

/*----------------------------------------------------------------------
说明:12864液晶横放,字符按正常方式显示,pag:0~7(从上到下);
	  row:0~15(从左到右,水平行,一行可显示16个字符)
功能:指定位置显示字符8*16
------------------------------------------------------------------------*/
void byte_disp(unsigned char pag, unsigned char row, unsigned char *bytek)
{
	unsigned char j=0,i=0,k=0;
 	for(j=0;j<2;j++)
 	{
		if (row < 8)
		{
			k=row;
			CSA = 1;	
			CSB = 0;
		}
		else
		{
			k=row-8;
			CSA = 0;	
			CSB = 1;
		}
		SetLine(pag+j);
 	 	SetColumn(k*8);
		for(i=0;i<8;i++)
		{
			WriteByte(bytek[8*j+i]);
		}
	}
}

void main_window (void)

{ //分三行显示:欢迎光临	OurAvr	www.ouravr.com
	
	word_disp(1,2,huan);
	delayms(100); 
	word_disp(1,3,ying);
	delayms(100); 
	word_disp(1,4,guang);
	delayms(100); 
	word_disp(1,5,lin);
	delayms(100); 
	byte_disp(3,5,o2);
	delayms(100); 
	byte_disp(3,6,u);
	delayms(100); 
	byte_disp(3,7,r);
	delayms(100); 
	byte_disp(3,8,a2);
	delayms(100); 
	byte_disp(3,9,v);
	delayms(100); 
	byte_disp(3,10,r);
	delayms(100); 
	byte_disp(5,1,w);
	delayms(100); 
	byte_disp(5,2,w);
	delayms(100); 
	byte_disp(5,3,w);
	delayms(100); 
	byte_disp(5,4,dot);
	delayms(100); 
	byte_disp(5,5,o);
	delayms(100); 
	byte_disp(5,6,u);
	delayms(100); 
	byte_disp(5,7,r);
	delayms(100); 
	byte_disp(5,8,a);
	delayms(100); 
	byte_disp(5,9,v);
	delayms(100); 
	byte_disp(5,10,r);
	delayms(100); 
	byte_disp(5,11,dot);
	delayms(100); 
	byte_disp(5,12,c);
	delayms(100); 
	byte_disp(5,13,o);
	delayms(100); 
	byte_disp(5,14,m);  
	delayms(100); 

}											
															

//****************************************************************************
// @Function      void MAIN_vUnlockProtecReg(void) 
//
//----------------------------------------------------------------------------
// @Description   This function makes it possible to write one protected 
//                register. After calling of this function and write on the 
//                protected register is the security level set to low 
//                protected mode.
//
//----------------------------------------------------------------------------


void MAIN_vUnlockProtecReg(void)
{
  uword ubPASSWORD;

  if((SCUSLS & 0x1800) == 0x0800)      // if low protected mode
  {

    ubPASSWORD = SCUSLS & 0x00FF;
    ubPASSWORD = ~ubPASSWORD;
    SCUSLC = 0x8E00 | ubPASSWORD;      // command 4

  }  // end if low protected mode

  if((SCUSLS & 0x1800) == 0x1800)      // if write protected mode
  {
    
	SCUSLC = 0xAAAA;                   // command 0
    SCUSLC = 0x5554;                   // command 1
    ubPASSWORD = SCUSLS & 0x00FF;
    ubPASSWORD = ~ubPASSWORD;
    SCUSLC = 0x9600 | ubPASSWORD;      // command 2
    SCUSLC = 0x0800;                   // command 3; new PASSWOR is 0x00
    ubPASSWORD = SCUSLS & 0x00FF;
    ubPASSWORD = ~ubPASSWORD;
    SCUSLC = 0x8E00 | ubPASSWORD;      // command 4

  } 
} 
void IO_vInit(void)
{
   PICON          =  0x0000;      // load input configuration register

  P0H            =  0x0000;      // load data register
  POCON0H        =  0x0000;      // load output control register
  DP0H           =  0x0000;      // load direction register

  P0L            =  0x0000;      // load data register
  POCON0L        =  0x0000;      // load output control register
  DP0L           =  0xFFFF;      // load direction register
  ODP4           =  0x0000;      // load open-drain register
  P4             =  0x0000;      // load data register
  ALTSEL0P4      =  0x0000;      // load alternate output function select 
                                 // register 0
  ALTSEL1P4      =  0x0000;      // load alternate output function select 
                                 // register 1
  POCON4         =  0x0000;      // load output control register
  DP4            =  0xffff;      // load direction register


}
void MAIN_vInit(void)
{

	MAIN_vUnlockProtecReg();       // unlock write security
	PLLCON         =  0x7814;      // load PLL control register
	IO_vInit();
	PSW_IEN        =  1;          

}

//****************************************************************************
// @Function      void main(void) 
//
//----------------------------------------------------------------------------

  
 void main(void)
{
 	MAIN_vInit();	
 	init_lcd();
 	Clr_Scr();
 	//insert your functional code here...

 	while (1)
 	{
			main_window(); 

 	}
}

 /*----------------------------------------------
   程序烧写后无显示。检查接线正确。		
	 开电瞬间液晶会亮一下,然后没有什么显示。
	 初次使用液晶显示芯片,希望能帮忙看一下程序。
	 我实在不知道错在哪里。
-------------------------------------------------*/
		  


 


⌨️ 快捷键说明

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