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

📄 lcd.c

📁 【液晶显示器的C语言程序设计 Freescale 8位微控制器】一书的光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
/* This file is designed for the LCD display.*/
/*It is designed by Lijingjiao*/
/*Control: SED1520  LCD NAME:     MGLS100*32*/
#include "gp32.h"
/*开中断*/
#define cli() _asm("cli\n")
/*关中断*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")
typedef struct bits {
	unsigned char b0:1;
	unsigned char b1:1;
	unsigned char b2:1;
	unsigned char b3:1;
	unsigned char b4:1;
	unsigned char b5:1;
	unsigned char b6:1;
	unsigned char b7:1;
	}BITS;

typedef union bit_char {
	unsigned char byte;
	BITS b;
	} BIT_CHAR;

#define BSET(x, y)  ((x).b.b ## y = 1)
#define BCLR(x, y)  ((x).b.b ## y = 0)
#define CLRBYTE(x)  ((x).byte = 0)
@tiny volatile BIT_CHAR PTC @0x02;

unsigned char CLMADD,PAGEADD,Row,command,data;
int i,k,l,m;	
unsigned char PAGENUM,CLMSUM;

const unsigned char KeyValue[4]={0xfe,0xfd,0xfb,0xf7};
const unsigned char KeyTable[16]={0xee,0xde,0xbe,0x7e,
  				0xed,0xdd,0xbd,0x7d,
  				0xeb,0xdb,0xbb,0x7b,
  				0xe7,0xd7,0xb7,0x77};
  								  
const char CTable[128]={            //16个字符
0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,// S
0x00,0x7F,0x49,0x49,0x49,0x49,0x00,0x00,// E
0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00, //D
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00,// 1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,// 5
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,//2
0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00, //L
0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00, //C
0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00, //D
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0x00,0x3E,0x41,0x41,0x49,0x7A,0x00,0x00, //G
0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00, //P
0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00, //3
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,//2
};

const char table[128]={
0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00,
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00,//液
0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00,
0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,//晶
0x10,0xD0,0xFF,0x50,0x90,0x04,0xF4,0x54,0x5F,0x54,0x54,0x5F,0xF4,0x04,0x00,0x00,
0x03,0x00,0xFF,0x00,0x00,0x84,0x85,0x45,0x35,0x0F,0x15,0x25,0x65,0xC4,0x44,0x00,//模
0x10,0x10,0xFF,0x10,0x10,0x00,0x08,0x08,0xFF,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,
0x08,0x18,0x0F,0x04,0x85,0x41,0x31,0x0D,0x03,0x05,0x09,0x11,0x31,0x61,0x21,0x00//块
};
const int cnt=5;
const int ptr[5]={10,15,20,25,30};
/*1毫秒延迟*/
static void Wait1ms(void) {
  int cnt = 0;
  while (cnt <40) cnt++;
}
/*n毫秒延迟*/ 
void WaitNms(int n){
   int i;
   for(i=1;i<=n;i++) Wait1ms();
}	
/*读状态位-左*/
void BFReadL(void){
	unsigned char temp; 
	while(1){
		DDRB=0x00;
		BSET(PTC,2);				//E1=1
		BCLR(PTC,3);				//E2=0
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x80)==0) break;
	}
}
/*读状态位-右*/
void BFReadR(void){
	unsigned char temp; 
	while(1){
		DDRB=0x00;
		BCLR(PTC,2);				//E1=0
		BSET(PTC,3);				//E2=1
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x80)==0) break;
	}
}
/*写指令代码-左*/
void WRCommandL(void){
	BFReadL();
	DDRB=0xff;
	BSET(PTC,2);				//E1=1
	BCLR(PTC,3);				//E2=0
	BCLR(PTC,1);				//R/W=0
	BCLR(PTC,0);				//A0=0
	PTB=command;
	BCLR(PTC,2);				//E1=0
	BSET(PTC,1);				//R/W=1
}
/*写指令代码-右*/
void WRCommandR(void){
	BFReadR();
	DDRB=0xff;
	BSET(PTC,3);				//E2=1
	BCLR(PTC,2);				//E1=0
	BCLR(PTC,1);				//R/W=0
	BCLR(PTC,0);				//A0=0
	PTB=command;
	BCLR(PTC,3);				//E2=0
	BSET(PTC,1);				//R/W=1
}
/*写显示数据-左*/
void WRDataL(void){
	command=CLMADD;
	WRCommandL();
	BFReadL();
	DDRB=0xff;
	BSET(PTC,2);				//E1=1
	BCLR(PTC,3);				//E2=0
	BCLR(PTC,1);				//R/W=0
	BSET(PTC,0);				//A0=1
	PTB=data;
	BCLR(PTC,2);				//E1=0
	CLMADD++;
	BSET(PTC,1);				//R/W=1
}
/*写显示数据-右*/
void WRDataR(void){
	command=CLMADD;
	WRCommandR();
	BFReadR();
	DDRB=0xff;
	BSET(PTC,3);				//E2=1
	BCLR(PTC,2);				//E1=0
	BCLR(PTC,1);				//R/W=0
	BSET(PTC,0);				//A0=1
	PTB=data;
	BCLR(PTC,3);				//E2=0
	CLMADD++;
	BSET(PTC,1);				//R/W=1
}
/*读显示数据-左*/
int RDDataL(void){
	DDRB=0xff;
	BSET(PTC,2);				//E1=1
	BCLR(PTC,3);				//E2=0
	command=CLMADD;
	WRCommandL();
	BFReadL();	
	BCLR(PTC,1);				//R/W=0
	BSET(PTC,0);				//A0=1
	DDRB=0x00;						
	data=PTB;
	BCLR(PTC,3);				//E2=0
	CLMADD++;
	BSET(PTC,1);				//R/W=1
}
/*读显示数据-右*/
int RDDataR(void){
	DDRB=0xff;
	BSET(PTC,3);				//E2=1
	BCLR(PTC,2);				//E1=0
	command=CLMADD;
	WRCommandR();
	BFReadR();	
	BCLR(PTC,1);				//*R/W=0
	BSET(PTC,0);				//A0=1
	DDRB=0x00;						
	data=PTB;
	BCLR(PTC,3);				//E2=0
	CLMADD++;
	BSET(PTC,1);				//R/W=1
}		
/*开显示-左*/
void DisOnL(void){
	unsigned char temp; 
	while(1){
		command=0xaf;
		WRCommandL();
		BFReadL();
		DDRB=0x00;  //设置B口为输入
		BSET(PTC,2);				//E1=1
		BCLR(PTC,3);				//E2=0
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x20)==0) break;
	}
}
/*关显示-左*/
void DisOffL(void){
	unsigned char temp;
	while(1){ 
		command=0xae;
		WRCommandL();
		BFReadL();
		DDRB=0x00;  //设置B口为输入
		BSET(PTC,2);				//E1=1
		BCLR(PTC,3);				//E2=0
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x20)==0x20) break;
	}
}
/*开显示-右*/
void DisOnR(void){
	unsigned char temp; 
	while(1){
		command=0xaf;
		WRCommandR();
		BFReadR();
		DDRB=0x00;  //设置B口为输入
		BSET(PTC,3);				//E2=1
		BCLR(PTC,2);				//E1=0
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x20)==0) break;
	}
}
/*关显示-右*/
void DisOffR(void){
	unsigned char temp;
	while(1){ 
		command=0xae;
		WRCommandR();
		BFReadR();
		DDRB=0x00;  //设置B口为输入
		BSET(PTC,3);				//E2=1
		BCLR(PTC,2);				//E1=0
		BSET(PTC,1);				//R/W=1
		BCLR(PTC,0);				//A0=0
		temp=PTB;
		if ((temp&0x20)==0x20) break;
	}
}
/*清空显示RAM-左*/
void CLRDisplayL(void){

	PAGEADD=0xB8;		//设置页地址代码
	CLMADD=0x00;
	for(PAGENUM=0X04;PAGENUM>0;PAGENUM--){
		command=PAGEADD;
		WRCommandL(); 
   		data=0x00;
   		CLMADD=0x00;
		for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
			BFReadL();
   			WRDataL();			
		}
		PAGEADD++;			//页号增1
	}
}
/*清空显示RAM-右*/
void CLRDisplayR(void){
	PAGEADD=0xB8;		//设置页地址代码
	CLMADD=0x00;
	for(PAGENUM=0x04;PAGENUM>0;PAGENUM--){
		command=PAGEADD;
		WRCommandR(); 
   		data=0x00;
   		CLMADD=0x00;
		for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
			BFReadR();
   			WRDataR();			
		}
		PAGEADD++;			//页号增1
	}
}
/*初始化EPSON SED1520 LCD显示-左*/
void Init_LCDL(void){ 
	DisOffL();
	command=0xa4;				//中止或退出休闲状态
   	WRCommandL();
   	command=0xa9;				//占空比为1/32
   	WRCommandL();  
   	command=0xe2;				//软件复位
   	WRCommandL();
   	command=0xa0;				//ADC选择-正向排列
   	WRCommandL(); 
   	CLRDisplayL();
   	BFReadL();
   	DisOnL(); 	      
}
/*初始化EPSON SED1520 LCD显示-右*/
void Init_LCDR(void){ 
	DisOffR();
	command=0xa4;				//中止或退出休闲状态
   	WRCommandR();
   	command=0xa9;				//占空比为1/32
   	WRCommandR();  
   	command=0xe2;				//软件复位	
   	WRCommandR();
   	command=0xa0;				//ADC选择-正向排列
   	WRCommandR(); 
   	CLRDisplayR();
   	BFReadR();
   	DisOnR(); 	      
}
/*显示西文字符-左*/
void DisplayCharL(void){
	command=Row;
	WRCommandL();
	command=PAGEADD;
	WRCommandL();
	for(m=0;m<6;m++)	//6*8点阵 
	{
		data=CTable[i*8+m];
		WRDataL();
	}
}
/*显示西文字符-右*/
void DisplayCharR(void){
	command=Row;
	WRCommandR();
	command=PAGEADD;
	WRCommandR();
	for(m=0;m<6;m++)	//6*8点阵 
	{
		data=CTable[i*8+m];
		WRDataR();
	}
}
/*西文显示演示程序段*/
void DisplayChar(void)
{	
	PAGEADD=0xbb;
	
	for(i=0;i<7;i++)		
		{	
			CLMADD=i*6;		//起始列为第0列
			DisplayCharL();}
	for(i=8;i<16;i++)
		{	
			CLMADD=(i-8)*6;
		 	DisplayCharR();}

}	
/*显示中文字符-左*/
void DisplayChinaL(void){
	command=Row;
	WRCommandL();
	command=PAGEADD;
	WRCommandL();
	i=i*32;
	for (k=0;k<16;k++){
		data=table[i+k];
		WRDataL();
	}
	CLMADD-=16;
	PAGEADD+=1;
	command=PAGEADD;
	WRCommandL();
	for (;k<32;k++){
		data=table[i+k];
		WRDataL();
	}	
}
/*显示中文字符-右*/
void DisplayChinaR(void){
	command=Row;
	WRCommandR();
	command=PAGEADD;
	WRCommandR();
	i=i*32;
	for (k=0;k<16;k++){
		data=table[i+k];
		WRDataR();
	}
	CLMADD-=16;
	PAGEADD+=1;
	command=PAGEADD;
	WRCommandR();
	for (k=0;k<32;k++){
		data=table[i+k];
		WRDataR();
	}
}
/*显示中文字符*/
void DisplayChinese(void){
	   	   	
   	i=0;					//液
   	PAGEADD=0xb8;
   	CLMADD=7;
   	DisplayChinaL();
   	
   	i=1;					//晶
   	PAGEADD=0xb8;
   	CLMADD=30;
   	DisplayChinaL();
   	
   	i=2;					//模
   	PAGEADD=0xb8;
   	CLMADD=3;
   	DisplayChinaR();
   	
   	i=3;					//块
   	PAGEADD=0xb8;
   	CLMADD=26;
   	DisplayChinaR();
}
/*屏幕滚动*/
/*向上滚动*/
void UpScroll(void)
{
	while(1){
		Row=0xc0;
		for(i=0;i<=32;i++){			
			DisplayChinese();
			DisplayChar();
			WaitNms(500);
			Row+=1;		
		}
	}	
}
/*向下滚动*/
void DownScroll(void)
{
	while(1){
		Row=0xdf;
		for(i=0;i<=32;i++){			
			DisplayChinese();
			DisplayChar();
			WaitNms(500);
			Row-=1;		
		}
	}	
}
/*在图形方式下,绘点子程序。该程序在第row(0-31)行、第col(0-99)列绘点,行、列坐标均以点为单位.
该子程序采用读数据操作和读-修改-写功能。在启用读-修改-写和退出读-修改-写的过程中只允许读写
显示数据操作,不能插入其他指令
*/
void DrawDot(int row,int col) 
{	
	int pageaddr,pagelr,data0,bit;
	int bitset=0x01;
	PAGEADD=0xB8;
		
	pageaddr=row/8;				//页面地址
	pagelr=PAGEADD|pageaddr;
	command=pagelr;
	WRCommandL();
	WRCommandR();
	
	bit=(bitset<<(row%8));	
	
	if (col<50)
	{	
		command=col;			//设置列地址
		WRCommandL();
				
		command=0xe0;			//设置读-修改-写
		WRCommandL();
		
		data0=RDDataL();		//空读
		data0=RDDataL();		//读取该处的初始数据
				
		data=(data0|bit);
		WRDataL();
		
		command=0xEE;			//退出读-修改-写
		WRCommandL();
	}
		else
		{
			col-=50;
			command=col;			//设置列地址
			WRCommandR();
				
			command=0xe0;			//设置读-修改-写
			WRCommandR();
		
			data0=RDDataR();		//空读
			data0=RDDataR();		//读取该处的初始数据
				
			data0|=bit;				
			data=data0;
			WRDataR();
		
			command=0xEE;			//退出读-修改-写
			WRCommandR();							
		   }

⌨️ 快捷键说明

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