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

📄 mdt.c

📁 这是一个用C写的单片机程序
💻 C
📖 第 1 页 / 共 4 页
字号:
//==================================================================
//软件名称:MDT GPS显示终端
//终端本版:3.5
//软件版本:1.0
//委托人:万向通信
//系统构成:AT89C52+汉字+R232+LCM
//液晶格式:128*128,10*10汉字(汉字点阵12*12)
//R232通信协议:115200 8 N 1
//电源电压+5V
//编译器:KEIL 6.12
//液晶规格:AM128128-28A57;S6B0741
//设计单位:安的利光电科技有限公司:研发部
//==================================================================
#include <REGS52.H>

#include "symbol.h"

//==================================================================
//宏定义:S6B0741相关参数
//==================================================================
#define ICON_ON 0XA3					//ICON开
#define ICON_OFF 0XA2				//ICON关
#define SET_PAGE 0XB0				//+立即数,0-.15页
#define SET_COLUMN_MSB 0X10		//+立即数,列地址高3位。
#define SET_COLUMN_LSB 0X00		//+立即数,列地址低4位。
#define SET_MODIFY_READ 0XE0		//进入读修改模式
#define RESET_MODIFY_READ 0XEE	//取消读修改模式
#define DISP_ON 0XAF					//显示开
#define DISP_OFF 0XAE				//显示关
#define SET_START_LINE 0X40		//1字节参数:设置RAM起始行对应com0地址,0-.0x7f
#define SET_COM0 0X44				//1字节参数:设置屏幕起始行对应com0地址,0-.0x7f
#define SET_DUTY 0X48				//1字节参数:0x0f-.0x80 对应1/16-.1/128
#define SET_NLINE_INV 0X4C			//1字节参数:0x01-.0x1f 对应3-.33 lines inversion
#define RELEASE_NLINE_INV 0XE4	//等同 SET_NLINE_INV 设置为0X00, FRAME INV状态。
#define REV_DISP_ON 0XA7			//反白显示开
#define REV_DISP_OFF 0XA6			//反白显示关
#define ENTIRE_ON 0XA5				//整屏全显开
#define ENTIRE_OFF 0XA4				//整屏全显关
#define POWER_CONTROL 0X28			//立即数,开通顺序:DB2:VC-.DB1:VR-.B0:VF
#define SET_DC_STEP 0X64			//立即数,D1D0 00-.11 对应3-.6倍压
#define SEL_REG_RESISTOR 0X20		//立即数,D2D1D0-.R2R1R0,此处取111
#define SET_VOL 0X81					//1字节参数:0X00-.0X3F, 0-.63 对比度
#define SET_BIAS 0X50				//立即数,D2D1D0,0-.7 对应1/5-.1/12
#define SHL_NORMAL 0XC0				//行驱动方向:正常
#define SHL_REV 0XC8					//行驱动方向:反向
#define ADC_NORMAL 0XA0				//列驱动方向:正常
#define ADC_REV 0XA1					//列驱动方向:反向
#define OSC_ON 0XAB					//震荡器开
#define POWER_NORMAL 0XA8			//电源正常工作模式
#define POWER_SLEEP 0XA9			//电源休眠模式:屏幕驱动关;震荡器关。
#define POWER_RELEASE 0XE1			//结束电源休眠:唤醒
#define RESET 0XE2					//复位除显示存储器之外的寄存器
#define SET_FRC_PWM 0X90			//立即数,D2D1D0-.FRC(0:4FRC,1:3FRC) PWM1 PWM0(00/01:9,10:12,11:15)

//==================================================================
//根据FRC PWM的设置,设置对应的4级灰度级。
//2字节参数,(4BIT+4BIT)*2
//==================================================================
#define SET_W_12	0X88
#define SET_W_34	0X89
#define SET_LG_12 0X8A
#define SET_LG_34 0X8B
#define SET_DG_12 0X8C
#define SET_DG_34 0X8D
#define SET_B_12	0X8E
#define SET_B_34	0X8F


//==================================================================
//宏定义:字库片选及液晶模组片选
//==================================================================
//#define en_rom(){

#define Off_Lcd(){ \
	LCDCS=1;\
	}
#define En_Lcd(){\
	LCDCS=0;\
    En_Lcd_Flag=1;\
	}


//==================================================================
//宏定义:液晶寄存器地址和显示存储器地址定义
//==================================================================
#define Reg_Add		0x8000;	//RS=0对寄存器写入操作地址
#define Data_Add	0x8100;	//RS=1对存储器写入操作地址


//==================================================================
//宏定义:显示行位置偏移量
//==================================================================
//#define	S_TAB 0		//信号行起始	0 PIX
#define	T_TAB 4			//标题行起始	4 PIX
#define	M_TAB 8;		//消息行起始	7 PIX
#define	BT	1;			//BAUD=115200/BT


