📄 lcddram.c
字号:
#include <absacc.h>
#include <reg51.h>
#define eeprom_addr 0x8050;
//sbit cs_dram=P3^2;
sbit busy=P1^5;
sbit WatchDog = P1^3; //看门狗
// 运行状态1,自动 2,手动3,遥控 4,软件绿冲突 5.硬件绿冲突 6.线圈故障降级使用
unsigned char xdata run_state=1; // 运行状态1,自动 2,手动3,遥控 4,软件绿冲突 5.硬件绿冲突 6.
extern unsigned int xdata data_address;
extern unsigned int xdata address;
extern unsigned int xdata tr_flagaddr;
extern unsigned char xdata now_day_planid;
extern unsigned char xdata timeid;
extern unsigned char xdata now_schemeid;
extern unsigned char xdata now_step_schid;
extern unsigned char xdata step_counter;
extern unsigned char xdata now_step_uncount;
extern unsigned char xdata led83[30],led82[5];
extern unsigned char xdata step_num;
unsigned char xdata tt,ttd,ch[100];
unsigned int xdata utemp;
unsigned char cpu_fpga_set(unsigned char flag,unsigned int ptr,unsigned int len)
{
unsigned int i;
data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1;
address=data_address;
data_address=data_address+len; //应答数据长度1字节
if(data_address>0xa7f0)data_address=data_address-0xa7f0+0xa080;
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改头尾
XBYTE[0xa023]=0x01; //CPU修改头尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
data_address=(data_address&0x7ff);
address=data_address;
data_address=data_address+len; //应答数据长度1字节
if(data_address>0xa7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改头尾结束
XBYTE[0XA024]=0X00;
XBYTE[tr_flagaddr+1]=address>>8; //发送数据的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //发送数据的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000; //发送应答数据
if(address>0xa7f0)address=0xa080;
XBYTE[address]=flag;
address++;
for(i=0;i<len;i++){
XBYTE[address+i]=XBYTE[ptr+i];
}
XBYTE[tr_flagaddr]=0x01;
return 1;
}
deal_lcddram()
{
unsigned char flag,tq;
unsigned char id,fu;
unsigned char idcode;
unsigned int i,j,k,num,addr;
//查询
do{ }while(busy==0);
flag=XBYTE[0XC408];
do{ }while(busy==0);
id=XBYTE[0XC40A];
do{ }while(busy==0);
fu=XBYTE[0XC40b];
do{ }while(busy==0);
idcode=XBYTE[0XC40c];
if(flag==1){
// EA=0;
switch(id){
case 0x80: //do{WatchDog = !WatchDog;}while(busy==0);XBYTE[0XC410]=0XC0;
do{ }while(busy==0);XBYTE[0XC410]=XBYTE[0X8002];
do{ }while(busy==0);XBYTE[0XC411]=XBYTE[0X8003];
do{ }while(busy==0);XBYTE[0XC412]=XBYTE[0X8004];
do{ }while(busy==0);XBYTE[0XC413]=XBYTE[0X8005];
do{ }while(busy==0);XBYTE[0XC414]=XBYTE[0X8006];
do{ }while(busy==0);XBYTE[0XC415]=XBYTE[0X8007];
do{ }while(busy==0);XBYTE[0XC416]=XBYTE[0X8008];
do{ }while(busy==0);XBYTE[0XC408]=0;
break;
case 0x82: do{ }while(busy==0);XBYTE[0XC410]=0XC2;
do{ }while(busy==0);XBYTE[0XC411]=0x20; //最大输出通道数
do{ }while(busy==0);XBYTE[0XC412]=0X20; //支持阶段表数
do{}while(busy==0);XBYTE[0XC413]=0X20; //一个阶段表支持的最大阶段数
do{}while(busy==0);XBYTE[0XC414]=0X20; //最大控制方案数
do{}while(busy==0);XBYTE[0XC415]=0X20; //最大日计划数
do{}while(busy==0);XBYTE[0XC416]=0X18; //一个日计划支持的最大时段
do{}while(busy==0);XBYTE[0XC417]=XBYTE[0X72E2]; //开机时间小时
do{}while(busy==0);XBYTE[0XC418]=XBYTE[0X72E3]; //开机时间分钟
do{}while(busy==0);XBYTE[0XC419]=XBYTE[0X72E4]; //关机时间小时
do{}while(busy==0);XBYTE[0XC41a]=XBYTE[0X72E5]; //关机时间分钟
do{}while(busy==0);XBYTE[0XC41b]=XBYTE[0X72E6]; //关机后状态
do{}while(busy==0);XBYTE[0XC41c]=XBYTE[0X8000];
do{}while(busy==0);XBYTE[0XC41d]=XBYTE[0X8001];
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x83: do{}while(busy==0);XBYTE[0XC410]=0XC3;
do{}while(busy==0);XBYTE[0XC411]=XBYTE[0XC009]; //year
do{}while(busy==0);XBYTE[0XC412]=XBYTE[0XC008]; //month
do{}while(busy==0);XBYTE[0XC413]=XBYTE[0XC007]; //date
do{}while(busy==0);XBYTE[0XC414]=XBYTE[0XC004]; //hour
do{}while(busy==0);XBYTE[0XC415]=XBYTE[0XC002]; //min
do{}while(busy==0);XBYTE[0XC416]=XBYTE[0XC000]; //sec
do{}while(busy==0);XBYTE[0XC417]=XBYTE[0XC006]; //day
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x84: do{}while(busy==0);XBYTE[0XC410]=0XC4; //相位信息
if(idcode==0){
tq=XBYTE[0XC40D];
j=(tq-1)*18;
for(i=0;i<18;i++){
XBYTE[0XC411+i]=XBYTE[0x5001+i+j];
}
}else{
j=XBYTE[0XC40D];
j=(j-1)*18;
for(i=0;i<18;i++){
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x5122+i+j];
}
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x85: XBYTE[0XC410]=0XC5; //阶段表
j=(idcode-1)*98;
for(i=0;i<98;i++){
if(i==4){
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x5242+i+j]+1;
}else{
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x5242+i+j];
}
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x86: do{}while(busy==0);XBYTE[0XC410]=0XC6; //控制方案
j=(idcode-1)*41;
for(i=0;i<41;i++){
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x5e82+i+j];
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
// case 0x87:break;
case 0x88: do{}while(busy==0);XBYTE[0XC410]=0XC8; //日计划
j=(idcode-1)*74;
for(i=0;i<74;i++){
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x63A2+i+j];
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x89: do{}while(busy==0);XBYTE[0XC410]=0XC9; //日计划
j=XBYTE[0XC40c];
j=(j-1)*6;
for(i=0;i<60;i++){
do{}while(busy==0);XBYTE[0XC411+i]=XBYTE[0x6cE2+i+j];
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8a: ////////////////////////////////////////////
do{}while(busy==0);XBYTE[0XC410]=0XCa; //当前控制信息
do{}while(busy==0);XBYTE[0XC411]=led82[0]; //当天日计划号
do{}while(busy==0);XBYTE[0XC412]=led82[1]; //当天时段号
do{}while(busy==0);XBYTE[0XC413]=led82[2]; //当前控制方案号
j=(led82[2]-1)*41;
j=0x5e85+j;
if(XBYTE[j]==0){
do{}while(busy==0);XBYTE[0XC414]=0; //非协调方案
}else {
do{}while(busy==0);XBYTE[0XC414]=1; //协调方案
}
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8b: //阶段放行的相位
if((step_counter+1)==step_num){
led83[6]=1;
utemp=0x5244+(led83[0]-1)*98;
}else{
led83[6]=led83[1]+1;
utemp=0x5247+(led83[0]-1)*98+step_counter*3;
}
led83[9]=XBYTE[utemp];
led83[10]=XBYTE[utemp+1];
do{}while(busy==0);XBYTE[0XC410]=0XCb; //当前信号机状态
do{}while(busy==0);XBYTE[0XC411]=led83[0]; //当前控制方案附加信息 :当前阶段表号
do{}while(busy==0);XBYTE[0XC412]=led83[1]; //当前阶段
do{}while(busy==0);XBYTE[0XC413]=0x00;
do{}while(busy==0);XBYTE[0XC414]=0x00;
do{}while(busy==0);XBYTE[0XC415]=led83[4]; //当前阶段放行的相位
do{}while(busy==0);XBYTE[0XC416]=led83[5]; //当前阶段放行的相位
do{}while(busy==0);XBYTE[0XC417]=led83[6]; //下一阶段
do{}while(busy==0);XBYTE[0XC418]=0x00;
do{}while(busy==0);XBYTE[0XC419]=0x00;
do{}while(busy==0);XBYTE[0XC41a]=led83[9]; //下一阶段放行的相位
do{}while(busy==0);XBYTE[0XC41b]=led83[10];
do{}while(busy==0);XBYTE[0XC41C]=led83[11]; //当前阶段的倒计时
do{}while(busy==0);XBYTE[0XC41D]=led83[12]; //运行故障信息
do{}while(busy==0);XBYTE[0XC41E]=led83[13]; /*驱而不亮的红灯组*/
do{}while(busy==0);XBYTE[0XC41F]=led83[14]; /*驱而不亮的红灯组*/
do{}while(busy==0);XBYTE[0XC420]=led83[15]; /*驱而不亮的黄灯组*/
do{}while(busy==0);XBYTE[0XC421]=led83[16]; /*驱而不亮的黄灯组*/
do{}while(busy==0);XBYTE[0XC422]=led83[17]; /*驱而不亮的绿灯组*/
do{}while(busy==0);XBYTE[0XC423]=led83[18]; /*驱而不亮的绿灯组*/
do{}while(busy==0);XBYTE[0XC424]=led83[19]; /*不驱而亮的红灯组*/
do{}while(busy==0);XBYTE[0XC425]=led83[20]; /*不驱而亮的红灯组*/
do{}while(busy==0);XBYTE[0XC426]=led83[21]; /*不驱而亮的黄灯组*/
do{}while(busy==0);XBYTE[0XC427]=led83[22]; /*不驱而亮的黄灯组*/
do{}while(busy==0);XBYTE[0XC428]=led83[23]; /*不驱而亮的绿灯组*/
do{}while(busy==0);XBYTE[0XC429]=led83[24]; /*不驱而亮的绿灯组*/
do{}while(busy==0);XBYTE[0XC42a]=led83[25]; /*检测器故障*/
do{}while(busy==0);XBYTE[0XC42b]=led83[26]; /*检测器故障*/
do{}while(busy==0);XBYTE[0XC42c]=led83[27]; /*检测器故障*/
do{}while(busy==0);XBYTE[0XC42d]=led83[28]; /*检测器故障*/
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8c:
do{}while(busy==0);XBYTE[0XC410]=0XCC; //查询统计周期
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8d:
do{}while(busy==0);XBYTE[0XC410]=0XCd; //应答统计数据
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8e: do{}while(busy==0);XBYTE[0XC410]=0xde; //遥控阶段对应表
do{}while(busy==0);XBYTE[0XC411]=XBYTE[0X6d28];
do{}while(busy==0);XBYTE[0XC412]=XBYTE[0X6d29];
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x8f: switch(fu){ //新中新增补协议
case 0x8b:do{}while(busy==0);XBYTE[0XC410]=0xcf; //运行状态参数
do{}while(busy==0);XBYTE[0XC411]=0x8b;
do{}while(busy==0);XBYTE[0XC412]=run_state;
do{}while(busy==0);XBYTE[0XC408]=0;
break;
case 0x02:do{}while(busy==0);XBYTE[0XC410]=0xcf; //特征参数
do{}while(busy==0);XBYTE[0XC411]=0x02;
for(i=0;i<5;i++){//开关机时间,关机后状态
do{}while(busy==0);XBYTE[0XC412+i]=XBYTE[0X801A+i];
}
do{}while(busy==0);XBYTE[0XC417]=XBYTE[0X8000]; //路口编号
do{}while(busy==0);XBYTE[0XC418]=XBYTE[0X8001];
do{}while(busy==0);XBYTE[0XC419]=XBYTE[0X8008]; //主从标志
for(i=0;i<17;i++){
do{}while(busy==0);XBYTE[0XC41a+i]=XBYTE[0X8009+i];
}
do{}while(busy==0);XBYTE[0XC41a+i]=XBYTE[0X801f];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -