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

📄 jj12864.c

📁 ARM微机处理器驱动TG12864点阵汉字液晶显示C程序源代码
💻 C
字号:
#include "config.h"   //头函数

#define lcd 10
#define LCM_Data  (0xff<<16)  //P1.16~P1.23
#define LCM_E  (1<<27)   //P0.27
#define LCM_RW   (1<<26)   //P0.26
#define LCM_RS  (1<<25)   //P0.25
#define Busy    0x80 //用于检测LCM状态字中的Busy标识



unsigned char code BMP1[] = {图形}

unsigned char code HZ1[]={0x10,0x08,0x0B,0xFC,0x40,0x88,0x22,0x8C,
      0x0A,0x8A,0x54,0x88,0x21,0x08,0x22,0x28,
      0x25,0x10,0x01,0x04,0xFF,0xFE,0x05,0x40,
      0x09,0x20,0x11,0x1C,0x61,0x08,0x01,0x00};

unsigned char code HZ2[]={0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,
      0x03,0x80,0x05,0x40,0x09,0x20,0x11,0x10,
      0x21,0x0E,0xC1,0x04,0x01,0x00,0x00,0x00,
      0x24,0x90,0x22,0x48,0x22,0x44,0x40,0x04 
};

unsigned char code HZ3[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
      0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,
      0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,
      0x08,0x10,0x10,0x0E,0x60,0x04,0x00,0x00 };



void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void ding(unsigned char Page, unsigned char Col, unsigned char code *w);
void delay(unsigned int MS);
void Lcd12864_Location_XY(unsigned char  x,unsigned char  y);
void lcd_12864_clr(void); 
void Display(unsigned char dd );
void PHO_DISP(unsigned char code *s);
void lcd_12864_16x16(unsigned char x,unsigned char y,unsigned char code *w);

void main(void)
{
  
 unsigned char z;  
 PINSEL0 = 0x00000000;
    PINSEL1 = 0x00000000;//set P000~P031 to GPIO
	PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
	//PINSEL2 = PINSEL2 & (~0x0C);// P1[31:16]连接GPIO,但占用了〔31:26〕JTAG仿真口
	IO0DIR  = 0xFFFFFFFF;				// 设置P0控制口为输出
	IO1DIR  = 0xFFFFFFFF;               //set port P1 out
    

delay(400); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
delay(5); //延时片刻(可不要)
z=0x80;
hanzi();
}
 


/*=======================================================
                     库汉字显示
=======================================================*/
                   
void hanzi(unsigned char X,unsigned char Y,uint8 *DData)
{
unsigned char ListLength;
ListLength = 0;
WriteCommandLCM(Y,1);                    //限制X不能大于15,Y不能大于1
while (mao[ListLength]!='\0') //若到达字串尾则退出,字符长度小于32
  {
WriteDataLCM(mao[ListLength]);

ListLength++;

  
  delay(400);
  Y++;if(Y>0x9f)Y=0x80;
}
 
 WriteCommandLCM(0x0c,1); 
 }

/*======================================================
                      点阵汉字显示
=======================================================*/
  
  void ding(unsigned char Page,unsigned char Col,unsigned char code *w)	
{	 unsigned char shu,ju;
	shu=0x10;
	for(;shu!=0;shu--)
	{	
         WriteCommandLCM(0x34,1); 
         WriteCommandLCM(Page,1); 
         WriteCommandLCM(Col,1); 
         WriteCommandLCM(0x30,1); 
	 ju=0x02;
	    for(;ju!=0;ju--)
		{
		  WriteDataLCM(*w++); 
		  
		}
	
		Page+=1;
	}}
	 

   






//写数据
void WriteDataLCM(unsigned char WDLCM)
{
uint32 temp;
 temp = WDLCM<<16; 

ReadStatusLCM();//检测忙

IO0SET=LCM_RS;
IO0CLR=LCM_RW;
IO1CLR = LCM_Data;
IO1SET = temp;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
} 



//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
uint32 temp;
if(BuysC)ReadStatusLCM();//根据需要检测忙 

 temp = WCLCM<<16; 
IO1DIR=0xff<<16;//set lcd8 out
IO0CLR=LCM_RS;
IO0CLR=LCM_RW;
IO1CLR = LCM_Data;
IO1SET = temp; 
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
}



