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

📄 lcd.c

📁 LCD12864
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>

#include "lcd.h"
#include "font.h"

sbit LCD_WR =P3^5;  //Data Write into T6963C,L有效
sbit LCD_RD =P3^6;  //Data Read from T6963C,L有效
sbit LCD_CE =P3^4;  //使能信号,L有效
sbit LCD_CD =P3^7;  //当wr=L,LCD_CD=H:写命令,LCD_CD=L:写数据;当rd=L,LCD_CD=H:读状态,LCD_CD=L:读数据
sbit LCD_RST=P3^3;  //Lcm reset,低有效
sbit LCD_FS =P3^2;  //字体选择,H:6*8点阵;L:8*8点阵

sbit bf0 = P1^0;
sbit bf1 = P1^1;
sbit bf3 = P1^3;

uchar code HexTable[]="0123456789ABCEDF";

uchar code Num_Tab[]=
{
	/* 48 0x30 '0' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x4c, /* 0 00  00 */
	0x54, /* 0 0 0 00 */
	0x64, /* 0  00 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 49 0x31 '1' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x08, /* 0000 000 */
	0x18, /* 000  000 */
	0x08, /* 0000 000 */
	0x08, /* 0000 000 */
	0x08, /* 0000 000 */
	0x08, /* 0000 000 */
	0x1c, /* 000   00 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 50 0x32 '2' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x04, /* 00000 00 */
	0x08, /* 0000 000 */
	0x10, /* 000 0000 */
	0x20, /* 00 00000 */
	0x7c, /* 0     00 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 51 0x33 '3' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x04, /* 00000 00 */
	0x18, /* 000  000 */
	0x04, /* 00000 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 52 0x34 '4' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x08, /* 0000 000 */
	0x18, /* 000  000 */
	0x28, /* 00 0 000 */
	0x48, /* 0 00 000 */
	0x7c, /* 0     00 */
	0x08, /* 0000 000 */
	0x1c, /* 000   00 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 53 0x35 '5' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 0     00 */
	0x40, /* 0 000000 */
	0x78, /* 0    000 */
	0x04, /* 00000 00 */
	0x04, /* 00000 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 54 0x36 '6' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x40, /* 0 000000 */
	0x78, /* 0    000 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 55 0x37 '7' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7c, /* 0     00 */
	0x04, /* 00000 00 */
	0x04, /* 00000 00 */
	0x08, /* 0000 000 */
	0x10, /* 000 0000 */
	0x10, /* 000 0000 */
	0x10, /* 000 0000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 56 0x38 '8' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

	/* 57 0x39 '9' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x38, /* 00   000 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x44, /* 0 000 00 */
	0x3c, /* 00    00 */
	0x04, /* 00000 00 */
	0x38, /* 00   000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */

};
//6x10的方块
uchar code BlockTab[]={
	/* 57 0x39 '9' */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x7C, /* 0     00 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	//empty block
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
	0x00, /* 00000000 */
};






void LCD_Busy (uchar autowr)    //测状态
{
  	LCD_CE = 0;
  	LCD_DATA_BUS=0xff;
  	LCD_CD=1;
  	LCD_WR=1;
  	LCD_RD=0;
  	if(autowr)
    	{
    		while(bf3==0)
    			;
    	}
  	else
    	{
    		while((bf0==0)||(bf1==0))
    			;
     	}
  	LCD_RD=1;
}
uchar LCD_BusyStatus ()    //测状态
{
	uchar dat;
  	LCD_CE = 0;
	LCD_CD=1;
	LCD_RD=1;
	LCD_WR=1;
  	LCD_DATA_BUS=0xff;
	LCD_RD=0;
	dat=LCD_DATA_BUS;
	LCD_RD=1;
  	return dat;
}

