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

📄 lcd.c

📁 【液晶显示器的C语言程序设计 Freescale 8位微控制器】一书的光盘
💻 C
字号:
//SED1565 ljj
//PTC0-WR,PTC1-RD,PTC2-A0
//PTD1-LEDRED,PTD2-LEDGREEN,PTD3-LEDBLUE

#include "gp32.h"
#include "display.h"
#define cli() _asm("cli\n")	 /*开中断*/
#define sei() _asm("sei\n")	 /*关中断*/
#define nop() _asm("nop\n")	 /*空操作*/
typedef struct bits {   //为PTC口位操作定义的结构体
	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 CLML,//列地址低位
              PAGEADD,//页地址
              CLMH,//列地址高位
              command,//命令
              data;//数据            
/*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();
}
/*读取BF的值,判断控制器当前是否可以接收MCU发来的数据。*/
void BFRead(void){
	unsigned char temp;
		BSET(PTC,0); 		     //WR=1
		BCLR(PTC,2);		     //A0=0
		DDRB=0x00;
	while(1){
		BCLR(PTC,1);		     //RD=0
		temp=PTB;		
		BSET(PTC,1);		     //RD=1
		if ((temp&0x80)==0) break;   //BF为第7位,BF=0显示存储器空闲
	}
}

/*写指令代码*/
void WRCommand(unsigned char command){		
	BFRead();
	DDRB=0xFF;		//B口设为输出
	BSET(PTC,1);		//RD=1
	BCLR(PTC,2);		//A0=0;
	BCLR(PTC,0);		//WR=0
	PTB=command;		//B口为要执行的命令
	BSET(PTC,0);		//给WR上升沿,将命令送入LCD		
}	
/*写显示数据*/
void WRData(unsigned char data){
	BFRead();
	DDRB=0xFF;
	BSET(PTC,1);		//RD=1
	BSET(PTC,2);		//A0=1
	BCLR(PTC,0);		//WR=0
	PTB=data;						
	BSET(PTC,0);		//给WR上升沿,将命令送入LCD	
}
/*清显示RAM数据*/
void ClearRAM(void){
	unsigned char i,j;
	PAGEADD=0xB0;		//%1011××××为起始页地址设置命令,此处设为0页
	WRCommand(PAGEADD);	//送出命令
	WRCommand(0x40);	//%01××××××为起始行设置命令,此处设为0行
	WRCommand(0x10);	//%0001××××为起始列地址高位设置命令,此处列地址高位为0
	WRCommand(0x00);	//%0000××××为起始列地址低位设置命令,此处列地址低位为0
				//初始为0页,0行,0列
	for(j=0;j<8;j++){	//1565将屏幕分为8页
	  WRCommand(PAGEADD);
		WRCommand(0x10);
		WRCommand(0x00);
		for(i=0;i<128;i++){//1565将屏幕分为128列
			WRData(0x00);//清除屏幕显示
		}
		PAGEADD++;	//页地址加"1"
	}
	WaitNms(100);		//延时
}
/*西文显示程序*/
void DisplayChar(unsigned char CharNum){
	unsigned char i,j;
	WRCommand(PAGEADD);		//显示页地址
	WRCommand(CLMH);		
	WRCommand(CLML);		//显示列地址
					//1565只要给出页地址和列地址就可以确定显示的位置
	for(i=0;i<CharNum;i++){
		for(j=0;j<6;j++){	//6*8点阵 
			WRData(CTable[i*8+j]);
		}
	}	
}
/*西文显示演示程序段*/
//第7页,第24列开始显示16个西文字符
void DisplayCharTest(void){		
	PAGEADD=0xB7;		
	CLMH=0x11;
	CLML=0x08;
	DisplayChar(16);	
}
/*西文显示滚动测试*/
void DisplayCharScroll(void){	
	unsigned char i;
	//0页到3页向下滚动显示西文字符		
	for(i=0;i<4;i++){
		ClearRAM();
		PAGEADD=PAGEADDTab[i];
		CLMH=0x10;
		CLML=0x0F;
		DisplayChar(16);
		WaitNms(1000);
	}
	//7页到4页向上滚动显示西文字符
	for(i=0;i<4;i++){
		ClearRAM();
		PAGEADD=PAGEADDTab[7-i];
		CLMH=0x10;
		CLML=0x0F;
		DisplayChar(16);
		WaitNms(1000);
	}
}
/*中文显示程序*/
void DisplayChinese(unsigned char WordNum){
	unsigned char i,j;
	WRCommand(PAGEADD);		//显示页地址
	WRCommand(CLMH);
	WRCommand(CLML);		//显示列地址
					//1565只要给出页地址和列地址就可以确定显示的位置
	//2页16列显示一个16×16汉字
	for(i=0;i<2;i++){		
		WRCommand(PAGEADD);
		WRCommand(CLMH);
		WRCommand(CLML);
		for(j=0;j<16;j++){	//16*16点阵汉字
			WRData(table[i*16+j+WordNum*32]);
		}
		PAGEADD++;
	}	
}
/*中文显示演示程序段*/
//0页0列开始显示汉字
void DisplayChineseTest(void){		
	unsigned char i;
	for(i=0;i<4;i++){
		PAGEADD=PAGEADDTab[i*2];
		CLMH=0x10;
		CLML=0x00;
		DisplayChinese(i);
	}
		
}
/*中文显示滚动*/
void DisplayChineseScroll(void){	
	
	unsigned char i,j;
	//0列开始,每次右移2列滚动显示汉字
	for(i=0;i<4;i++){
		ClearRAM();
		for(j=0;j<4;j++){
			PAGEADD=PAGEADDTab[j*2];
			CLMH=0x10;
			CLML=0x00+i*2;
			DisplayChinese(j);
		}		
		WaitNms(300);
	}
	//116列开始,每次左移1个汉字的位置(16列)滚动显示汉字
	for(i=0;i<4;i++){
		ClearRAM();
		for(j=0;j<4;j++){
			PAGEADD=PAGEADDTab[j*2];
			CLMH=0x17-i;
			CLML=0x00;
			DisplayChinese(j);
		}		
		WaitNms(1000);
	}
	
}
/*显示图象*/					
void DisplayPicture(unsigned char PicNum){
	unsigned char i,j;
	WRCommand(PAGEADD);	//显示页地址
	WRCommand(CLMH);
	WRCommand(CLML);	//显示列地址
				//1565只要给出页地址和列地址就可以确定显示的位置
	//显示自定义的一幅图象,按照图象的实际大小自定义的算法
	for(i=0;i<7;i++){
		for(j=0;j<8;j++){
			WRData(PictureTable[i*8+j+PicNum*56]);
		}
	}		
}

/*显示图象测试*/
void DisplayPictureTest(void){
	unsigned char i;
	ClearRAM();
	for(i=0;i<7;i++){
		PAGEADD=PAGEADDTab[i];
		CLMH=0x13;
		CLML=0x00;
		DisplayPicture(i);
	}	
}
/*显示颜色*/
void Back_Color(unsigned char i){
	DDRD=0xFF;
	PTD=BackColor[i];
}
/*初始化EPSON SED1565 */
void INIT_1565(void){ 
	unsigned char i;
	for(i=0;i<11;i++){				
   		WRCommand(InitCommandTab[i]);//按照1565的要求顺序送出初始化命令
   	}				
   	WaitNms(200);	      
} 
/*8*16点阵字符显示算法*/			
void Display_Init(unsigned char InfNum,unsigned char LineNum )
{
	unsigned char i,j;
	WRCommand(PAGEADD);	//显示页地址
	WRCommand(CLMH);
	WRCommand(CLML);	//显示列地址
				//1565只要给出页地址和列地址就可以确定显示的位置
	for(i=0;i<2;i++){	
		WRCommand(PAGEADD);
		WRCommand(CLMH);
		WRCommand(CLML);
		for(j=0;j<8;j++){	//8*16点阵汉字
			WRData(InitInfTab[i*8+j+InfNum*16+LineNum*224]);			
		}
		PAGEADD++;
	}
}
/*显示初始化信息测试*/
//初始显示  F1:中文显示    F2:西文显示	    
//  	    F3:图形显示    F4:全部显示(8*16)
//          1~8:背景颜色(16*16) 
void Display_InitTest(void)
{
	unsigned char i,j;
	ClearRAM();
	//F1:中文显示    F2:西文显示	    
	//F3:图形显示    F4:全部显示(8*16)
	for(i=0;i<2;i++){
		for(j=0;j<14;j++){
			PAGEADD=PAGEADDTab[i*2];				
			CLMH=0x10+j/2;
			CLML=0x00+j%2*8;										
			Display_Init(j,i);
		}
	}
	//1~8:背景颜色	
	for(i=0;i<8;i++){
		PAGEADD=PAGEADDTab[4];
		CLMH=0x10+i;
		CLML=0x00;
		DisplayChinese(i+4);
	}
		
}

⌨️ 快捷键说明

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