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

📄 lcd_test.c

📁 有单片机控制的12864图形显示程序
💻 C
字号:
/***********************************************
TCM12864J液晶显示屏驱动程序
驱动芯片:KS0107
MCU:AT89S52
作者:金杰
日期:08-09-05

P11--RS		RS=1,表示DB7~DB0 为显示数据
			RS=0”,表示DB7~DB0 为显示指令数据
P12--RW		R/W=1”,E=“H”,数据被读到DB7~DB0
			R/W=0”,E=“H→L”, DB7~DB0 的数据被写到IR 或DR
P13--E		使能信号:	R/W=“L”,E 信号下降沿锁存DB7~DB0
						R/W=“H”,E=“H” DRAM数据读到DB7~DB0
P14--CSA	H:选择芯片(右半屏)信号
P15--CSB	H:选择芯片(左半屏)信号
P2---DB0~7
***********************************************/

#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
#include <Word.h>

//sbit P15 = P1^5;
sbit p_RS = P1^1;
sbit p_RW = P1^2;
sbit p_E = P1^3;
sbit p_CSA = P1^4;
sbit p_CSB = P1^5;
#define DATA P2



void DelayMs(unsigned int count1);
void lcd_busy(void);
void lcd_init(void);
void lcd_setxy(unsigned char x,unsigned char y);
void lcd_writedata(unsigned char x,unsigned char y);
void lcd_writeword(unsigned char x,unsigned char y,unsigned char d[2][6]);
void lcd_clear(void);
void lcd_writepoint(unsigned char i,unsigned char j);
unsigned char lcd_readdata(unsigned char x,unsigned char y);

void main(void)									//主函数
{
	unsigned char z;
	unsigned char i1=32,j1,flag=0;

	lcd_init();
	lcd_clear();
	
	for(j1=0;j1<128;j1++)
	{
		lcd_writepoint(i1,j1);
		if(flag==0)i1=i1-1;
		else i1=i1+1;
		if(i1<=0)flag=1;
		if(i1>=32)flag=0;
	}

	while(1)
	{
		for(z=0;z<2;z++)
		{
			lcd_writeword(3,45,w1);
	  		DelayMs(1000); 
	  		lcd_writeword(3,45,w2);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w3);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w4);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w5);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w6);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w7);
	  		DelayMs(1000);  
	  		lcd_writeword(3,45,w8);
	  		DelayMs(2000);   			
		}
		lcd_clear();
	}

	for(i1=0;i1<64;i1++)
		for(j1=0;j1<128;j1++)
		{
			lcd_writepoint(i1,j1);
			DelayMs(200);
		}

	lcd_clear();
	


/*	while(1)
	{
		lcd_clear();
		lcd_busy();

		lcd_writeword(0,0,ee);		//南
		lcd_writeword(0,16,ff);		//京
    	lcd_writeword(0,32,aa);		//绝
    	lcd_writeword(0,48,bb);		//妙
    	lcd_writeword(0,64,cc);		//科
    	lcd_writeword(0,80,dd);		//技
    	lcd_writeword(0,96,gg);		//发
    	lcd_writeword(0,112,hh);	//展
    	lcd_writeword(2,0,ii); 		//有
    	lcd_writeword(2,16,jj); 	//限
    	lcd_writeword(2,32,kk); 	//公
    	lcd_writeword(2,48,ll); 	//司
    	lcd_writeword(2,64,k);  	//句号
    	lcd_writeword(2,80,mm); 	//专
    	lcd_writeword(2,96,nn); 	//业
    	lcd_writeword(2,112,oo);	//液
    	lcd_writeword(4,0,pp);  	//晶
    	lcd_writeword(4,16,qq); 	//屏
    	lcd_writeword(4,32,dd); 	//技
    	lcd_writeword(4,48,rr); 	//术
    	lcd_writeword(4,64,k); 		//句号
    	lcd_writeword(4,80,ss); 	//欢
    	lcd_writeword(4,96,tt); 	//迎
    	lcd_writeword(4,112,uu); 	//使
    	lcd_writeword(6,0,vv);   	//用
    	lcd_writeword(6,16,k);  	//句号

		lcd_writeword(6,80,zzz);
		lcd_writeword(6,96,zzz);
		lcd_writeword(6,112,zzz);

		for(z=0;z<2;z++)
		{
			lcd_writeword(6,64,w1);
	  		DelayMs(150); 
	  		lcd_writeword(6,64,w2);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w3);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w4);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w5);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w6);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w7);
	  		DelayMs(150);  
	  		lcd_writeword(6,64,w8);
	  		DelayMs(150);   			
		}

		lcd_clear();

		//第二屏
		lcd_busy();

		lcd_writeword(0,0,ww);//地
    	lcd_writeword(0,16,xx);//址
    	lcd_writeword(0,32,j); //:
    	lcd_writeword(0,48,yy);//中
    	lcd_writeword(0,64,zz);//山
    	lcd_writeword(0,80,a);//东
    	lcd_writeword(0,96,b);//路
		lcd_writeword(0,112,zzz);
    	lcd_writeword(2,0,l); //11
    	lcd_writeword(2,16,m); //0
    	lcd_writeword(2,32,c); //号
    	lcd_writeword(2,48,d); //二
    	lcd_writeword(2,64,e);  //楼
    	lcd_writeword(2,80,n); //23
    	lcd_writeword(2,96,c); //号
    	lcd_writeword(2,112,k);//句号
    	lcd_writeword(4,0,f);  //电
    	lcd_writeword(4,16,g); //话
    	lcd_writeword(4,32,o); //02
    	lcd_writeword(4,48,p); //5-
    	lcd_writeword(4,64,q); //84
    	lcd_writeword(4,80,r); //53
    	lcd_writeword(4,96,s); //28
    	lcd_writeword(4,112,t); //68
    	lcd_writeword(6,0,h);   //传
    	lcd_writeword(6,16,i);  //真
    	lcd_writeword(6,32,o); //02
    	lcd_writeword(6,48,p); //5-
    	lcd_writeword(6,64,q); //84
    	lcd_writeword(6,80,u); //41
    	lcd_writeword(6,96,n); //23
    	lcd_writeword(6,112,v); //46

		DelayMs(2000);
		lcd_clear();
	}*/
}