//==================================================================
//键盘码定义
//==================================================================
unsigned char code s1_enter[14]  ={"{S1^K&ENTER|0}"};
unsigned char code s1_menu[11]   ={"{S1^K&MENU}"};
unsigned char code s1_call[13]   ={"{S1^K&CALL|0}"};
unsigned char code s1_cancel[11] ={"{S1^K&CNCL}"};
unsigned char code s1_forward[13]={"{S1^K&FRWD|0}"};
unsigned char code s1_back[14]   ={"{S1^K&BACK|<0}"};

unsigned char code s6_enter[12]  ={"{S6^K&ENTER}"};
unsigned char code s6_menu[11]   ={"{S6^K&MENU}"};
unsigned char code s6_call[11]   ={"{S6^K&CALL}"};
unsigned char code s6_cancel[11] ={"{S6^K&CNCL}"};
unsigned char code s6_forward[11]={"{S6^K&FRWD}"};
unsigned char code s6_back[11]   ={"{S6^K&BACK}"};

unsigned char code blank[]={"        "};
//==================================================================
//定义:内部信号定义
//==================================================================
sbit LCDCS=P3^3;
//sbit RESETB=P3^1;
sbit	RS=P3^5;

sbit ADDR15=P3^5;
sbit ADDR16=P1^0;
sbit ADDR17=P1^1;

sbit Key_Scroll_Up=P1^2;
sbit Key_Scroll_Down=P1^3;
sbit Key_Menu=P1^6;
sbit Key_Enter=P1^5;
sbit Key_Cancel=P3^4;
sbit Key_Forward=P3^2;
sbit Key_Back=P1^7;
sbit Key_Call=P1^4;

//==================================================================
//宏定义:发送缓存区参数
//==================================================================
#define Rx_Length	1024

//==================================================================
//宏定义:字库缓存区参数
//==================================================================
#define ZK_Length	36

//==================================================================
//定义:缓存区
//==================================================================
unsigned char xdata Recieve_Buff[Rx_Length];
unsigned char idata Matrix_Data[ZK_Length];

unsigned char idata Transfer[21];

//==================================================================
//定义:变量定义
//==================================================================

unsigned char xdata *pt;				//外部存储器地址指针
unsigned char code *pt_code;				//外部程序存储器地址指针

unsigned int P_Rx=0;		//SRAM接收指针,存入缓冲区数据
unsigned int P_Rd=0;		//SRAM读取指针,处理缓冲区数据

unsigned char Asc_X=0,Asc_Y=0;	//字符坐标
unsigned int X_Offset=0, Y_Offset=0;		//相对字节的像素偏移量X_OFFSET;像素行:Y_OFFSET;

unsigned char Lcm_Page;			//显示存储器的页

unsigned char Line_Tab=0;			//用于校正标题,信号,信息行的偏移

bit Bg_Gray=0;					//灰度显示标志,当BG_GRAY=1写入灰度数据。

bit RS232_Flag=0;                //通讯有效标志位。  
bit Tx_Done=0;
bit En_Lcd_Flag=0;

unsigned char T_Tx=0;
unsigned char Tx_Length;


bit Message_On_Flag=0,Reverse_Flag=0,Sel_Flag=0;
bit Roll_Arrow=0,Roll_En=0;
bit Key_Type=0;						//Recieve message type, if Key_Type=1, Is message S6, else is Menu S1.
bit IP_En=0;							//IP通信标志
bit Enter_En=0;						//换行允许标志
bit Sys_Status_Flag=0;				//系统状态显示标志,用于切割长于20字符的显示内容


//==================================================================
//宏定义:接受缓存区参数
//==================================================================
#define Mess_Line	100
#define Mess_Width	100
//==================================================================
//结构定义:接收
//==================================================================
xdata struct
{
unsigned char  page_line[Mess_Width];
unsigned char  high_light;
} Message_Buff[Mess_Line]; // _at_ 0x1000;


//==================================================================
//宏定义:显示缓存区参数
//==================================================================
#define Buff_Line   992	//display total lines 992=10(页)*8(行)*12+32

//==================================================================
//结构定义:定义显示数据缓存区
//==================================================================
xdata struct
{
unsigned char Column[Buff_Line];
} Buff_Page[16]; 					// _at_ 0x3a00;

unsigned char TPAGE=0;

unsigned char Active_Line=1;		//当前激活行
unsigned char Total_Line=Mess_Line;	//接收信息的总行
unsigned char Start_Line=0;			//screen display start line number.

unsigned char xdata heading[8];
unsigned char xdata speed[8];
unsigned char xdata date[16];
unsigned char xdata time[16];
bit StandMess_Flag=0;
//==================================================================
//待机计数器定义
//==================================================================
unsigned long int Wait_Time=0;
bit First=1;
#define Stand_Time	30000	//1分钟
//#define Stand_Time	60000		//1分钟
//#define Stand_Time	120000	//2分钟
//#define Stand_Time	180000	//3分钟
//#define Stand_Time	240000	//4分钟
//#define Stand_Time	300000	//5分钟
//#define Stand_Time	360000	//6分钟
//#define Stand_Time	420000	//7分钟
//#define Stand_Time	480000	//8分钟
unsigned int Stand_Count=0;		//待机画面切换时间单位
unsigned char Stand_N=0;   		//画面切换代码
bit StandBy_Flag=0;

