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

📄 main.c

📁 DSP2407与sed1354的接口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************

*************************************************************************/
#include  "F2407_c.h" 
#include  "S1D13504.h"

//****************************************************************
#define	ERROR				0
#define	OK					1
#define  	RUNOK				0x81
#define 	RUNERROR			0x80
//****************************************************************
#define	CheckLCMStatus		0x02
#define	DisplayWord1		0x04
#define	PaintBox			0x05
#define 	PaintPicture			0x08
#define	DisplayWord2		0x0a
#define	StoreBoxRam		0x0b
#define	RefreshBoxRam		0x0c
#define	PaintBoxShade		0x0d
#define	ResetBoard			0x0e
#define	DisplayWord3		0x0f
#define	RestoreFile			0x10
#define   AckFileTrans		0x11
#define	PaintLogo			0x13
#define	DisplayWord4		0x14
//****************************************************************
#define 	VRamBufAddr		0xff38
#define  	LogoAddr			0xff4c
#define 	LibFile				0x00
#define	PicFile				0x01
#define 	LEDFontAddress		0x0000
#define 	ASCIIFontAddress	0x0800
#define 	HZFontAddress		0x1000

unsigned char Flag;
#define RECOK				0x01
#define SNDOK				0x02
#define HAVEKEY				0x04
#define RECERROR			0x08
unsigned char Flag1;
#define SCANKEY				0x01
unsigned char Flag2;
#define InReceive			0x01

#define WaitVNDP()			{PBDATDIR=0xff00;while(1){if(((*VerticalNonDisplayPeriod_FPFrameStartPos)&0x8000)==0x8000)break;}}

#define	BAUDRATE9600H		0x02
#define 	BAUDRATE9600L		0x07
#define	BAUDRATE208333H	0x00
#define	BAUDRATE208333L	0x17
#define	BAUDRATEH			BAUDRATE9600H
#define	BAUDRATEL			BAUDRATE9600L



unsigned char RecIndex;
unsigned char FrameLength;
unsigned int SumParity;
unsigned char LCDFreshIndex;
unsigned int KeyBAK;
unsigned int KEY;
unsigned char UartBuf[200];
unsigned int SystemInitStatus;
unsigned int FlashBlockIndex;
unsigned int BUFFER[1640];
unsigned int FileAlreadyDone;
unsigned int FileBank;
unsigned int WhoseFile;
unsigned int startFileTrans;
unsigned int OneK;
unsigned char OverTimer;


unsigned int SST39VF1601Init(void);
void FlashBlockErase(void);	
void FlashProgram(unsigned int addressoffset,unsigned int length,unsigned int *databuf);
void FlashReadOut(unsigned int addressoffset,unsigned int length,unsigned int *databuf);
unsigned int S1D13504Init(void);
void LCDDataTrans(unsigned int x,unsigned int y,unsigned int dx,unsigned int dy,unsigned int *databuf);
void LCDVramXChange(void);
unsigned int ColorTransfer(unsigned char color256);
void DisplayWord1Func(unsigned int x,unsigned int y,unsigned int bcolor,unsigned int fcolor,unsigned char *fontbuf,unsigned char num);
void DisplayWord2Func(unsigned int x,unsigned int y,unsigned int bcolor,unsigned int fcolor,unsigned char *fontbuf,unsigned char num);
void DisplayWord3Func(unsigned int x,unsigned int y,unsigned int bcolor,unsigned int fcolor,unsigned char *fontbuf,unsigned char num);
void	PaintBoxFunc(unsigned int x,unsigned int y,unsigned int dx,unsigned int dy,unsigned int color);
void	StoreBoxRamFunc(unsigned int x,unsigned int y,unsigned int dx,unsigned int dy);
void	RefreshBoxRamFunc(unsigned int x,unsigned int y,unsigned int dx,unsigned int dy);
void	PaintBoxShadeFunc(int x1,int y1,int x2,int y2,unsigned int color);
void PaintPictureFunc(unsigned int x,unsigned int y,unsigned int Picindex);
void PaintLogoFunc(void);
void RestoreFileFunc(unsigned int length,unsigned char *filebuf);
unsigned int GetKey(void);
void	StartUARTSend(unsigned char sta);
unsigned char	UARTHandle(void);	
void	SendKEY(void);
	

