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

📄 lcddisp.c

📁 ARM7 S3C44B0开发的启动代码
💻 C
字号:

/*
管脚对应表

液晶模块    44b0开发板

4	         4
5	         5
6            6 
其余都是电源,和信号无关,具体看说明

*/



/* File:LCDDISP.C
* 功能:使用硬件SPI接口输出LCD显示。
****************************************************************************/
//#include "option.h"
//#include "def.h"
#include "44b0x.h"
//#include "44blib.h"

#include "picturemap.h"
#define displaycommand 0xfa
#define   LCD_CS       0x80           /* vd4 LCD的片选 */
#define controlcommand    0xf8
typedef unsigned long uint32;
typedef unsigned char uint8;
typedef unsigned short uint16;
 uint16 displaybuffer[64][8];
void delay(unsigned long  dly);
void  Blink(int row);
void  TextDisplayInit(void);
void displaypicture(void);

#define LCDDATA  0x40    //p0.19  vd5
#define LCDCLK   0x20    //p0.17 vd6
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(int  dly)
{  unsigned  long int  i;

   for(; dly>0; dly--) 
      for(i=0; i<500000; i++);
}



/****************************************************************************
* 名称:LCDIni()

****************************************************************************/
void  LCDIni(void)
{ 
// 管脚功能设置
	rPCONC&=0xffff00ff;	
	rPCONC|=0x5500;   
}

void LCD_BACK_LIGHT(int i)//0 on, 1 off
{
	if(i==0)
		rPDATC|=0x100;
	else 
 		rPDATC&=~0x100;
}


/****************************************************************************
* 名称:SendData()
* 功能:向LCD发送数据。
* 入口参数:data        待发送的数据

****************************************************************************/
void  SendData(uint8 data)
{ 
	int i;
	for(i=0;i<8;i++)
	{
  		if(((data<<i)&0x80)==0x80)
 			rPDATC|=LCDDATA;//set dataline high
 		else 
  			rPDATC&=~LCDDATA; 
  		delay(4); 
  		rPDATC&=~LCDCLK;
  		delay(4);
  		rPDATC|=LCDCLK;
  
   ; //set dataline low 
  //  SSPDR = data;
  // while( 0==(SSPSR&0x80) );		// 等待SPIF置位,即等待数据发送完毕
  	}
}


/****************************************************************************
*名称 SendLCD()
* 功能:向LCD发送数据或命令。
* 入口参数:data    待发送的数据,命令/数据选择 1 命令 0 数据
***************************************************************************/
void SendLcd(uint8 data,uint8 flag)
{
	uint8 firstbyte,secondbyte;
   	LCDIni();		    // 初始化LCD接口
	firstbyte=data&0xf0;
	secondbyte=data<<4;
	secondbyte=secondbyte&0xf0;
	rPDATC|= LCD_CS; 		    // 片选
	if(flag==1)
		SendData(controlcommand);
	if(flag==0)
		SendData(displaycommand);
	SendData(firstbyte);
	SendData(secondbyte);
     	rPDATC&=~LCD_CS;	
}

void DisplayChineseword(unsigned short int x,unsigned short int y,unsigned int chineseword) //在x,y位置的一个汉字显示
{
	unsigned int i;
	char i1,i2;  
   	i=(unsigned int)chineseword;
   	i2=i;
   	i1=i>>8;
	switch(x)
   	{
   	case 0:
   		SendLcd(0x80+y,1);               //DD RAM 地址给定
		break;
    	case 1:
     		SendLcd(0x90+y,1);               //DD RAM 地址给定
     		break;
       case 2:
     		SendLcd(0x88+y,1);               //DD RAM 地址给定
     		break;
      	case 3:
     		SendLcd(0x98+y,1);               //DD RAM 地址给定
     		break;
   	}
     	SendLcd(i1,0);   
     	SendLcd(i2,0);
}

void printsentence(unsigned short int x,char *p)//xdenotes the start line  the 12864module is 4 line and 8 column
{
	unsigned int chineseword;
	unsigned short int temp1,temp2,i;
	 //LCD初始化开始
    	DelayNS(4);
   	SendLcd(0x06,1);                //;DDRAM的地址计数器(AC)加1
	 //LCD初始化结束
	for( i=0;i<8;i++)
	{
		temp1=(unsigned short int )*p++;
		temp2=(unsigned short int )*p++;
		chineseword=temp1;
		chineseword=(chineseword<<8)|(unsigned int)temp2;
		//chineseword=(unsigned int);
		DisplayChineseword(x,i,chineseword);
   	}
}

