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

📄 nbctft.c

📁 51单片机2.8寸26万像素LED显示
💻 C
📖 第 1 页 / 共 2 页
字号:
//公司:北方蓝芯科技开发有限公司
//网址:www.hrbnbc.com
/*===================================================================================================  
文件功能描述:320x240TFT驱动程序,控制TFT实现汉字,字符显示,画点功能。
====================================================================================================*/
//******************包含头文件***************************
#include"NBCTFT.h"
#include"reg52.h"

//**************控制端口定义********************
#define DataPort P0     //数据口使用DataPort

sbit RS    =P2^5;		//数据/命令选择
sbit RW    =P2^4;       //写数据/命令
sbit nRD   =P2^3;       //读控制
sbit CS    =P2^2;		//片选
sbit RES   =P2^1;		//复位

sbit LE    =P2^0;       //74HC573锁存控制
//**************声明外部函数和变量**************

extern unsigned int Device_code;

//================================================================================================
//	实现功能:	延时
//	输入参数:	count 设置延时时间
//================================================================================================
void delayms(unsigned int count)
{
    int i,j;                                                                                
    for(i=0;i<count;i++)                                                                    
       {
	     for(j=0;j<255;j++);
       }                                                                                     
}

//================================================================================================
//	实现功能:	写命令
//	输入参数:  DH 需要输入16bits命令的高8位
//              DL 需要输入16bits命令的低8位
//================================================================================================
void Write_Cmd(unsigned char DH,unsigned char DL)
{
	CS=0;
	RS=0;
    nRD=1;
    RW=0;

    //注意:当使用8位数据口驱动16位数据模式时,使用74HC573作为IO扩展,程序如下
    DataPort=DL;            //送低8位命令给573待锁存
    LE=1;                   //锁存位
    LE=0;                   //断开锁存,位选573的Q7~Q0仍保持 

	DataPort=DH;            //送高8位命令给TFT

	/*
    //如果使用16位数据口驱动16位数据模式,则无需IO扩展,直接将数据送到数据口即可
    DataPort_L=DL; 
    DataPort_H=DH;
	*/

	RW=1;
	CS=1;
}

//================================================================================================
//	实现功能:	写数据(2*8bits)
//	输入参数:  DH 需要输入16bits数据的高8位
//              DL 需要输入16bits数据的低8位
//================================================================================================
void Write_Data(unsigned char DH,unsigned char DL)
{
	
	CS=0;
	RS=1;

    //注意:当使用8位数据口驱动16位数据模式时,使用74HC573作为IO扩展,程序如下
	DataPort=DL;            //送低8位数据给573待锁存
    LE=1;                   //锁存位
    LE=0;                   //断开锁存,位选573的Q7~Q0仍保持 

	DataPort=DH;            //送高8位数据给TFT

	/*
    //如果使用16位数据口驱动16位数据模式,则无需IO扩展,直接将数据送到数据口即可
    DataPort_L=DL; 
    DataPort_H=DH;
	*/

	RW=0;
	RW=1;
	CS=1;
}

//================================================================================================
//	实现功能:	写数据(16位)
//	输入参数:  y 需要输入16bits数据
//================================================================================================
void  Write_Data_U16(unsigned int y)
{
	unsigned char m,n;
	m=y>>8;
	n=y;
	Write_Data(m,n);
}

//================================================================================================
//	实现功能:	向x寄存器写入y数据
//	输入参数:  x 需要输入的命令 16位
//              y 需要输入的数据 16位
//================================================================================================
void  Write_Cmd_Data (unsigned char x,unsigned int y)
{
	unsigned char m,n;
	m=y>>8;
	n=y;
	Write_Cmd(0x00,x);
	Write_Data(m,n);
}

//================================================================================================
//	实现功能:	TFT清屏
//	输入参数:	bColor 清屏所使用的背景色
//================================================================================================
void CLR_Screen(unsigned int bColor)
{
 unsigned int i,j;
 LCD_SetPos(0,240,0,320);//320x240
 for (i=0;i<320;i++)
	{
	   for (j=0;j<240;j++)
	       Write_Data_U16(bColor);
	}
}

