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

📄 lcd.c

📁 【液晶显示器的C语言程序设计 Freescale 8位微控制器】一书的光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
//控制器:SED1335
//LCD:大连东显EDM320240
//设计者:李晶皎
//MCU:MC68HC908GP32
//接口:PTC0-A0,PTC1-WR,PTC2-RD,PTB-DB

#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 command,data;
unsigned int i,k;
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 unsigned char SysTab[8]={0x32,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
const unsigned char ScrTab[10]={0x00,0x00,0xf0,0x00,0x28,0xf0,0x00,0x50,0x00,0x00};
const char displaystring[19]={"WELCOME USE SED1335"};

const unsigned char EXPRT[44]={
	0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,
	0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0x93,0x95,0x97,0x99,0x9b,0x9d,0x9f,0xe1,0xe3,0xe5,0xe7,0xe9,0xeb,};
const CLength=352;			//11*32
const unsigned char CTable[]={	
	0x01,0x3F,0x24,0x3F,0x26,0x2D,0x34,0x25,0x2F,0x20,0x2F,0x20,0x5F,0x40,0x82,0x01,
	0x00,0xFE,0x20,0xFC,0x30,0x68,0xA6,0x20,0xF8,0x80,0xFC,0x80,0xFE,0x80,0x80,0x00,//摩
	0x20,0x20,0x23,0xF8,0x20,0x20,0x28,0x37,0xE0,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,
	0x00,0x3C,0xC0,0x40,0x40,0x40,0x40,0xFE,0x40,0x40,0x40,0x40,0x42,0x42,0x3E,0x00,//托
	0x00,0x3F,0x22,0x22,0x22,0x3F,0x22,0x03,0x06,0x0C,0x12,0x61,0x00,0x03,0x0C,0xF0,
	0x00,0xFC,0x44,0x44,0x44,0xFC,0x00,0xFC,0x08,0x08,0x10,0x20,0xC0,0x00,0x00,0x00,//罗
	0x10,0x10,0x10,0x11,0xFC,0x10,0x15,0x18,0x30,0xD0,0x10,0x10,0x10,0x17,0x50,0x20,
	0x80,0x60,0x20,0xFE,0x00,0x08,0x0C,0x88,0x88,0x48,0x50,0x50,0x50,0xFE,0x00,0x00,//拉
	0x08,0x06,0x04,0x3F,0x21,0x3F,0x21,0x21,0x3F,0x21,0x01,0xFF,0x01,0x01,0x01,0x01,
	0x20,0x30,0x40,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x08,0x00,0xFE,0x00,0x00,0x00,0x00,//单
	0x00,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x20,0x20,0x40,0x80,
	0x40,0x40,0x40,0x44,0xFE,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,//片
	0x10,0x10,0x10,0xFE,0x10,0x10,0x38,0x34,0x54,0x50,0x91,0x11,0x12,0x12,0x14,0x10,
	0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x08,0x0A,0x0A,0x0A,0x06,0x00,//机
	0x20,0x13,0x10,0x40,0x47,0x44,0x44,0x47,0x44,0x44,0x47,0x40,0x40,0x40,0x40,0x40,
	0x00,0xFC,0x04,0x04,0xE4,0x24,0x24,0xE4,0x24,0x24,0xE4,0x04,0x04,0x04,0x14,0x08,//间
	0x10,0x10,0x13,0xFD,0x10,0x17,0x14,0x18,0x30,0xDF,0x11,0x13,0x10,0x10,0x51,0x26,
	0x40,0x20,0xFC,0x08,0x90,0xFE,0x00,0x80,0x80,0xFE,0x10,0x10,0xE0,0x50,0x8C,0x04,//接
	0x10,0x10,0x10,0xFD,0x11,0x10,0x14,0x19,0x30,0xD1,0x10,0x10,0x10,0x10,0x53,0x20,
	0x00,0x20,0x10,0xFE,0x04,0x50,0x8C,0x04,0x00,0xFC,0x20,0x20,0x20,0x20,0xFE,0x00,//控
	0x24,0x34,0x24,0x3F,0x44,0x04,0x7F,0x04,0x3F,0x24,0x24,0x24,0x24,0x27,0x05,0x04,
	0x04,0x04,0x24,0xA4,0x24,0x24,0xA4,0x24,0xA4,0xA4,0xA4,0xA4,0x84,0x84,0x14,0x08,//制
};
const int cnt=8;
const int ptr[8]={10,15,20,25,30,35,40,45};
/*等待1s子程序*/
static void Wait1ms(void) {
  int cnt = 0;
  while (cnt <80) cnt++;
}
/*等待n ms子程序*/ 
void WaitNms(int n){
   int i;
   for(i=1;i<=n;i++) Wait1ms();
}
/* read state bit */
void BFRead(void){
	unsigned char temp;
		BSET(PTC,1); 			//WR=1
	while(1){
		DDRB=0x00;
		BCLR(PTC,0);			//A0=0
		BCLR(PTC,2);			//RD=0
		temp=PTB;		
		BSET(PTC,2);			//RD=1
		if ((temp&0x40)==0) break;  //BF为第6位,BF=0显示存储器空闲
	}
}

/*write Command */
void WRCommand(unsigned command){
	DDRB=0xff;
	BSET(PTC,2);				//RD=1
	PTB=command;
	BSET(PTC,0);				//A0=1
	BCLR(PTC,1);				//WR=0
	BSET(PTC,1);				//WR=1
}

/* write data */
void WRData(unsigned char data){
	DDRB=0xff;
	BSET(PTC,2);
	PTB=data;
	BCLR(PTC,0);				//A0=0
	BCLR(PTC,1);				//WR=0
	BSET(PTC,1);				//WR=1
}
/*读参数和显示数据*/
unsigned char RDData(void){
	unsigned char temp;
	DDRB=0x00;
	BSET(PTC,0);				//A0=1
	BCLR(PTC,2);				//RD=0
	temp=PTB;		
	BSET(PTC,2);				//RD=1
	return(temp);
	
}	
/* open dispaly */
void DisOn(void){
	WRCommand(0x59);  					
   	WRData(0x54);//画面显示但不闪烁 光标显示关闭
}

/* Off dispaly */
void DisOff(void){
	WRCommand(0x58);
   	WRData(0x56);
}
/*清显示RAM*/
void CLRDisplay(void){
	WRCommand(0x4c);				//光标右移   	 
   	
   	WRCommand(0x46);				//设置光标指针0x0000   	
   	WRData(0x00);
   	WRData(0x00);
   	
   	WRCommand(0x42);				//设置数据写入
    for(i=0;i<65000;i++){
   		WRData(0x00);
   	}
}
/* Initialisation of the EPSON SED1335 LCD display.
SysTab[8]={0x30,0x87,0x07,0x27,0x31,0xf0,0x28,0x00};
ScrTab[10]={0x00,0x00,0xf0,0x00,0x28,0xf0,0x00,0x50,0x00,0x00};*/
void Init_LCD(void){ 
	
   	WRCommand(0x40);			//设置SYSTEM SET参数
   	for(i=0;i<8;i++){
   		WRData(SysTab[i]);
   	}
  
   	WRCommand(0x44);			//设置SYSTEM SET Scroll参数
   	for(i=0;i<10;i++){
   		WRData(ScrTab[i]);
   	}	
			
   	WRCommand(0x5b);  			//设置显示合成方式
   	WRData(0x00);
   	
   	CLRDisplay();   	
   	DisOn(); 	      
}

/* 显示西文字符*/
void DisplayChar(void){
   			
   	WRCommand(0x5d);   //CSRFORM代码		
   	WRData(0x07);	//设置光标水平点为CSX=8
   	WRData(0x87);   //设置光标为块状形式,CSY=8	
		
   	WRCommand(0x5b);  		//设置显示合成方式,OVLAY代码
   	WRData(0x01);   	//显示一、三区为文本方式
			
	WRCommand(0x59);		//设置显示状态开
				
   	WRData(0x54);   		//画面显示但不闪烁 光标显示关闭
				
   	WRCommand(0x46);   		//设置光标指针0x0000-第一显示区,CSRW代码
   	WRData(0x0b);
   	WRData(0x00);  		
	
	WRCommand(0x4c);		//光标右移,CSRDIR代码	
		
	WRCommand(0x42);		//设置数据写入,MWRITE代码	
	for (k=0;k<19;k++){
		WRData(displaystring[k]);
	}
}
/*文本方式下显示汉字*/
/*建立CGRAM*/
void SetCGRAM(void){
//	unsigned int cursor;

	WRCommand(0x5c);				//设置CGRAM首地址
	WRData(0x00);					//首地址为0xc000
	WRData(0xc0);	
//	cursor=0xc000+0x80*8;	
	
	WRCommand(0x46);				//设置光标指针
	WRData(0x00);					//首地址为0xc000-代码0x80
	WRData(0xc4);
		
	WRCommand(0x4c);				//光标右移		
	WRCommand(0x42);				//设置数据写入
	
	for(i=0;i<CLength;i++){		
		WRData(CTable[i]);
	}	
}
/*文本方式下显示汉字*/
void CCDisplay(unsigned char row,unsigned char col){//row(0~29),col(0~39)
	unsigned int cursor,tempaddress,addl,addh;
	SetCGRAM();
	WRCommand(0x4c);				//光标右移
	
	cursor=0x0000+row*40+col;		//第一显示区
	tempaddress=cursor;
	addl=tempaddress&0x00ff;
	addh=((cursor&0xff00)>>8);	
	WRCommand(0x46);				//设置光标指针
	WRData(addl);
	WRData(addh);
		
	WRCommand(0x42);	
	for (k=0;k<22;k++){		
		WRData(EXPRT[k]);		
	}
			
	row+=1;
	cursor=0x0000+row*40+col;
	tempaddress=cursor;
	addl=tempaddress&0x00ff;
	addh=((cursor&0xff00)>>8);
	WRCommand(0x46);				//设置光标指针
	WRData(addl);
	WRData(addh);
	
	WRCommand(0x42);	
	for (k=22;k<44;k++){
		WRData(EXPRT[k]);		
	}	
}

/*图形方式下显示汉字*/
void GCDisplay(unsigned int row,unsigned int col){	//row(0~319)col(0~29)
	unsigned int cursor,tempaddress;
	unsigned int temprow,tempcol;
	unsigned char addl,addh;
	
	WRCommand(0x4f);				//光标下移
	
	for(i=0;i<11;i++)				/*11个汉字*/
	{	
		tempcol=col+i*2;		
		for(k=0;k<16;k++)			
		{
		temprow=row+k;			
		cursor=0x2800+temprow*40+tempcol;//加上显示二区的起始地址
		tempaddress=cursor;
		addl=tempaddress&0x00ff;
		addh=((cursor&0xff00)>>8);
				
		WRCommand(0x46);				//设置光标指针
		WRData(addl);
		WRData(addh);
		
		WRCommand(0x42);
		WRData(CTable[i*32+k]);					
		}
		
		for(k=0;k<16;k++)			
		{
		temprow=row+k;			
		cursor=0x2800+temprow*40+tempcol+1;//加上显示二区的起始地址
		tempaddress=cursor;
		addl=tempaddress&0x00ff;
		addh=((cursor&0xff00)>>8);
				
		WRCommand(0x46);				//设置光标指针
		WRData(addl);
		WRData(addh);
		
		WRCommand(0x42);
		WRData(CTable[i*32+k+16]);							
		}
	}
}
/*滚动演示程序—————左右上下*/
/*第一显示区向左滚动显示子程序*/
void LeftScroll(void){
	unsigned char l=0;
	char addrl,addrh;
	char addr=0,tempaddr;
	CCDisplay(5,5);
	while(1){		
		while(l<8){
			WRCommand(0x5a);				//设置点位移
			WRData(l);
			l+=1;
			WaitNms(500);		
			}		
		
		addr+=1;
		tempaddr=addr;
		addrl=(tempaddr&0x00ff);
		addrh=((addr&0xff00)>>8);		
		WRCommand(0x44);					//设置显示域		
		WRData(addrl);
		WRData(addrh);
		
		l=0;
		WRCommand(0x5a);					//设置点位移		
		WRData(l);		
	}	
}
/*第二显示区向右滚动显示子程序*/
void RightScroll(void){
	unsigned char l=7;
	unsigned char addrl,addrh;
	unsigned char addr=0x2800,tempaddr;
	GCDisplay(50,10);
	while(1){
		while(l>=0){
			WRCommand(0x5a);				//设置点位移
			WRData(l);
			l-=1;
			WaitNms(500);		
		}		
		
		addr-=1;
		tempaddr=addr;
		addrl=(tempaddr&0x00ff);
		addrh=((addr&0xff00)>>8);
		WRCommand(0x44);					//设置显示域		
		WRData(addrl);
		WRData(addrh);
		
		l=7;	
		WRCommand(0x5a);					//恢复HDOT SET		
		WRData(l);
			
	}	
}
/*第一显示区向下滚动显示子程序
文本方式下上下滚动以字符为单位*/
void DownScroll(void){
	unsigned char addr,tempaddr;
	unsigned char addrl,addrh;
	unsigned char AP=0x0028;
	CCDisplay(5,5);
	while(1){
		addr=0x0000;
		while(addr<1200){
			addr+=AP;
			tempaddr=addr;
			addrl=(tempaddr&0x00ff);
			addrh=((addr&0xff00)>>8);
			
			WRCommand(0x44);		
			WRData(addrl);
			WRData(addrh);
			WaitNms(500);
		}
	}		
}
/*第二显示区向上滚动显示子程序*/
void UpScroll(void){
	unsigned char addr,tempaddr;
	unsigned char addrl,addrh;
	unsigned char AP=0x0028;
	GCDisplay(50,10);
	while(1){
		addr=0x2800;
		while(addr>320){
			addr-=320;
			tempaddr=addr;
			addrl=(tempaddr&0x00ff);
			addrh=((addr&0xff00)>>8);
			
			WRCommand(0x44);		
			WRData(addrl);
			WRData(addrh);
			WaitNms(500);
		}
	}		
}
/*在图形方式下,绘点子程序*/
void DrawDot(int row,int col) 	/*行坐标以点为单位,列坐标以点为单位*/
{	
	int addr,tempaddr,addrl,addrh;
	int bitset=0x01;
	unsigned char data0;			
	/*设置显示地址*/
	addr=0x2800+row*0x28+col/8;
	tempaddr=addr;
	addrl=tempaddr&0x00ff;
	addrh=((addr&0xff00)>>8);
	
	WRCommand(0x46);				//设置光标地址
	WRData(addrl);
	WRData(addrh);

	WRCommand(0x43);				//读取该位置的原始数据
	data0=RDData();
	

⌨️ 快捷键说明

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