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

📄 lcd6963.c

📁 6963控制其的液晶测试程序
💻 C
字号:
#include<stdio.h>
#include<intrins.h>     
#include <reg51.h>
#include <math.h>
#include <absacc.h>
#include <string.h>
 
 
       //内部函数
#define cli() _asm("cli\n")
/* disable interrupts*/
#define sei() _asm("sei\n")
#define nop() _asm("nop\n")

/*数据类型定义部分*/
#define uint  unsigned int
#define uchar unsigned char
#define Uint  unsigned int
#define Uchar unsigned char

#define rdcommand    XBYTE[0x0ff00]     
#define rdshuju      XBYTE[0x0fe00] 
#define command      DBYTE[0x30]
#define shuju1       DBYTE[0x31]
#define shuju2       DBYTE[0x32]
#define shuju        DBYTE[0x33]  

uchar data temp;
uint  data i,k;
uint  data start=0x0800;

sbit    p1_2=P1^2;
sbit    ret=P1^0;     
sbit    fs=P1^1;  

uint  data ELength=21;
uchar code ETable[21]={0x37,0x25,0x2c,0x23,0x2f,0x2d,0x25,0X00,0x34,0x2f,0X00,//"WELCOME TO "
		       0x35,0x33,0x25,0x00,0x34,0x16,0x19,0x16,0x13,0x23};//"USE T6963C"

uint  data CCLength=352;
uchar code EXPRT1[22]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,0xa0,0xa2,0xa4,0xa6,0xa8,0xaa};
uchar code EXPRT2[22]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0x93,0x95,0x97,0x99,0x9b,0x9d,0x9f,0xa1,0xa3,0xa5,0xa7,0xa9,0xab};					
uchar code CCTable[352]={
	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,//制
	};
Uint data ptr[]={10,12,20,35,40,15,18,50};
/*延迟1ms*/
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();
}
/*读状态位0和1 */
void ST01Read(void){
	while(1){	
		temp=rdcommand;	
		if ((temp&0x03)==0x03)  break;  /*判断指令、数据读写状态是否准备好*/
	}
}
/*读状态位3 */
void ST3Read(void){
			P0=0x00;
	while(1){	
			temp=rdcommand;
		if ((temp&0x08)==0x08)  break; 	//判断数据自动写状态是否准备好
	}
}
/*写数据*/
void WRshuju(Uchar shuju){
    rdshuju=shuju;
}	
/*写命令*/
void WRCommand(Uchar command){
    rdcommand=command;
}
/*无参数指令*/	
void WRCommandOne(void){
	ST01Read();          //读状态位0和1
	WRCommand(command);	/*写命令*/
}
/*单参数指令*/
void WRCommandTwo(void){
	ST01Read();
	WRshuju(shuju2);		/*写数据*/
	ST01Read();
	WRCommand(command);	/*写命令*/
}
/*双参数指令*/
void WRCommandMany(void){
	ST01Read();
	WRshuju(shuju1);		/*写数据*/
	ST01Read();
	WRshuju(shuju2);		/*写数据*/
	ST01Read();		
	WRCommand(command);	/*写命令*/
}
/*初始化T6963 LCD 显示.*/
void Init_LCD_Graphic(void){
	/*设置文本显示首地址*/ 
	shuju1=0x00;
	shuju2=0x00;
	command=0x40;
	WRCommandMany();
	
	/*设置文本显示区宽度*/
	shuju1=0x28;		/*40字节*/
	shuju2=0x00;
	command=0x41;
	WRCommandMany();
	
	/*设置图形显示区首地址*/
	shuju1=0x00;
	shuju2=0x08;		/*首地址0x0800*/
	command=0x42;
	WRCommandMany();
	
	/*设置图形显示区宽度*/
	shuju1=0x28;		/*40字节*/
	shuju2=0x00;
	command=0x43;
	WRCommandMany();
		
	/*设置显示方式*/	
	command=0x80;		/*启用内部字符发生器,显示方式是文本与图形逻辑或*/
	WRCommandOne();
	
	/*设置显示状态*/	
	command=0x9f;		/*启用光标闪烁、光标显示、文本显示、图形显示*/
	WRCommandOne();
   
}
/*清显示RAM*/
void ClrGraphic(void){
	/*设置显示地址*/
	shuju1=0x00;		/*低字节*/
	shuju2=0x00;		/*高字节*/ 
	command=0x24;		
	WRCommandMany();
	
	/*进入自动写方式*/
	command=0xb0;
	WRCommandOne();	
	/*清8KRAM*/ 	
	shuju1=0x00;
   	for(i=0;i<0x2000;i++){
   		ST3Read();
   		WRshuju(shuju1);
   	}   	
   	/*退出自动写方式*/
   	command=0xb2;
	WRCommandOne();
}
void TextDisplay(void){
	/*设置显示地址*/
	shuju1=84;	//在第3行第4列显示文本字符
	shuju2=0x00; 
	command=0x24;
	WRCommandMany();	
	/*进入自动写方式*/
	command=0xb0;
	WRCommandOne();	
	/*“WELCOME”*/	    
	for (k=0;k<ELength;k++){
		ST3Read();
		shuju1=ETable[k];
		WRshuju(shuju1);
	}	
	/*退出自动写方式*/
	command=0xb2;
	WRCommandOne();
}
/*建立CGRAM*/
void SETCGRAM(void){
	/*设置CGRAM偏移地址*/
	shuju1=0x03;		/*首地址为0x1c00*/
	shuju2=0x00;
	command=0x22;
	WRCommandMany();
	
	/*设置显示地址*/
	shuju1=0x00;
	shuju2=0x1c;		/*0x1c00*/
	command=0x24;
	WRCommandMany();
	
	/*进入自动写方式*/
	command=0xb0;
	WRCommandOne(); 
	
	/*写“摩托罗拉单片机间接控制”*/
	for (k=0;k<CCLength;k++){
		ST3Read();
		shuju1=CCTable[k];
		WRshuju(shuju1);
	}
	
	/*退出自动写方式*/
	command=0xb2;
	WRCommandOne();
}	
/*文本方式下显示汉字*/
void CCDisplay(Uchar row,Uchar col){
	
	Uint cursor,tempaddress;
	SETCGRAM();
	cursor=row*40+col;
	tempaddress=cursor;
	/*设置显示地址*/
	shuju1=tempaddress&0x00ff;
	shuju2=cursor&0xff00;	
	command=0x24;
	WRCommandMany();	
		
	command=0xb0;			/*进入自动写方式*/
	WRCommandOne();		
	for (k=0;k<22;k++){
		ST3Read();
		shuju1=EXPRT1[k];
		WRshuju(shuju1);		
		}		
	command=0xb2;			/*退出自动写方式*/
	WRCommandOne();
		
	row+=1;
	cursor=row*40+col;
	tempaddress=cursor;
	/*设置显示地址*/
	shuju1=tempaddress&0x00ff;
	shuju2=cursor&0xff00;	
	command=0x24;
	WRCommandMany();	
		
	/*进入自动写方式*/
	command=0xb0;
	WRCommandOne();		
	for (k=0;k<22;k++){
		ST3Read();
		shuju1=EXPRT2[k];
		WRshuju(shuju1);
	}
	/*退出自动写方式*/
	command=0xb2;
	WRCommandOne();	
	}
