📄 main.c
字号:
/************************************************************************
*************************************************************************/
#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 + -