//读数据
unsigned char ReadDataLCM(void)
{
uint8 pdata;
IO1DIR=0x00<<16; 
IO0SET=LCM_RS;
IO0SET=LCM_RW;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
pdata=IO1PIN>>16;
IO1DIR=0xff<<16;
return(pdata); 
}


//读状态
unsigned char ReadStatusLCM(void)
{

uint8 pdata;
IO1DIR=0x00<<16; 
IO0CLR=LCM_RS;
IO0SET=LCM_RW;
IO0CLR=LCM_E;
Delay(lcd ); //延时
IO0SET=LCM_E;
Delay(lcd ); //延时
pdata=IO1PIN >>16; 
while( pdata&Busy);//检测忙信号
IO1DIR=0xff<<16;
return(pdata); 
}


/*=======================================================
 LCD初始化
=======================================================*/

void LCMInit(void) //LCM初始化
{
IO1CLR=LCM_Data;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay(5); 
WriteCommandLCM(0x38,0);
delay(5); 
WriteCommandLCM(0x38,0);
delay(5); 
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0F,1); // 显示开及光标设置
lcd_12864_clr();
}


//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)  
                                   //x表示列、y 表示行
{
Y &= 0x03;
X &= 0x07;
 switch(Y)
 {
  case 0:
   Y=0x80;break;
  case 1:
   Y=0x90;break;
  case 2:
   Y=0x88;break;
  case 3:
   Y=0x98;break;
  default:break;
 }
WriteCommandLCM(Y+X,1);
WriteDataLCM(DData);
}



/*=======================================================
   延时
=======================================================*/

void delay(unsigned int MS)
{
        unsigned char us,usn;

        while(MS!=0)
        {
                usn = 2;        //for 12M
                while(usn!=0)
                {
                        us=0xf6;
                        while (us!=0){us--;};
                        usn--;
                }
                MS--;
        }
}

/*=======================================================
 显示光标定位
=======================================================*/
void Lcd12864_Location_XY(unsigned char  x,unsigned char  y)
{ 
y &= 0x03;
x &= 0x07;
 switch(y)
 {
  case 0:
   y=0x80;break;
  case 1:
   y=0x90;break;
  case 2:
   y=0x88;break;
  case 3:
   y=0x98;break;
  default:break;
 }
WriteCommandLCM(y+x,1);

}


//**********显示图形子程序********************* 
void PHO_DISP(unsigned char code *s) 
{  
    unsigned char Page;                   //行 地址
    unsigned char Col;                    //列 地址   用于返回第二行
    unsigned char COUNT1,COUNT2,COUNT3;
    COUNT3=0X02;                                  //上下片
    Col=0X80;                                      //上片首地址
     for (;COUNT3!=0;COUNT3--) 
     {
        Page=0X80;                             //小行的地址.一直加,到下片时,保持连续`不用变值
        COUNT2=0X20;                           //每片32行扫描 
        for (;COUNT2!=0;COUNT2--)
        { 
          COUNT1=0X10;                         //16组8点阵=128点
          WriteCommandLCM(0x34,1); 
          WriteCommandLCM(Page,1); 
          WriteCommandLCM(Col,1); 
          WriteCommandLCM(0x30,1); 
          for (;COUNT1!=0;COUNT1--) 
           { 
            WriteDataLCM(*s++); 
           } 
         Page+=1; 
        }   
      Col=0X88;                                        //下片首地址
     } 
    WriteCommandLCM(0x36,1);
    delay(20); 
    WriteCommandLCM(0x30,1);
    WriteCommandLCM(0x0C,1); 
}



void lcd_12864_clr(void) 
{ unsigned char Page;     //行 地址
unsigned char Col;      //列 地址
unsigned char COUNT1,COUNT2,COUNT3;
COUNT3=0X02; 
Col=0X80; 
for (;COUNT3!=0;COUNT3--) 
{ 
Page=0X80; 
COUNT2=0X20;//32 
for (;COUNT2!=0;COUNT2--) 
{ 
COUNT1=0X10;//16 
WriteCommandLCM(0x34,1); 
WriteCommandLCM(Page,1); 
WriteCommandLCM(Col,1); 
WriteCommandLCM(0x30,1);  
for (;COUNT1!=0;COUNT1--) 
{ 
WriteDataLCM(0x00); 

} 
Page+=1; 
} 
Col=0X88; 
} 
WriteCommandLCM(0x36,1); 
delay(20);
WriteCommandLCM(0x30,1); 
WriteCommandLCM(0x0C,1); 
}




⌨️ 快捷键说明

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