📄 mdt.c
字号:
//==================================================================
//软件名称: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 + -