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

📄 qh2001.c

📁 Qh2001液晶驱动接口函数,适合于大多数液晶显示应用领域
💻 C
字号:
/*
我用的是QH2001的LCD显示器,按照我下面的显示程序,显示器能点亮但是没有能显示出字符来,我把数据线依次反接后还是没有字符显示.请问各位大虾这是怎么回事啊?我觉得我的程序应该是没有问题的啊.

电路接法17到20以及5号脚(Vo)我没接,9到16接的P0口,3---GND,4---VDD(+5V),其他脚的接法为:
sbit DI = P1^5;
sbit RW = P1^4;
sbit CSB = P1^6;
sbit CSA = P1^7;
sbit E1 = P3^7;
sbit E2 = P3^6; //显示器的使能端E是从P3.6和P3.7经过一个与非门接上的,所以定义了E1和E2
*/
// Includes
//-----------------------------------------------------------------------------
#include "LPC23xx.h"


#define RW 1<<26   //P1.26
#define DI 1<<27   //p1.27
#define CSB 1<<28  //p1.28
#define CSA 1<<29
#define E1  1<<30
#define PORTD 0xff<<18 //p1.18-	pp1.25

// Define the register command code 
//-----------------------------------------------------------------------------
//正常p0-p7-->d0-d7
#define Disp_On 0x3F
#define Disp_Off 0x3E
#define Col_Add 0x40
#define Page_Add 0xB8
#define Start_Line 0xC0
//位置反了p0-p7-->d7-d0
//#define Disp_On 0xFC
//#define Disp_Off 0x7C
//#define Col_Add 0x40
//#define Page_Add 0xB8
//#define Start_Line 0xC0

// Function PROTOTYPES
//-----------------------------------------------------------------------------

void initial_LCD(void);
void DISPLAY(void);
void clear_LCD (void);
void send_com(unsigned char);
void send_data(unsigned char );
void delay(unsigned char);
void delay_10us(unsigned char);

