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

📄 fanbai.c

📁 基于ST7902驱动的12864LCD显示汉字、图片
💻 C
字号:
//12864液晶的试验程序,驱动芯片为ST7920
//目标板为DDC-128B
//驱动方式位并口
//JP10的所有短路块拔掉,JP4短路块位于右侧,JP7两个短路块均插好
//调节V0电位器调整对比度
//注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。

#include <iom128.h>
#include <string.h>

#define uchar unsigned char 
#define uint unsigned int 

#define RS (1<<0)
#define RW (1<<1)
#define EN (1<<2)


//延时函数
void s_ms(uint ms)
{
	for(;ms>1;ms--);
}	

//此处定义字符串
char text_1[]={"北京东控开发板"};
char text_2[]={"反白练习"};
char text_3[]={"可以单字反白或不"};
char text_4[]={"反白"};

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
	void ReadStatusLCM(); //检测忙
	s_ms(100);
	PORTG|=RS;       //RS=1    
	s_ms(100);
	PORTG&=~RW;      //RW=0
	s_ms(100);
	PORTG|=EN;       //EN=1
	s_ms(100);
	PORTA=WDLCM;     //输出数据
	s_ms(100);
	PORTG&=~EN;      //EN=0
	s_ms(100);
}

//写指令
void WriteCommandLCM(unsigned char WCLCM) 
{
	void ReadStatusLCM(); //根据需要检测忙
	s_ms(100);
	PORTG&=~RS;      //RS=0
	s_ms(100);
	PORTG&=~RW;      //RW=0
	s_ms(100);
	PORTG|=EN;       //EN=1
	s_ms(100);
	PORTA=WCLCM;     //输出指令
	s_ms(100);
	PORTG&=~EN;      //EN=0
	s_ms(100);
}

//读状态:检测忙
void ReadStatusLCM(void)
{
	uchar temp;
    uchar flag = 1;
    while(flag==1)
	{
	    DDRA=0x00;      //端口A改为输入
		PORTA=0xff;    
		s_ms(100);
		PORTG&=~RS;     //RS=0
		s_ms(100);
		PORTG|=RW;      //RW=1
		s_ms(100);
		PORTG|=EN;      //EN=1
		s_ms(100);
		temp = PINA;    //读端口A
		s_ms(100);
		DDRA=0xff;      //端口A改为
		s_ms(100);
		PORTG&=~EN;     //EN=0
		s_ms(100);
		if(temp>>7==0)
		flag = 0;
	}
}

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

//按指定位置显示一串字符
//液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
//          从第一行第一列开始,依次向左,如果想在不同的
//          位置显示,只需修改相应的行值即可。液晶显示
//          完毕后,转入语音文本发送。
//DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
//			第二行显示;X为0x88在第三行显示;X为0x98在
//			第四行显示;DData为显示数组。
void DisplayList(unsigned char X, char *DData)
{
	unsigned char length;
	unsigned char i=0;
	char *p;
	p = DData;
	length = strlen(p);
	WriteCommandLCM(0x08);
	WriteCommandLCM(X);
	WriteCommandLCM(0x06);
	WriteCommandLCM(0x0C);
	WriteCommandLCM(X);
	for(i=0;i<length;i++)
	{
		WriteDataLCM(DData[i]);
		i++;
		WriteDataLCM(DData[i]);
	}
}
/********************************
函数名称:WriteGdram(uchar lcd_addr,uchar lcd_data)写GdRAM
入口参数:地址:lcd_addr,数据:lcd_data
返回参数:无
********************************/
void Set_White(void)
{
 	uchar i;
        uchar j;		//
	
 WriteCommandLCM(0x36);
    for(i=0;i<32;i++ )			//要反白时,先将整行的液晶全部清成不反白(此处行指y)
	{
	   WriteCommandLCM(0x80|i);	//设置绘图区的Y地址坐标0
	   WriteCommandLCM(0x80);		//设置绘图区的X地址坐标0
	    for(j=0;j<16;j++)		//
		{
		   WriteDataLCM(0x00);	//清成不反白
                   
		 }
	}
   for(i=32;i<64;i++ )			//要反白时,先将整行的液晶全部清成不反白(此处行指y)
	{
	   WriteCommandLCM(0x88|i);	//设置绘图区的Y地址坐标0
	   WriteCommandLCM(0x80);		//设置绘图区的X地址坐标0
	    for(j=0;j<16;j++)		//
		{
		   WriteDataLCM(0x00);	//清成不反白
                 
		 }
	} 
  WriteCommandLCM(0x30);
}
void fan(uchar col)
{
        uchar i;
        uchar j;		//
	uchar clr_x;
        uchar clr_y;
  switch(col)
     { 
        case 0:
	
		clr_x = 0x80;
		clr_y = 0x80;
                break;
	
	case 1:
	
		clr_x = 0x80;
		clr_y = 0x90;
                break;
	
	case 2:
	
		clr_x = 0x80;
		clr_y = 0x88;
                break;
	
	case 3:
	
		clr_x = 0x80;
		clr_y = 0x98;
                break;
      }
  WriteCommandLCM(0x36);
   for(i=0;i<16;i++ )				//16行,因为是16*16汉字
	{
	  WriteCommandLCM(clr_y|i);	//设置绘图区的Y地址坐标0
	  WriteCommandLCM(clr_x);	//设置绘图区的X地址坐标0
	  for(j=0;j<16;j++)	//
	  {		 
	    WriteDataLCM(0xff); //反白这一行的8个点,液晶地址自动加1								  
            asm("nop");
	   }
	}
}
//主函数
void main(void)
{
  //端口初始化
	DDRA=0xff;
	PORTA=0xff;
	DDRB=0xff;
	PORTB=0xff;
	DDRG=0xff;
	PORTA=0x00;
	PORTG|=(1<<3);
	
	
	s_ms(200); 
	s_ms(200);  
	LCMInit(); //LCM初始化   //液晶初始化
        
        DisplayList(0x80,text_1);     //显示第一行
	DisplayList(0x90,text_2);     //显示第二行
	DisplayList(0x88,text_3);     //显示第三行       
	DisplayList(0x98,text_4);     //显示第四行
        s_ms(2000); 
	s_ms(2000);
      // Set_White(0);
      Set_White();
      fan(3);
        
	while(1);
                   
}

⌨️ 快捷键说明

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