main()                                    	
{    
	unsigned char hd;
	unsigned int    hdd;

	asm(" setc	SXM");						
	asm(" clrc	OVM");						
	asm(" clrc	CNF");						
	asm(" setc	INTM");						
	SCSR1=0x8146;										/*打开SCI和eva的时钟,4x10MHz=40MHz */						
	WDCR=0x0E8;										/*关闭看门狗*/						
	IMR=0x0000;											/*关闭中断*/	
	IFR=0x0FFFF;
	MCRA=0x00003;										/*PAPB开启IO功能*/	/*RXD,TXD引脚使能*/				
	MCRB=0x00000;										/*PCPD开启IO功能*/
	MCRC=0x00001;										/*PEPF开启IO功能,PE0为CLKOUT*/	
    	PADATDIR=0x00000;									/*PA6为输入信号*/
    	PBDATDIR=0x0ffc0;									/*PB全部为输出信号,PB6PB7初始为11*/						
    	PCDATDIR=0x0ffff;									/*PC全部为输出信号,初始为11111111*/	
    	PEDATDIR=0x00000;									/*PE全部为输入信号*/
    	PFDATDIR=0x00000;									/*PF全部为输入信号*/ 	
   	SCICCR=0x07;										/*8dat bits,1stop bit,no parity*/
	SCICTL1=0x13;										/*使能接收和发送功能,将SCI置为复位状态*/
	SCICTL2=0x03;										/*使能接收和发送中断*/
	SCIHBAUD=BAUDRATEH;								
	SCILBAUD=BAUDRATEL;
	SCIPRI=0x00;										/*高优先级*/
	SCICTL1=0x33;										/*退出SCI复位状态*/
	EVAIMRA=0x0080;
	EVAIFRA=0x0080;
	T1CON=0x160c;
	T1PR=0x30d4;										/*20mS周期*/
	T1CNT=0x0000;
	T1CON|=0x0040;
	IMR=0x03;											/*允许INT1,INT2中断*/								
	asm(" clrc	INTM");									/*打开中断开关*/
	SystemInitStatus=SST39VF1601Init();					/*对FLASH初始化*/
   	SystemInitStatus&=S1D13504Init();					/*对显示驱动芯片初始化*/
	LCDFreshIndex=0;
	RecIndex=0;
	FrameLength=0;
	SumParity=0;
	Flag=0;
	Flag1=0;
	OverTimer=0;	
	while(1)	
    	{
		if(Flag&RECOK)									/*如果收到正确数据包则进行处理*/
		{
			Flag=0;
			RecIndex=0;
			SumParity=0;
			FrameLength=0;
			hd=UARTHandle();
			StartUARTSend(hd);
		}
		else if(Flag&RECERROR)							/*如果接收数据包出错则返回错误重发指令*/
		{
			Flag=0;
			RecIndex=0;
			SumParity=0;
			FrameLength=0;
			StartUARTSend(RUNERROR);
		}		   
		else if(Flag&SNDOK)								/*应答完成后清除发送标志*/
		{
			Flag=0;
		}

		if(Flag1==SCANKEY)								/*如果按键扫描时间到则进行按键处理*/
		{
			Flag1=0;
			hdd=GetKey();
			if(hdd!=KeyBAK)								/*连续两次按键码相同确认按键*/
				KeyBAK=hdd;
			else
			{
				if(KeyBAK!=0xffff)
				{
					if(KeyBAK!=KEY)
					{
						KEY=KeyBAK;
						if(Flag)
							continue;						
						SendKEY();
					}
				}
				else										/*按键松开后允许第二次按键处理*/
				{
					if(KeyBAK!=KEY)
					{
						KEY=KeyBAK;
					}
				}
			}			
		}		
    	};
}

/*SST39VF101初始化,获取ID号,如果ID号不对则报错*/
unsigned int SST39VF1601Init(void)
{
	unsigned int i;
	PBDATDIR=0xff40;
	*(unsigned int *)(0xd555)=0xaa;
	*(unsigned int *)(0xaaaa)=0x55;
	*(unsigned int *)(0xd555)=0x90;   	
	i=*(unsigned int *)(0x8000);
	if(i!=0x00bf)
	{
		*(unsigned int *)(0x8000)=0x00f0;
		return ERROR;
	}
	i=*(unsigned int *)(0x8001);
	if(i!=0x234b)
	{
		*(unsigned int *)(0x8000)=0x00f0;
		return ERROR;
	}
	*(unsigned int *)(0x8000)=0x00f0;
	return OK;
}

