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

📄 13.1 lcd.c

📁 《数字信号处理器原理、结构及应用》所附光盘的资料,关于tms320f2812的一些实用例程
💻 C
字号:
/******************************************************
** 功能描述:该程序对CF12864液晶屏进行初始化并开启显示 
*****************************************************/ 
#include "DSP28_Device.h"

#define	 LCD_SW   GpioDataRegs.GPBDAT.bit.GPIOB7   //LED背光,低有效
#define	 LCD_DI   GpioDataRegs.GPADAT.bit.GPIOA13   //指令/数据,低为数据
#define	 LCD_RW   GpioDataRegs.GPADAT.bit.GPIOA14  //读/写,低为写
#define	 LCD_E    GpioDataRegs.GPADAT.bit.GPIOA15   //使能信号,下降沿写入

char table1[300]={       
0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFF,0xA9,0xA9,0xA9,0xE9,0x08,0x08,0x08,0x00,
0x40,0x40,0x48,0x4B,0x4A,0x4A,0x4A,0x7F,0x4A,0x4A,0x4A,0x4B,0x48,0x40,0x40,0x00,  
// 重                     
0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0xC5,0x7E,0xC4,0x44,0x44,0x44,0x44,0x44,0x00,
0x40,0x30,0x0F,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x18,0x30,0x60,0x20,0x00, 
// 庆                         
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00, 
// 大                              
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00, 
// 学                      
};     

void ReadLcdState (Uint16 E) //读状态字,判断忙否,E为区分左右
{
	unsigned long int i = 0;
	Uint16	STAFLAG;
	EALLOW;  
	GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;//D0~D7输入
    EDIS;
	if(E==1)
		GpioDataRegs.GPEDAT.all = 0xfffc; //CSA=0,CSB=1左
	else	
		GpioDataRegs.GPEDAT.all = 0xfffd; //CSA=1,CSB=0右
	LCD_RW = 1;
	LCD_DI = 0;
	while(1)
	{		
		LCD_E = 1;
		for(i=0; i<2; i++){}
		LCD_E = 0;
		STAFLAG = GpioDataRegs.GPBDAT.all&0x8000;// 读液晶状态
		if(STAFLAG==0x0000)break;
	}
}

void WriteLcdIns (Uint16 INS,Uint16 E) //写指令,E为区分左右
{
	unsigned long int i = 0;
	ReadLcdState (E);
	EALLOW;  
	GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xFF00;//D0~D7输出
    EDIS;
	if(E==1)
		GpioDataRegs.GPEDAT.all = 0xfffc; //CSA=0,CSB=1左
	else	
		GpioDataRegs.GPEDAT.all = 0xfffd; //CSA=1,CSB=0右
	LCD_RW = 0;
	LCD_DI = 0;
    LCD_E = 1;
    GpioDataRegs.GPBDAT.all=INS<<8;       // 指令写入LCD
	for(i=0; i<2; i++){}	
	LCD_E = 0;
}

void WriteLcdData (Uint16 DATA,Uint16 Yaddress,Uint16 E)   //写数据,E为区分左右
{
	unsigned long int i = 0;
	WriteLcdIns(Yaddress,E);		//设置列地址
	ReadLcdState (E);			//查询液晶是否为空闲
	EALLOW;  
	GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xFF00;   //D0~D7输出
    EDIS;
    if(E==1)
		GpioDataRegs.GPEDAT.all = 0xfffc;   //CSA=0,CSB=1左
	else	
		GpioDataRegs.GPEDAT.all = 0xfffd;   //CSA=1,CSB=0右	
	LCD_RW = 0;
	LCD_DI = 1;
	LCD_E = 1;
	GpioDataRegs.GPBDAT.all=DATA<<8;    // 数据写入LCD
	for(i=0; i<2; i++){}
	LCD_E = 0;	
}

void OffLcdDis (Uint16 E) //关显示
{
	unsigned long int i = 0;
	Uint16 STAFLAG;
	while(1)
	{
	    WriteLcdIns (0X3E,E);	   //写指令:关闭显示
      	ReadLcdState (E);		   //查询液晶是否为空闲
      	EALLOW;  
		GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;//D0~D7输入
     	EDIS;
      	if(E==1)
			GpioDataRegs.GPEDAT.all = 0xfffc; //CSA=0,CSB=1左
		else	
			GpioDataRegs.GPEDAT.all = 0xfffd; //CSA=1,CSB=0右
		LCD_RW = 1;
		LCD_DI = 0;
    		LCD_E = 1;
		for(i=0; i<2; i++){}
		LCD_E = 0;
		STAFLAG = GpioDataRegs.GPBDAT.all&0X2000;   // 读液晶状态
		if(STAFLAG==0X2000)break;          //如液晶关闭,则退出循环
	}
}