/* 数据,指令读写判别 */
void LCD_CheckBusy1(void)  
{
	while ((LCD_BusyStatus()&3)!=3) {}
}
/* 数据自动读判别 */
/*
void LCD_CheckBusy2(void) 
{				
	while ((LCD_BusyStatus()&4)!=4) {}
} 
*/
/* 数据自动写判别 */
/*
void LCD_CheckBusy3(void) 
{
	while ((LCD_BusyStatus()&8)!=8) {}
}
*/
/*------------写命令或数据到LCD--------------*/
void LCD_Write1 (uchar dat,uchar comm)       //写一个数据和一个命令
{
  	LCD_Data(dat);
  	LCD_Comm(comm);
}
void LCD_Write2 (uchar datl,uchar dath,uchar comm)  //写两个数据和一个命令
{
  	LCD_Data(datl);
  	LCD_Data(dath);
  	LCD_Comm(comm);
}
void LCD_WriteInt (uint dat,uchar comm)       //写一个16进制数据和一个命令
{
  	uchar datl,dath;
  	datl=dat;
  	dath=dat>>8;
  	LCD_Data(datl);
  	LCD_Data(dath);
  	LCD_Comm(comm);
}
void LCD_AutoWrite (uchar dat)               //自动写数据
{
  	LCD_CE = 0;
  	LCD_Busy (1);
  	LCD_CD=0;
  	LCD_RD=1;
  	LCD_DATA_BUS=dat;
  	LCD_WR=0;
  	LCD_WR=1;
}
/*	读数据	*/
uchar LCD_Read(void) 
{
	uchar dat;
  	LCD_CE = 0;
	LCD_CheckBusy1();
	LCD_CD=0;
	LCD_DATA_BUS = 0xff;
	LCD_RD=0;
	dat=LCD_DATA_BUS;
	LCD_RD=1;
	LCD_CD=1;
	return dat;
}
/*	自动读数据	*/
/*
uchar LCD_AutoRead(void) 
{
	uchar dat;
  	LCD_CE = 0;
	LCD_CheckBusy2();
	LCD_CD=0;
	LCD_DATA_BUS = 0xff;
	LCD_RD=0;
	dat=LCD_DATA_BUS;
	LCD_RD=1;
	LCD_CD=1;
	return dat;
}
*/
void LCD_Comm (uchar comm)       //写命令
{
  	LCD_CE = 0;
  	LCD_Busy (0);
  	LCD_CD=1;
  	LCD_RD=1;
  	LCD_DATA_BUS=comm;
  	LCD_WR=0;
  	LCD_WR=1;
}
void LCD_Data (uchar dat)       //写数据
{
  	LCD_CE = 0;
  	LCD_Busy (0);
  	LCD_CD=0;
  	LCD_RD=1;
  	LCD_DATA_BUS=dat;
  	LCD_WR=0;
  	LCD_WR=1;
}

/*------------------初始化-----------------*/
void LCD_Init (void) 
{
  	//LCD_RST=0;
  	//;
  	//LCD_RST=1;
  	//LCD_FS=0;
  	//LCD_CE=0;
  	
  	//LCD_CE = 0;
  	LCD_WR=1;
  	LCD_RD=1;
  	LCD_WriteInt(LCD_TEXT_HOME_ADDR,0x40); 	//文本显示区首地址
  	LCD_WriteInt(LCD_GRAPH_HOME_ADDR,0x42); //图形显示区首地址
  	LCD_Write2(LCD_WIDTH,0x00,0x41);        //文本显示区宽度
  	LCD_Write2(LCD_WIDTH,0x00,0x43);        //图形显示区宽度
  	LCD_Comm(0x81);                        	//逻辑"异或"
  	LCD_Write2(0x02,0x00,0x22);             //CGRAM偏置地址设置
  	LCD_Comm(0x9c);                        	//启用文本显示,启用图形显示
  	//LCD_Comm(0x98);                        	//启用文本显示,启用图形显示
  	
  	LCD_Cls();
}

/********************************************************/
/* 清屏							*/
/********************************************************/
void LCD_Cls(void) 
{
	uint  i;

  	//LCD_CE = 0;
	//LCD_Write2(0x00,0x00,LC_ADD_POS);// 置地址指针为从零开始
  	LCD_WriteInt(LCD_TEXT_HOME_ADDR,LC_ADD_POS);
	LCD_Comm(LC_AUT_WR);		// 自动写
	for(i=0;i< 144*LCD_WIDTH;i++)	// 清一屏
	{
		LCD_Data(0x00);		// 写数据0x00
	}
	LCD_Comm(LC_AUT_OVR);		// 自动写结束
	LCD_Write2(0x00,0x00,LC_ADD_POS);// 重置地址指针
}

void LCD_ClsBlock(uchar x1,uchar y1,uchar x2,uchar y2)
{
	uint addr;
	uchar h,w;
  	uchar i,j;
	
	//x坐标要8字节对齐
	x1 =(x1 / 8) * 8;
	x2 =(x2 / 8) * 8;
	
	h = y2 - y1;
	w = (x2 - x1)/8;
	
	addr = LCD_GRAPH_HOME_ADDR + LCD_WIDTH * y1 + x1/8;
	
  	for(j=0;j<h;j++)
  	{
  		LCD_WriteInt(addr,0x24);
		LCD_Comm(0xb0);
    		for(i=0;i<w;i++)
    		{
	 		LCD_AutoWrite(0x00);
    		}
		LCD_Comm(0xb2);
		addr += LCD_WIDTH;
  	}
}


/*	设定图形x,y值*/
/*
void LCD_GraphSetAddr(uchar x,uchar y) 
{
	uint xy;
	xy=y;
	xy=xy*16+x+256;
  	//LCD_CE = 0;
	LCD_Write2(xy&0xff,xy/256,0x24);
}
*/
/*	设定文本x,y值	*/
/*
void LCD_TextSetAddr(uchar x,uchar y) 
{
  	//LCD_CE = 0;
	LCD_Write2(y*16+x,0,0x24);
}
*/
/*	清除一点*/
/*
void LCD_ClrPixel(uchar x,uchar y) 
{
	uchar b;
	uint addr = LCD_GRAPH_HOME_ADDR + y * LCD_WIDTH + x / 8;

	b = 7 - (x % 8);
	
	LCD_WriteInt(addr,0x24);
	LCD_Comm(0xf0|b);
}
*/
/*	点亮一点	*/

⌨️ 快捷键说明

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