void hz_disp16(unsigned char,unsigned char, unsigned char *);
unsigned char ChangeDat(unsigned char);
/* 二进制代码 */
// 照 -- 
unsigned char zhao[]={
0x00,0x00,0xFE,0x22,0x22,0xFE,0x40,0x21,0xD1,0x4F,0x41,0x51,0x61,0xDF,0x00,0x00,
0x40,0x60,0x3B,0x01,0x09,0x33,0x60,0x00,0x0F,0x32,0x62,0x02,0x0A,0x37,0x60,0x00};
// 射 
unsigned char she[]={
0x00,0x00,0xFC,0x56,0x55,0x54,0x54,0xFC,0x10,0x90,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x42,0x23,0x12,0x0A,0x46,0x82,0x7F,0x00,0x00,0x47,0x80,0x7F,0x00,0x00,0x00};
// 冒号 
unsigned char maohao[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 测 
unsigned char ce[]={
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00};
// 量 
unsigned char liang[]={
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00};
// 样 --
unsigned char yang[]={
0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0x49,0x4E,0x48,0xF8,0x4C,0x4B,0x48,0x08,0x00,
0x02,0x01,0x00,0xFF,0x00,0x00,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x00};
// 1 
unsigned char yi[]={
0x00,0x00,0x00,0x00,0x00,0x08,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00};
// 2 
unsigned char er[]={
0x00,0x00,0x00,0x18,0x04,0x02,0x02,0x02,0x82,0x82,0x84,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x78,0x44,0x42,0x41,0x41,0x40,0x40,0x40,0x70,0x00,0x00,0x00,0x00};
// 分
unsigned char fen[]={
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00};
// 秒
unsigned char miao[]={
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00};

// MAIN Routine
//-----------------------------------------------------------------------------
main() 
{
  unsigned int i;
  for(i=0;i<1000;i++); // 延时,等待系统上电稳定
  initial_LCD();
  clear_LCD();
  for(i=0;i<6000000;i++); // 延时,等待系统上电稳定
  while(1)
  {
     DISPLAY();
   }
}

//***********清屏*****************************
void clear_LCD(void)
{
   unsigned char m,i;
   IOCLR1 = (CSA|CSB);//   CSA=1;	   CSB=1;
   send_com(Page_Add+0);
   send_com(Col_Add+0);
   for(i=0;i<8;i++)
   {
     send_com(Page_Add+i);
     for(m=0;m<64;m++)
	   {
	     send_data(0x00);
	   }
   }
   IOSET1 = (CSA|CSB);
}

//**********LCD初始化************************
void initial_LCD(void)
{
  IODIR1 |=(PORTD|E1|CSA|CSB|DI|RW);
  delay(10);
  IOCLR1 = (CSA|CSB);
  delay(10);
  send_com(Disp_Off);
  send_com(Page_Add+0);
  send_com(Start_Line+0);
  send_com(Col_Add+0);
  send_com(Disp_On);
  IOSET1 = (CSA|CSB);
}


//**********数据写命令***************************
void send_com(unsigned char command )
{
  command = ChangeDat(command);//数据变换	
  delay_10us(4);
  IOCLR1 = (DI|RW);  //
  //PORTD=command;
  IOCLR1 = PORTD;
  IOSET1 = (command<<18);
  IOCLR1 =E1;//
  delay_10us(10);
  IOSET1 =(E1); //
}

//**********写数据***************************
void send_data(unsigned char dat )
{
  dat = ChangeDat(dat);//数据变换
  delay_10us(4);
  IOSET1 = DI;//DI=1;
  IOCLR1 = RW;//RW=0
  //PORTD=dat;
  IOCLR1 = PORTD;
  IOSET1 = (dat<<18);

  IOCLR1 = E1;//E1 =0;
  delay_10us(10);
  IOSET1 = (E1);     //  E1 =1;	  E2 =1;
}

//---------------------指定位置显示汉字16*16-----------------------

void hz_disp16(unsigned char pag,unsigned char col, unsigned char *hzk)
{
  unsigned char m=0,i=0;
  for(m=0;m<2;m++)
  {
    send_com(Page_Add+pag+m);
    send_com(Col_Add+col);
    for(i=0;i<16;i++) 
    { 
      send_data(hzk[16*m+i]);
	  //send_data(0xff);
     }
   }
}


//******************显示点阵子程序************
void DISPLAY(void)
{
   unsigned char m=0,i=0;
   // clear_LCD();
   IOSET1 = CSB;//   CSA=1;
   IOCLR1 = CSA;//CSB=0;
   hz_disp16(0,0,zhao);
   delay(50);
   hz_disp16(0,16,she);
   delay(50);
   hz_disp16(0,32,maohao);
   delay(50);
   hz_disp16(2,0,ce);
   delay(50);
   hz_disp16(2,16,liang);
   delay(50);
   hz_disp16(2,32,maohao);
   delay(50);
   hz_disp16(4,0,yang);
   delay(50);
   hz_disp16(4,16,yi);
   delay(50);
   hz_disp16(4,32,maohao);
   delay(50);

   hz_disp16(6,0,yang);
   delay(50);
   hz_disp16(6,16,er);
   delay(50);
   hz_disp16(6,32,maohao);
   delay(50);

   IOCLR1 = CSB;//CSA=0;
   IOSET1 = CSA;//CSB=1;
   for(i=0;i<4;i++)
   {
      hz_disp16(m,0,fen);
      delay(50);
      hz_disp16(m,32,miao);
      delay(50);
      m+=2;
    }
  IOSET1 = CSA;
  IOSET1 = CSB;
}

//***********延时*****************************
//-----------------------------------------------------------------------------
void delay_10us(unsigned char x) 
{ 
   while(x--);
} 

void delay(unsigned char cnt)
{
   unsigned char i;
   do 
   {
      i = 4;
      do 
	  {
         delay_10us(39);
       } while(--i);
   } while(--cnt);
}
//*********************************************
//change d0-d7--->d7--d0
unsigned char ChangeDat(unsigned char dat)
{
	unsigned char i,temp;
	for(i=0;i<8;i++)
	{
		if(dat&1)
		{
			temp = (temp<<1)|1;
		}
		else
		{
			temp = (temp<<1);
		}
		dat =dat>>1;
	}
	return temp;
}

⌨️ 快捷键说明

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