void OpenLcdDis (Uint16 E)      //开显示
{
	unsigned long int i = 0;
	Uint16	STAFLAG;
	while(1)
	{
		WriteLcdIns (0x3F,E);	   //写指令:LCD显示RAM中的内容
      	ReadLcdState (E);		   //查询液晶是否为空闲
      	EALLOW;  
		GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;  //D0~D7输入
    		EDIS;
    		if(E==1)
			GpioDataRegs.GPEDAT.all = 0xfffc;   //CSA=0,CSB=1左
		else	
			GpioDataRegs.GPEDAT.all = 0xfffd;   //CSA=1,CSB=0右	
		LCD_RW = 1;
		LCD_DI = 0;
		LCD_E = 1;
		for(i=0; i<2; i++){}
		LCD_E = 0;
		STAFLAG = GpioDataRegs.GPBDAT.all&0X2000;    // 读液晶状态	
		if(STAFLAG==0x0000)break;        //如果液晶被打开,则退出循环
	}
}

void ClrLcdDis (Uint16 E) //清屏
{
	Uint16 PAGENUM;          //页地址B8~BF
	Uint16 Yaddress;         // Y地址40~7F
	for (PAGENUM=0xB8; PAGENUM<=0xBF; PAGENUM++)
    	{
        WriteLcdIns (PAGENUM, E); 		 //设置相应的页地址
        	for (Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
         {
           	WriteLcdData(0x00, Yaddress, E);  //送0清屏
          }
     }
}

void LCDinit (Uint16 E) // LCD初始化子程序
{
	OffLcdDis (E);			  //关显示
	WriteLcdIns (0x0A4,E);    //设置显示驱动,占空比,复位,ADC选择等
   	WriteLcdIns (0x0A9,E);   
  	WriteLcdIns (0x0E2,E);   
 	WriteLcdIns (0x0A0,E);   
    ClrLcdDis (E);			  //清屏
    OpenLcdDis (E);		       //开显示
}

void DISPLAY(Uint16 n,Uint16 E,Uint16 PAGADD,Uint16 Yaddress)    // 送显汉字子程序
{ 
	Uint16 K;
    char TEMP;
	WriteLcdIns (0X0c0,E);
   	WriteLcdIns (PAGADD,E);
    n=n*32;
    for(K=0;K<16;K++,Yaddress++) 
	{
	    TEMP=table1[K+n];
	     WriteLcdData (TEMP,Yaddress,E);
	}
	Yaddress=Yaddress-16;
	PAGADD=PAGADD+1;
	WriteLcdIns (PAGADD,E);
	for(;K<32;K++,Yaddress++)
	{
	    TEMP=table1[K+n];
	    WriteLcdData (TEMP,Yaddress,E);
	}
WriteLcdIns (0X0C0,E);
	PAGADD=PAGADD-1;
    	WriteLcdIns (PAGADD,E);
}

void IOinit()                                               // I/O初始化子程序
{
 	EALLOW;
 	                                        //GPIOA13~A15配置为普通I/O口输出 
    GpioMuxRegs.GPAMUX.all = GpioMuxRegs.GPAMUX.all&0x1fff;
	GpioMuxRegs.GPADIR.all = GpioMuxRegs.GPADIR.all|0xe000;
	                                      //GPIOB7     配置为普通I/O口输出 
    GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7 = 0;
	GpioMuxRegs.GPBDIR.bit.GPIOB7= 1;
	                                      //GPIOE0~E2  配置为一般I/O口输出,作138译码
 	GpioMuxRegs.GPEMUX.all = GpioMuxRegs.GPEMUX.all&0xfff8; 
	GpioMuxRegs.GPEDIR.all = GpioMuxRegs.GPEDIR.all|0x0007;
	                                      //GPIOB8~B15 配置为一般I/O口,作数据线D0~D7
	GpioMuxRegs.GPBMUX.all = GpioMuxRegs.GPBMUX.all&0x00ff;
	EDIS;			
}

main() 
{
    InitSysCtrl();        // 系统初始化程序,该子程序在DSP28_sysctrl.c中
 	DINT;            // 关闭总中断
	IER = 0x0000;     // 关闭外围中断
	IFR = 0x0000;     // 请中断标志	
	IOinit();	        // I/O初始化子程序	
	LCDinit(1);       // LCD初始化子程序
	LCDinit(2);
	LCD_SW = 0;     // 开背光
	DISPLAY (0,1,0xBA,0x47); //重
    DISPLAY (1,1,0xBA,0x67); //庆
    DISPLAY (2,2,0xBA,0x47); //大
    DISPLAY (3,2,0xBA,0x67); //学
    for( ; ; ){}
}

⌨️ 快捷键说明

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