/*在图形方式下显示汉字*/	
void GCDisplay(Uint row,Uint col){	//row(0~127)col(0~29)
	Uint cursor,tempaddress;
	Uint temprow,tempcol;
	
	for(i=0;i<11;i++)				/*11个汉字*/
	{	
		tempcol=col+i*2;		
		for(k=0;k<16;k++)			
		{
		temprow=row+k;			
		cursor=0x0800+temprow*40+tempcol;
		tempaddress=cursor;
		shuju1=tempaddress&0x00ff;		 /*设置显示地址*/
		shuju2=(cursor&0xff00)>>8;		
		command=0x24;
		WRCommandMany();
		
		shuju2=CCTable[i*32+k];
		command=0xc0;					/*设置一次写数据,地址加一*/
		WRCommandTwo();
				
		shuju2=CCTable[i*32+k+16];
		WRCommandTwo();		
		}
		WaitNms(50);				
	}
	WaitNms(50);
}

/*滚动显示-向右*/
void RightScroll(void)
{
	Uint Num,cursor0,tempaddr;	
	while(1){
	for(Num=0;Num<30;Num++)	{
		 
		cursor0=start-Num;/*修改文本或图形显示区首地址*/
		tempaddr=cursor0;
		shuju1=tempaddr&0x00ff;
		shuju2=cursor0&0xff00;		
		command=0x40;
		WRCommandMany();
		GCDisplay(1,3);
		TextDisplay();			//""
		CCDisplay(1,3);
		WaitNms(500);				
		}
	}
}

/*滚动显示—向下*/
void DownScroll(void)
{
	Uint Num,cursor0,tempaddr;
	while(1){
		for(Num=0;Num<16;Num++){
		
			cursor0=start-Num*40;	/*设置文本显示首地址*/
			tempaddr=cursor0;
 
			shuju1=tempaddr&0x00ff;
			shuju2=cursor0&0xff00;
			command=0x40;
			WRCommandMany();
		
			TextDisplay();			//""
			WaitNms(500);
			}
		}
}
main()
{        p1_2=1;
	     fs=0;		//FS=0,8×8字体
         ret=0;	
	     WaitNms(1000);
         ret=1;	
         p1_2=0;	
   	     Init_LCD_Graphic();	//初始化屏幕
   	     ClrGraphic();		//清屏
	    // TextDisplay();		//文本显示
       	// GCDisplay(40,4);		
         for(;;);

}

⌨️ 快捷键说明

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