void printdot(int x,int y)//x and y is 128*64
{
   displaybuffer[x][y/16]|=0x8000>>(y%16);
}

void clearpicture()
{
	int i,j;
   	SendLcd(0x32,1);              // 功能设置---8BIT控制界面,绘图显示ON
  	SendLcd(0x36,1);                 //功能设置---8BIT控制界面,扩充指令集
 	SendLcd(0x34,1);                //关显示
	 for(i=0;i<64;i++)
     		for(j=0;j<8;j++)
      			displaybuffer[i][j]=0;
   	// SendLcd(0x36,1);          //开显示
}

void clearsentence()
{
  	SendLcd(0x30,1);                 //功能设置---8BIT控制界面,基本指令集
   	SendLcd(0x0c,1);              //显示打开,光标关,反白显示关 
   	SendLcd(0x01,1);                 //清除屏幕显示,将DDRAM的地址计数器归零
    	DelayNS(4);
}

void printxy(int x,int y,int Bold)
{
	if(x<0) x=0;
	if(y<0) y=0;
	if(x>127) x=127;
	if(y>63) y=63;
	if(Bold==0) 
		printdot(64-y,x);
	else 
	{
		printdot(64-y,x);
		printdot(64-y+1,x);
	}
}

void line_y(int startX,int startY,int length)
{
	int i;
	for (i=startX;i<length;i++)
     		printdot(i,startY);
}

void line_x(int startX,int startY,int length)
{
	int i;
	SendLcd(0x34,1);                //关显示
	for (i=startY;i<length;i++)
     		printdot(startX,i);
	SendLcd(0x36,1);                //关显示     
}

void graphshow()        //在LCD输出显示buffer的内容
{ 
	int i,j;
 	SendLcd(0x30,1);//基本命令
 	SendLcd(0x02,1)   ;//地址归位 
    	SendLcd(0x36,1);    //    8BIT控制界面,扩充指令集
     	SendLcd(0x32,1);     // 功能设置---8BIT控制界面,绘图显示ON
   	SendLcd(0x34,1);                //关显示
   	SendLcd(0x34,1);                //关显示
  	for(i=0;i<64;i++)
     		for(j=0;j<8;j++)
    		{
   			SendLcd(0x80+i%32,1);                //设置绘图区的Y地址坐标
   			SendLcd(0x80+(j+((int)(i/32))*8)%128,1) ;              //设置绘图区的X地址坐标
  			SendLcd(displaybuffer[i][j]>>8,0);
  			SendLcd(displaybuffer[i][j],0);
    		}
  	SendLcd(0x36,1);          //开显示
  }
  
void  TextDisplayInit()
{
   	SendLcd(0x30,1);                 //功能设置---8BIT控制界面,基本指令集
   	SendLcd(0x0c,1);              //显示打开,光标关,反白显示关 
   	SendLcd(0x01,1);                 //清除屏幕显示,将DDRAM的地址计数器归零
   	SendLcd(0x02,1);
}

  void displaypicture( )
  {
  	int i,j,temp1,temp2;
	//  linex(0,0,20);
  	for(i=0;i<64;i++)
     		for(j=0;j<8;j++)
      		{     
      			temp1 =0x00;
      			temp2=temp1|picture[i][j*2];
      			temp2=temp2<<8;
			temp1=temp2|picture[i][j*2+1];
			displaybuffer[i][j]=temp1;
		}
  }
  
  //发白显示
void  Blink(int row)
  {
  	int i,j;
	SendLcd(0x34,1);                //关显示
  	for(i=0;i<64;i++)
     		for(j=0;j<8;j++)
    		{
   			SendLcd(0x80+i%32,1);                //设置绘图区的Y地址坐标
   			SendLcd(0x80+j+((int)(i/32))*8,1) ;              //设置绘图区的X地址坐标
			if((row*16<i)&&(i<(row+1)*16) )
			{ 
				SendLcd(0xff,0);
       			SendLcd(0xff,0);
    			}
  			else
			{
  				SendLcd(0x0,0);
  				SendLcd(0x0,0);
  			};
     			SendLcd(0x36,1);                 //功能设置---8BIT控制界面,扩充指令集
    		}
  }
  
void flash(int location)
{
	if(location!=0)
	{
		SendLcd(0x30,1);//基本指令
		//SendLcd(0x,1);//
		SendLcd(0xf,1);//游标开
		SendLcd(0x7,1);
		SendLcd(0x80+location,1);
	};
}

void delay(unsigned long i)
{
	//for(i;i>0;i--);
	for(;i>0;i--);//txb,i=1,即一条指令时间为1/64M=15.625ns
}

⌨️ 快捷键说明

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