/*S1D13504初始化*/
unsigned int S1D13504Init(void)
{
	unsigned int i,j;
	unsigned int *pDram;
	PBDATDIR=0xff00;
	*PowerSaveConfig_HostInterfaceEnable=0x0000;			/*MCU接口使能*/
   	i=*RevisionCode_MemoryConfig;							/*芯片ID号检查*/
   	if((i&0xff00)!=0x0400)
   		return ERROR;
   	i=*MDConfig;											/*芯片硬件配置检查*/	
   	if(i!=0x4602)
   		return ERROR;
   	*PerformanceEnhancement=0x3080;						/*disable display fifo*/
   	*RevisionCode_MemoryConfig=0x0030;					/*设置DRAM参数*/
   	*PanelType_MODRate=0x2500;							/*设置液晶屏参数*/
   	*HorizonWidth_NonDisplayPeriod=0x6316;					/*设置液晶屏宽度和行扫描参数*/
   	*FPLineStartPos_FPLinePulseWidth=0x0105;				/*设置行扫描起始位置和脉冲宽度*/
   	*VerticalHeight=0x0c02;								/*设置液晶屏高度*/
   	*VerticalNonDisplayPeriod_FPFrameStartPos=0x3f30;		/*设置场扫描参数*/
   	*FPFramePulseWidth_DisplayMode=0x0714;				/*设置场扫描起始位置和脉冲宽度*/
	*Screen1LineCompare=0xff03;							/*设置第一屏高度*/
	*Screen1DisplayStartAddressL=0x0000;					/*设置第一屏DRAM起始位置*/
	*Screen1DisplayStartAddressH=0x0000;
	*MemoryAddressOffset=0x8002;							/*设置行DRAM地址偏移*/
	*PixelPanning_ClockConfig=0x0000;						/*设置运行时钟*/	
	pDram=(unsigned int *)(0x8000);							/*清屏*/
    	PBDATDIR=0xff20;    	
    	for(i=0;i<11;i++)
    	{
    		for(j=0;j<0x8000;j++)
    		{    
    			*(pDram++)=0x0000;				
    		}
    		PBDATDIR=0xff20+i;
    		pDram=(unsigned int *)(0x8000);
    	} 
    	pDram=(unsigned int *)(0x8000);
    	PBDATDIR=0xff2c;    	
    	for(i=0;i<11;i++)
    	{
    		for(j=0;j<0x8000;j++)
    		{    
    			*(pDram++)=0x0000;				
    		}
    		PBDATDIR=0xff2c+i;
    		pDram=(unsigned int *)(0x8000);
    	} 
	PBDATDIR=0xff00;
	*PerformanceEnhancement=0x3010;						/*DRAM参数优化*/
   	*FPFramePulseWidth_DisplayMode=0x0215;				/*设置驱动芯片开始工作*/
   	return OK;
}

/*FLASH擦写和编程后等待内部操作结束*/
void		 WaitEndOfWrite(void)
{
	unsigned int i,j;
	while(1)
	{
		i=(*(unsigned int *)(0x8000))&0x0040;
		j=(*(unsigned int *)(0x8000))&0x0040;
		if(i==j)
			break;
	}		
}

/*FLASH块擦除操作32K byte为一块*/
void FlashBlockErase(void)
{
	PBDATDIR=0xff40+FlashBlockIndex;
	*(unsigned int *)(0xd555)=0xaa;
	*(unsigned int *)(0xaaaa)=0x55;
	*(unsigned int *)(0xd555)=0x80;
	*(unsigned int *)(0xd555)=0xaa;
	*(unsigned int *)(0xaaaa)=0x55;
	*(unsigned int *)(0x8100)=0x50;
	WaitEndOfWrite();
}

/*块内编程操作,addressoffset+length不能超过32k */
void FlashProgram(unsigned int addressoffset,unsigned int length,unsigned int *databuf)
{
	unsigned int *pFlashProgram;
	unsigned int *pDatabuf;
	unsigned int l;
	l=length;
	pDatabuf=databuf;
	PBDATDIR=0xff40+FlashBlockIndex;
	pFlashProgram=(unsigned int *)(0x8000+addressoffset);
	while(l--)
	{
		*(unsigned int *)(0xd555)=0xaa;
		*(unsigned int *)(0xaaaa)=0x55;
		*(unsigned int *)(0xd555)=0xa0;			
		*(pFlashProgram++)=*(pDatabuf++);
		WaitEndOfWrite();
	}
}

