#include<c8051F120.h>
#include<intrins.h>
#include<string.h>
#include<declare.h>
#define uchar unsigned char
#define uint unsigned int
#define com_add P3 //数据端口设定
sbit RES = P2^4; //复位信号
sbit A1 = P7^3; // A0 信号端口设定
sbit CS = P7^2; // CS 信号端口设定
sbit WR = P7^7; // WR 信号端口设定
sbit RD = P7^6; // RD 信号端口设定
sbit DIR = P2^6; //数据方向控制位
/******屏幕颜色设定值*******/
#define RED 0xf800
#define GREEN 0x07e0
#define BLUE 0x001f
#define YELLOW 0xffe0
#define CYAN 0x07ff
#define MAGENTA 0xf81f
#define BLACK 0x0000
#define WHITE 0xffff
#define GRAY 0x8410
/******寄存器设置*******/
uchar code Set_F500[]={4,0x83,0x00,0xf5,0x00};
uchar code Set_F504[]={4,0x83,0x04,0xf5,0x04};
uchar code Set_F505[]={4,0x83,0x05,0xf5,0x80};
uchar code Set_F6C4[]={4,0x83,0xc4,0xf6,0x10};
uchar code Set_F080[]={4,0x83,0x80,0xf0,0xfc};
uchar code Set_F08E[]={4,0x83,0x8e,0xf0,0x32};
uchar code Set_F090[]={4,0x83,0x90,0xf0,0x14};
uchar code Set_F091[]={4,0x83,0x91,0xf0,0x25};
uchar code Set_F092[]={4,0x83,0x92,0xf0,0x1e};
uchar code Set_F094[]={4,0x83,0x94,0xf0,0x05};
uchar code Set_F095[]={4,0x83,0x95,0xf0,0x0e};
uchar code Set_F096[]={4,0x83,0x96,0xf0,0x03};
uchar code Set_8F[]={7,0x8f,0x69,0x45,0x61,0x67,0x6c,0x65};
uchar code Set_F240[]={4,0x83,0x40,0xf2,0x00};
uchar code Set_F241[]={4,0x83,0x41,0xf2,0xff};
uchar bdata GpioData; //该变量可为位操作之变量
sbit SDIN = GpioData^3;
sbit SCLK = GpioData^2;
sbit SENA = GpioData^1;
uchar bdata BitData; //该变量可为位操作之变量
sbit BitData7=BitData^7;
extern uchar old_SFRPAGE;
extern uchar time_data[10];
extern uchar latitude_data[10];
extern uchar N_S[2];
extern uchar longitude_data[11];
extern uchar E_W[2];
extern uchar satnum_data[3];
extern uchar altitude_data[8];
//-----------------------------------
// 一个指令代码或数据传送子程序
//-----------------------------------
void SdCmd(uchar Command)
{
old_SFRPAGE = SFRPAGE;
SFRPAGE = 0x0F;
DIR=1;
A1=0; // 选择指令包入口地址
com_add = Command; // 数据送入数据端口
CS=0; // 选通模块
WR=0; // 写信号有效
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
WR=1; // 写信号无效
CS=1; //封闭模块
SFRPAGE = old_SFRPAGE;
}
//-----------------------------------
// 指令包传送结束子程序
//-----------------------------------
void CmdEnd()
{
old_SFRPAGE = SFRPAGE;
SFRPAGE = 0x0F;
DIR=1;
A1=1; //选择状态寄存器地址
com_add = 1; //数据送入数据端口
CS=0; // 选通模块
WR=0; // 写信号有效
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
WR=1; // 写信号无效
CS=1; // 封闭模块
SFRPAGE = old_SFRPAGE;
}
//-----------------------------------
// 一个指令包传送子程序
//-----------------------------------
void WritePKG(uchar *pkg)
{
uchar i;
for(i=*pkg;i;i--)
SdCmd(*(++pkg)); //pkg 数组首地址存放指令包的数据量,包括指令代码
CmdEnd();
delay_us(15);
}
//-----------------------------------
// 初始化必备子程序
//-----------------------------------
void SdReg(uchar regcode, uint regdata)
{
uchar i,j,Buffer[4];
GpioData=0xff;
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x41;
Buffer[3]=0xf2;
Buffer[4]=GpioData; // 设置值写入GPOI端口
WritePKG(Buffer);
SENA=0; //串口使能SENA=0;
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x41;
Buffer[3]=0xf2; // 寄存器F241
Buffer[4]=GpioData; // 设置值写入GPIO口
WritePKG(Buffer);
for(j=0;j<3;j++) // 写6次循环
{
switch (j)
{
case 0:BitData=regcode;break; // 功能寄存器写入特征码
case 1:BitData=regdata>>8;break; // 寄存器数据高8位
case 2:BitData=regdata;break; // 寄存器数据低8位
}
for (i=0;i<8;i++)
{
SCLK=0; // SCLK=0;
SDIN=BitData7; // 数据高位写入串口数据线
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x41;
Buffer[3]=0xf2;
Buffer[4]=GpioData; // 设置值写入GPIO端口
WritePKG(Buffer);
SCLK=1; // SCLK=1
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x41;
Buffer[3]=0xf2;
Buffer[4]=GpioData; // 设置值写入GPIO端口
WritePKG(Buffer);
BitData=BitData<<1;
}
}
GpioData=0xff;
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x41;
Buffer[3]=0xf2;
Buffer[4]=GpioData; // 设置值写入GPOI端口
WritePKG(Buffer);
}
//-----------------------------------
// 初始化子程序
//-----------------------------------
void initLCDM(void)
{
old_SFRPAGE = SFRPAGE;
SFRPAGE = 0x0F;
com_add=0xff; // init all the port
CS=1;
RES=1;
A1=0;
WR=1;
SFRPAGE = old_SFRPAGE;
RES=0; delay_ms(1);
RES=1;
delay_s(1);
// execute all the setting in above
WritePKG(Set_F500);
WritePKG(Set_F504); WritePKG(Set_F505);
WritePKG(Set_F6C4);
WritePKG(Set_8F);
WritePKG(Set_F240); WritePKG(Set_F241);
SdReg(0x70,0x001e); SdReg(0x72,0x00a8);// 色彩饱和度初始化设置值
WritePKG(Set_F080);
WritePKG(Set_F08E);
WritePKG(Set_F090); WritePKG(Set_F091);
WritePKG(Set_F092); WritePKG(Set_F094);
WritePKG(Set_F095); WritePKG(Set_F096);
}
//-----------------------------------
// 前景色设置子程序(适用于图形)
//-----------------------------------
void SetFgColor(uint color)
{
uchar Buffer[4];
Buffer[0]=3;
Buffer[1]=0x20; // 或者0x14 前景色设置指令代码
Buffer[2]=color; // 色彩数据低8 位
Buffer[3]=color>>8; // 色彩数据高8 位
WritePKG(Buffer);
}
//-----------------------------------
// 前景色设置子程序(适用于字体)
//-----------------------------------
void SetFontFgColor(uint color)
{
uchar Buffer[4];
Buffer[0]=3;
Buffer[1]=0x14;
Buffer[2]=color;
Buffer[3]=color>>8;
WritePKG(Buffer);
}
//-----------------------------------
// 背景色设置子程序(仅用于字符)
//-----------------------------------
void SetFontBgColor(uint color)
{
uchar Buffer[4];
Buffer[0]=3;
Buffer[1]=0x15; //背景色设置指令代码
Buffer[2]=color; // 色彩数据低8 位
Buffer[3]=color>>8; // 色彩数据高8 位
WritePKG(Buffer);
}
//-----------------------------------
// ASCII 字符串写入子程序(最多一次写入63个字符)
//-----------------------------------
void PrintASCII(uint X, Y, uchar *pstr)
{
uchar Buffer[6], TempData[3], NoOfChar;
TempData [0]=2; // 指令包数据量设置
TempData [1]=0x10; // 字库选择指令代码
TempData [2]=0x00; // 字库选择,使用内部 8x8 ASCII 字库
WritePKG(TempData);
Buffer[0]=5; // 指令包数据量设置
Buffer[1]=0x12; // 显示位置设置指令代码
Buffer[2]=X; // X 坐标低8 位
Buffer[3]=X>>8; // X 坐标高8 位
Buffer[4]=Y; // Y 坐标低8 位
Buffer[5]=Y>>8; // Y 坐标高8 位
WritePKG(Buffer);
NoOfChar=strlen(pstr); // 计算数组长度
SdCmd(0x1