void DelayMs(unsigned int count1)
{
	while (count1--)
	{
		unsigned char count2 = 0;
		for (; count2<30; count2++);
	}
}

/***********************************************
查询LCD是否忙碌,如果忙碌,则等待,直到不忙碌,
跳出该函数,顺序执行下面程序
************************************************/
void lcd_busy(void)
{
	p_RS=0;						//CMD
	p_RW=1;						//READ
	while(1)
	{
		p_E=1;
		if(DATA<0x80)break;		//BUSY(DB7) = 0
		p_E=0;
	}
	p_E=0;
}

/**********************************************
初始化
***********************************************/
void lcd_init(void)
{
	//开显示
	p_RS=0;						//CMD
	p_RW=0;						//Write
	DATA=0x3f;					//Display ON
	
	p_CSA=1;
	p_CSB=0;

	p_E=1;
	p_E=0;

	p_CSA=0;
	p_CSB=1;

	p_E=1;
	p_E=0;

	//0行显示
	lcd_busy();
	
	//P15=0;

	DATA=0xc0;		//0行开始
	
	p_CSA=1;
	p_CSB=0;

	p_E=1;
	p_E=0;

	p_CSA=0;
	p_CSB=1;

	p_E=1;
	p_E=0;
}

/**********************************************
设置行值和列值
***********************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
	if(y<64)
	{
		//写行地址left
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=1;
		p_CSB=0;

		DATA=0xb8|x;
	
		p_E=1;
		p_E=0;

		//写列地址left
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=1;
		p_CSB=0;

		DATA=0x40|y;

		p_E=1;
		p_E=0;
	}
	else
	{
		//y=y-64;
		//写行地址right
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=0;
		p_CSB=1;
	
		DATA=0xb8|x;
	
		p_E=1;
		p_E=0;

		//写列地址right
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=0;
		p_CSB=1;

		DATA=0x40|y;

		p_E=1;
		p_E=0;

	}
}

/**********************************************
画点i(0-63),j(0-127)
***********************************************/
void lcd_writepoint(unsigned char i,unsigned char j)
{
	unsigned char x,y,data_t=0x00;
	y=j;

	if(i>=0&&i<=7)
	{
		x=0;
		data_t=(0x01<<i);
	}
	else if(i>=8&&i<=15)
	{
		x=1;
		data_t=(0x01<<(i-8));
	}
	else if(i>=16&&i<=23)
	{
		x=2;
		data_t=(0x01<<(i-16));
	}
	else if(i>=24&&i<=31)
	{
		x=3;
		data_t=(0x01<<(i-24));
	}
	else if(i>=32&&i<=39)
	{
		x=4;
		data_t=(0x01<<(i-32));
	}
	else if(i>=40&&i<=47)
	{
		x=5;
		data_t=(0x01<<(i-40));
	}
	else if(i>=48&&i<=55)
	{
		x=6;
		data_t=(0x01<<(i-48));
	}
	else if(i>=56&&i<=63)
	{
		x=7;
		data_t=(0x01<<(i-56));
	}
	lcd_busy();
	lcd_setxy(x,y);

	p_RS=1;
	p_RW=0;

	if(y<64)
	{
		p_CSA=1;
		p_CSB=0;
	}
	else
	{
		p_CSA=0;
		p_CSB=1;
	}
	DATA=data_t;
	
	p_E=1;
	p_E=0;
}

/**********************************************
写数据,给所有单元都写入0
***********************************************/
void lcd_writedata(unsigned char x,unsigned char y)
{
	lcd_busy();
	lcd_setxy(x,y);		//set x,y address

	p_RS=1;				//write data
	p_RW=0;				//write

	if(y<64)
	{
		p_CSA=1;
		p_CSB=0;
	}
	else
	{
		p_CSA=0;
		p_CSB=1;
	}
	DATA=0x00;

	p_E=1;
	p_E=0;
}

/**********************************************
显示字
***********************************************/
void lcd_writeword(unsigned char x,unsigned char y,unsigned char d[2][16])
{
	unsigned char i,j;

	for(i=0;i<2;i++)
		for(j=0;j<16;j++)
		{
			lcd_busy();
			lcd_setxy(i+x,j+y);

			p_RS=1;			//write data
			p_RW=0;

			if(y<64)
			{
				p_CSA=1;
				p_CSB=0;
			}
			else
			{
				p_CSA=0;
				p_CSB=1;
			}

			DATA=d[i][j];
			
			p_E=1;
			p_E=0;
		}
}
/**********************************************
读显示字
***********************************************/
unsigned char lcd_readdata(unsigned char x,unsigned char y)
{
	unsigned char data_t;
	lcd_busy();
	lcd_setxy(x,y);		//set x,y address

	
	p_RS=1;
	p_RW=1;

	if(y<64)
	{
		p_CSA=1;
		p_CSB=0;
	}
	else
	{
		p_CSA=0;
		p_CSB=1;
	}
	p_E=1;
	data_t=DATA;
	p_E=0;
	return data_t; 

}

/**********************************************
清屏
***********************************************/
void lcd_clear(void)
{
	unsigned char i,j;
	for(i=0;i<8;i++)
		for(j=0;j<128;j++)
			lcd_writedata(i,j);
}





⌨️ 快捷键说明

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