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

📄 main.c

📁 驱动t6963系列的液晶显示器
💻 C
字号:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int

#define LCD_LENGTH  128 
#define LCD_WIDTH  64

#define Graphic            1
#define TXT            0

#define LCD_DATA  XBYTE[0x0000]
#define LCD_Command  XBYTE[0x0100]         

sbit P10=P1^0;

sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;

/*************************** 是否处于忙态 ************************/

void CheckRW(void)		//指令&数据读写状态,看是否处于忙态
{
	while( (LCD_Command & 0x03) != 0x03) ;
}

void CheckAutoWrite(void)  //数据自动写状态,看是否处于忙态
{
	while( (LCD_Command & 0x08) == 0);	
}

void CheckScreen(void)	  //屏读屏拷贝是否出错
{
	while( LCD_Command & 0x40 );		
}


/********************** 读写数据 ************************/
void WriteData(uchar uData)	//写入
{
	LCD_DATA = uData;	
}

uchar ReadData(void)  //读
{
	uchar uData;
	uData = LCD_DATA;
	return uData;
}

/************************ 设置命令操作 *****************/
void Set_Com(uchar com)
{
	CheckRW();
	LCD_Command = com;
}

void  Set_Com_1(uchar param1,uchar com) 
{
	CheckRW();
	LCD_DATA = 	param1;
	CheckRW();
	LCD_Command = com;
}

void Set_Com_2(uchar param1,uchar param2,uchar com)
{
	CheckRW();
	LCD_DATA = 	param1;
	CheckRW();
	LCD_DATA = 	param2;
	CheckRW();
	LCD_Command = com;	
}

/******************** 延时子程序 **************/

void Delay(uint time)
{
     uchar us,usn;
     while(time!=0)                        //12M Crystal
     { 
           usn = 2;
           while(usn!=0)
           {
                 us=0xf2;
                 while (us!=0){us--;};
                 usn--;
           }
           time--;
     }	
}

/************************* 初使化LCD ****************/ 

void Init_LCD(void)
{
   Set_Com_2(0x00,0x00,0x40);		//设置文本显示区首地址
   Set_Com_2(LCD_LENGTH/8,0x00,0x41);	//设置文本显示区宽度
   Set_Com_2(0x00,0x08,0x42);				//设置图形显示区首地址0x0800	
   Set_Com_2(LCD_WIDTH/4,0x00,0x43);    //设置图形显示区宽度
   Set_Com(0xA7);				//设置光标形状 8x8方块
   Set_Com(0x81);				 //显示方式设置 文本xor图形(异或)	
   Set_Com(0x9C);				 //显示开关设置 文本开,图形开,光标闪烁关		
}

/******************** 清屏操作 *******************************/

void Clear_LCD(uchar FillByte)	//使用FillByte清屏
{
     uint i = 8192;      		
     if(FillByte)      				
     {                  			
           i -= 2*1024;	
           Set_Com_2(0x00,0x08,0x24);      //填充0xff时候要在图形区
     }
     else
           Set_Com_2(0x00,0x00,0x24);
     Set_Com(0xB0);                  				//进入自动写
     while(i--)
     {
           CheckAutoWrite();
           WriteData( FillByte );
     }
     Set_Com(0xB2);  
}

/*********************** 设定显示地址 *****************/
void LocateXY(uchar x,uchar y,uchar mode)		   //0为字符模式,1为图形模式				
{
     uint  temp;
     temp= LCD_LENGTH/8*y + x;
     if(mode)                        //mode=1为Graphic
     {                              //如果图形模式要加上图形区首地址0x0800
           temp+=0x0800;
     }
     Set_Com_2(temp & 0xff,temp/256,0x24);
}

/*********************** 显示字符和字符串 ***************/
void Show_Char(uchar x,uchar y,uchar CharByte)
{
	LocateXY(x,y,TXT);
	Set_Com_1(CharByte,0xC4);	
}

void Show_String(uchar x,uchar y,uchar *str)
{
     while(*str != 0)
     {
           if(x> 29)            //自动换行
           {
                 x=0;
                 y++;
           }
           Show_Char(x,y,*str);
           ++x;
           ++str;
     }	
}