bit NewMail_Flag=0;
bit FirstMail=1;
unsigned int Mail_Numb=0;
//==================================================================
//函数预定义
//==================================================================

void Key_Scan();
void Stand_By();
void Disp_Title();
void Disp_Message();
void Print_Window(unsigned char n_com,unsigned char n_page, unsigned char n_height,unsigned char *pic);
void Print_Box(unsigned char *pic);
void Print_Line(unsigned char *str);


//==================================================================
//				延时程序
//==================================================================
void Delay(int t)
{
char n=0xff;
	while(--t>0)
		while(--n>0);
}
void Print_SN()
{
unsigned char i, SN[9];
        pt_code=0x1ff8;
        for(i=0;i<8;i++)
	        SN[i]=*pt_code++;
        SN[8]=0;
        Print_Line("序列号:");
        Print_Line(SN);                 
}
//==================================================================
//中断方式向串口发送一个字符串,strlen为该字符串长度
//==================================================================
void Int_Tx(unsigned char strlen)
{
	Tx_Done=1;
	Tx_Length=strlen;
	T_Tx=0;
	TI=1;
	if(Wait_Time==Stand_Time){
		Wait_Time=0; Stand_N=0; First=1;
		StandBy_Flag=0;
		Disp_Title();
		Disp_Message();
	}
}

//==================================================================
//					键盘代码拷贝 str1 to str2 
//==================================================================

void Copy_Key(unsigned char *str1, unsigned char *str2)
{
unsigned char i=0;
    do{
		str2[i]=str1[i];
	}while(str1[i++]!='}');
return;
}

//==================================================================
//					要素判断
//==================================================================

bit Check_Element(unsigned char ch)
{
if(ch=='*') {Message_On_Flag=1; Reverse_Flag=0;Sel_Flag=1; return(1);}
else if(ch=='+') {Message_On_Flag=1; Reverse_Flag=0; Sel_Flag=0; return(1);}
else if(ch=='-') {Message_On_Flag=0; Reverse_Flag=0; Sel_Flag=0; return(1);}
else if(ch=='&') {Reverse_Flag=1; return(1);}
else return(0);
}

//==================================================================
//					清除消息显示存储区数据
//==================================================================
void Clr_Mess_Buff()
{
unsigned char i,j;
	for(i=0;i<Total_Line;++i){
		for(j=0;j<Mess_Width;++j){
		    Message_Buff[i].page_line[j]=0;
		}
		Message_Buff[i].high_light=0;
	}
}
//==================================================================
//				判断是否有新消息来
//==================================================================
void Check_MailNumber()
{
   unsigned char i;
   unsigned int mnumb;
   for(i=0;i<6;i++){
     if(Message_Buff[1].page_line[i]!=mail[i]) break;
   }
   if(i==6){
	   mnumb=Message_Buff[1].page_line[7]*10+Message_Buff[1].page_line[8];
	   if(FirstMail!=1){
		   if(mnumb!=Mail_Numb) NewMail_Flag=1;
	   } 
	   else FirstMail=0;
	   Mail_Numb=mnumb;
   }
}
//==================================================================
//					判断是否是消息内容显示,是则允许换行
//==================================================================
void Check_Enter()
{
unsigned char i;
   for(i=0;i<6;i++){
     if(Message_Buff[0].page_line[i]!=mail[i]) break;
   }
   if(i<6) Enter_En=0;
   else  Enter_En=1;
}

//==================================================================
//					判断是否是系统状态显示,是则去除多余卫星数据
//==================================================================
void Check_System()
{
unsigned char i;
   for(i=0;i<8;i++){
     if(Message_Buff[0].page_line[i]!=system[i]) break;
   }
   if(i<8) Sys_Status_Flag=0;
   else Sys_Status_Flag=1;
}


//============================================================
// 设置指令寄存器
//============================================================

void Write_S6b0741_Reg(unsigned char reg_data)
{
	pt=Reg_Add;
	EA=0;
	En_Lcd();
    RS=0; 
	*pt=reg_data;
	RS=1;
    Off_Lcd();
	En_Lcd_Flag=0;
	EA=1;
	return;
}

//============================================================
// 写显示数据
//============================================================
void Write_S6b0741_Data(unsigned char disp_data)
{
unsigned char i=0;

	En_Lcd();
    RS=1;
	pt=Data_Add;
	EA=0;
	En_Lcd();
	if(Bg_Gray){
		*pt=disp_data;
		*pt=0x00;
	}
	else{
		*pt=disp_data;
		*pt=disp_data;
	}
    Off_Lcd();
	En_Lcd_Flag=0;
	EA=1;
	return;
}


//============================================================
// 填充屏幕
//============================================================

⌨️ 快捷键说明

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