/*块内flash数据读取,addressoffset+length不能超过32k*/
void FlashReadOut(unsigned int addressoffset,unsigned int length,unsigned int *databuf)
{
	unsigned int *pFlashProgram;
	unsigned int *pDatabuf;
	unsigned int l;
	l=length;
	pDatabuf=databuf;
	PBDATDIR=0xff40+FlashBlockIndex;
	pFlashProgram=(unsigned int *)(0x8000+addressoffset);
	while(l--)
	{
		*(pDatabuf++)=*(pFlashProgram++);		
	}
}


/*对x,y指定位置,宽度和高度分别为dx,dy的区域传送显示数据*/
void LCDDataTrans(unsigned int x,unsigned int y,unsigned int dx,unsigned int dy,unsigned int *databuf)
{
	unsigned long position;
	unsigned int screen1,screen2;
	unsigned int offset,bank,i,j;
	unsigned int *pDram,*pBuf;	
	if(LCDFreshIndex==0)
	{
		screen1=0xff2c;
		screen2=0xff20;
	}
	else
	{
		screen1=0xff20;
		screen2=0xff2c;
	}
	WaitVNDP();		
	pBuf=databuf;  
	for(i=0;i<dy;i++)
	{		
		position=(((unsigned long)(y+i))*640)+x;
		bank=position>>15;
		offset=position&0x7fff;
		pDram=(unsigned int *)(0x8000+offset);
		for(j=0;j<dx;j++)
		{    
			PBDATDIR=screen1+bank;   
			*(pDram++)=*(pBuf++);
			PBDATDIR=screen2+bank;   
			*(pDram++)=*(pBuf++);
			offset++;
			if(offset>=0x8000)
			{
				bank++;
	    			offset=0x0000;
	    			pDram=(unsigned int *)(0x8000);
	    		}
	    	}   		
	}	
}

/*液晶屏双缓冲切换,在于改善刷屏效果*/
void LCDVramXChange(void)
{
	unsigned int Vstatus,i;
	if(LCDFreshIndex==0)
	{
		PBDATDIR=0xff00;
		while(1)
		{
			i=*VerticalNonDisplayPeriod_FPFrameStartPos;
			if((i&0x8000)==0x8000)
				break;
		}
		*Screen1DisplayStartAddressL=0x0000;
		*Screen1DisplayStartAddressH=0x0600;		
		LCDFreshIndex=1;
	}
	else
	{
		PBDATDIR=0xff00;
		while(1)
		{
			i=*VerticalNonDisplayPeriod_FPFrameStartPos;
			if((i&0x8000)==0x8000)
				break;
		}
		*Screen1DisplayStartAddressL=0x0000;
		*Screen1DisplayStartAddressH=0x0000;		
		LCDFreshIndex=0;
	}
}

/*发送应答数据*/
void	StartUARTSend(unsigned char sta)
{
	SCITXBUF=sta;										/*启动发送*/
}

/*发送键盘码*/
void	SendKEY(void)
{
	unsigned char key;	
	switch(KEY)
	{
		case 0x0080:
			key=0x08;
			break;
		case 0x0040:
			key=0x09;
			break;
		case 0x0020:
			key=0x0a;
			break;
		case 0x0010:
			key=0x0b;
			break;
		case 0x0008:
			key=0x0c;
			break;
		case 0x0004:
			key=0x0d;
			break;
		case 0x0002:
			key=0x0e;
			break;
		case 0x0001:
			key=0x0f;
			break;
		case 0x0180:
			key=0x10;
			break;
		case 0x0140:
			key=0x11;
			break;
		case 0x0120:
			key=0x12;
			break;
		case 0x0110:
			key=0x13;
			break;
		case 0x0108:
			key=0x14;
			break;
		case 0x0104:
			key=0x15;
			break;
		case 0x0102:
			key=0x16;
			break;
		case 0x0101:
			key=0x17;
			break;
		case 0x0280:
			key=0x18;
			break;
		case 0x0240:
			key=0x19;
			break;
		case 0x0220:
			key=0x1a;
			break;
		//case 0x0210:
		//	key=0x1b;
		//	break;
		case 0x0208:
			key=0x1c;
			break;
		case 0x0204:
			key=0x1d;
			break;

⌨️ 快捷键说明

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