/*********************** 显示点阵函数 ***************/
void DisplayDots(uchar DotByte,uchar n)
{
     uchar i,j;
     LocateXY(0,0,Graphic);
     Set_Com(0xB0);                  //进入自动写
     for(i=0;i<LCD_WIDTH/n;i++)
     {
           for(j=0;j<LCD_LENGTH/8*n;j++)
           {
                 CheckAutoWrite();
                 WriteData(DotByte);
           }
           DotByte=~DotByte;
     }
     Set_Com(0xB2);                  //退出自动写
}
/*********************** 显示汉字函数 ***************/
void DisplayChinese(uchar posx,uchar posy,uchar * Hanzhi)	//在指定位置显示一个汉字
{															//横坐标为0~7,纵坐标为0~3(以一个汉字为单位)
	 uchar i;
     unsigned int start;
     start = posy*16*16 + posx*2 + 0x0800;
     for(i=0;i<16;i++)
     {
           Set_Com_2(start & 0xff,start/256,0x24);
           Set_Com_1(Hanzhi[2*i],0xc0);
     	   Set_Com_1(Hanzhi[2*i+1],0xc4);
           start += 16;
     }     
}
/*********************** 显示图片函数 ***************/
void DisplayPicture(uchar posx,uchar posy,uchar size_x,uchar size_y,uchar *pic)
{														//横坐标为0~15,纵坐标为0~7
	 uchar i,j;
     uint start;
     uint width = size_x/8;
     start = posy*16*16 + posx*2 + 0x0800;	
     for(i=0;i<size_y;i++)
     {
     	Set_Com_2(start & 0xff,start/256,0x24);
     	for(j=0;j<width-1;j++)
     	{
     		Set_Com_1(pic[width*i + j],0xc0);		
     	}
     	Set_Com_1(pic[width*i+j],0xc4);
     	start += 16;	
     }
}

/*--------------------------------------------------------------------------------*/
uchar code str1[]= {    //"ShenZhen_SunSon_Electronic_INC";//因为6963字符库非规则的
0x33,0x48,0x45,0x4E,0x3A,0x48,0x45,0x4E,0x3F,0x33,0x55,0x4E,0x33,0x4F,0x4E,
//S  h    e    n    Z    h    e    n    _    S    u    n    S    o    n
0x3F,0x25,0x4C,0x45,0x43,0x54,0x52,0x4f,0x4E,0x49,0x43,0x3F,0x29,0x2E,0x23,0x00
//_  E    l    e    c    t    r    o    n    i    c    _    I    N    C    /0
};

uchar code guo[32] = {
0x00,0x00,0x30,0x00,0x1B,0xFC,0x0B,0xFC,0x01,0x8C,0x71,0x88,0x31,0x98,0x00,0x98,0x00,0xD0,0x30,0xF0,0x30,0x60,0x30,0xF0,0x21,0x98,0x67,0x0F,0x24,0x06,0x00,0x00
};

uchar code picture[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x7F,0xFE,0x00,
0x01,0xE0,0x0F,0x00,0x03,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xE0,
0x0F,0xFF,0xFF,0xF0,0x1F,0xFE,0xFF,0xF0,0x1F,0xFE,0xFF,0xF8,0x3F,0xFE,0xEF,0xF8,
0x3F,0xFF,0xDF,0xF8,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xF7,0xFF,0xFC,0x3F,0xEE,0xFF,0xF8,
0x1F,0xFE,0xFF,0xF8,0x1F,0xFE,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,
0x07,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x00,
0x00,0x3F,0xFC,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

void main()
{
	P10 = 0;
	Delay(60);
	P10 = 1;
	Init_LCD();			//准备
	Clear_LCD(0);		//开始
	
//	DisplayChinese(0,1,guo);
//	DisplayPicture(1,1,32,32,picture);
    Show_String(0,0,str1);  //显示一屏字符串
    while(1) {}		
}

⌨️ 快捷键说明

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