//================================================================================================
//	实现功能:	显示Ascii字符
//  输入参数:  x 横坐标
//              y 纵坐标
//		        c 需要显示的字符
//		        fColor 字符颜色
//		        bColor 字符背景颜色
//================================================================================================
#include "Ascii_8x16.h"
void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor)
{
 unsigned int i,j;
 LCD_SetPos(x,x+8-1,y,y+16-1);                    //设置字符显示位置
 for(i=0; i<16;i++) {                             //循环写入16字节,一个字符为16字节
		unsigned char m=Font8x16[(c-0x20)*16+i];  //提取c字符的第i个字节以,c减去0x20是由于Ascii码库中的0~1f被去掉
		for(j=0;j<8;j++) {                        //循环写入8位,一个字节为8位
			if((m&0x80)==0x80) {                  //判断最高位是否为1
				Write_Data_U16(fColor);           //最高位为1,写入字符颜色
				}
			else {
				Write_Data_U16(bColor);           //最高位为0,写入背景颜色
				}
			m<<=1;                                //左移1位,准备写下一位
			}
		}
}

//================================================================================================
//	实现功能:	显示16x16汉字
//  输入参数:  x 横坐标
//              y 纵坐标
//		        g 需要显示的字符编码
//		        fColor 字符颜色
//		        bColor 字符背景颜色
//================================================================================================
#include "chinese.h"	//包含16*16汉字字模

void Put16x16(unsigned short x, unsigned short  y, unsigned char g[2], unsigned int fColor,unsigned int bColor)
{
	unsigned int i,j,k;

	LCD_SetPos(x,  x+16-1,y, y+16-1);                       //设置汉字显示位置

	for (k=0;k<64;k++)                                      //循环64次,查询汉字字模位置
	{ 
	  if ((ch16[k].GBK[0]==g[0])&&(ch16[k].GBK[1]==g[1]))   //判断第k个汉字的编码是否与输入汉字g[2]相等
	  { 
    	for(i=0;i<32;i++)                                   //如果相等,既已找到待显示字模位置,循环写入32字节
		{
		  unsigned short m=ch16[k].hz16[i];                 //读取32字节中的第i字节
		  for(j=0;j<8;j++)                                  //循环写入8位数据
		   {                                                
			 if((m&0x80)==0x80) Write_Data_U16(fColor);     //判断最高位是否为1,最高位为1,写入字符颜色
			 else              Write_Data_U16(bColor);      //最高位为0,写入背景颜色
		     m<<=1;                                         //左移1位,准备写下一位
	       } 
		}
	  }  
    }	
}

//================================================================================================
//	实现功能:	显示中英文字符串
//  输入参数:  x 横坐标
//              y 纵坐标
//		        *s 待显示的字符串,例如LCD_PutString(24,16,"123蓝芯",White,Blue);即把"123蓝芯"的第一个字符地址赋给指针变量s.
//		        bColor 字符背景颜色
//================================================================================================
void LCD_PutString(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor) 
{
	 unsigned char l=0;                            //显示屏位置增量
     while(*s) 
	 {
		if( *s < 0x80)                             //判断s指向的字符串中的某字符的编码值是否小于128,如果小于,即为ASCII字符
		    {
			 LCD_PutChar(x+l*8,y,*s,fColor,bColor);//显示该字符
		     s++;l++;                              //指针加1,位置加1
			}
		else
		    {
			 Put16x16(x+l*8,y,(unsigned char*)s,fColor,bColor);//显示该汉字
		     s+=2;l+=2;                                        //因为汉字为编码为2字节,指针加2,显示16x16所以位置加2
			}
	 }
}

//================================================================================================
//	实现功能:	指定位置显示RGB颜色
//  输入参数:  x0,y0 起始坐标
//              x1,y1 结束坐标
//		        Color  背景颜色
//================================================================================================

void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color)
{
	unsigned int i,j;
	LCD_SetPos(x0,x1,y0,y1);      //设置显示位置
	for (i=y0;i<=y1;i++)
	{
	   for (j=x0;j<=x1;j++)
	       Write_Data_U16(Color);
	}
}

//================================================================================================
//	实现功能:	TFT初始化
//================================================================================================
void TFT_Initial(void)
{  

    RES = 1;    
	delayms(1);                    // Delay 1ms 
	RES = 0;  
	delayms(10);                   // Delay 10ms            

⌨️ 快捷键说明

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