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

📄 lcddram.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -