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

📄 debug.c

📁 电子条屏程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//  以下程序为板06-396作为远方超市 电子钟带条屏程序,LED单元板为3.7旧板

#include  "reg52.h"
#include  "stdio.h"
#include  "intrins.h"
#include  "absacc.h"
#define   uchar   unsigned char
#define   uint    unsigned int
#define   ulint   unsigned long int
#define   TIME1       100
#define   TIME2       200
#define   TIME3       300
#define   TIME4       100      //去抖延时
#define   START_PT    0
//#define   START_PT    0
#define  COUNTADDR         0XC0      //计数值在DS1302中存储起始地址 先低位后高位 C0/C2/C4...-WRITE C1/C3/C5...-READ 3个字节(ASC)
#define  MODEL_ID_ADDR     0xe0
#define  CT_1            0        // OE 极性  改变极性可更改此宏
#define  CT_0            1
#define  RED0             0X01
#define  RED1             0X02
#define  DAT_INVERSE      0Xff;      //  数据反 0xff ,数据正常 0x00
/********** LED 屏寄存器地址定义************/
#define    SCAN       XBYTE[0X8000]
#define    CT_REG     XBYTE[0X8001]
#define    SC_REG     XBYTE[0X8002]
#define    SC_REG1    XBYTE[0X8006]
#define    IN_OE      XBYTE[0X8003]        // LED显示板数据输入允许端 0允许  1禁止
#define    EXT_ADDR   XBYTE[0X8004]        // EEPROM 29C040 扩展地址  A15,A16,A17,A18
#define    RELAY_REG  XBYTE[0X8007]
/*******************************************/

// i2c 程序部分定义
#define FALSE	0
#define TRUE	1
#define NOP  _nop_(); _nop_();_nop_();
#define DeviceAddr  0xa0
#define MAX_WAIT_COUNT    100
#define MAX_RETRY   3

sbit    DE = P3^5 ;
sbit    CS1 =  P2^7;
/********************************************/
sbit    IO_CE=  P1^6;        //外部IO选择,为1选择CPLD,为0选择eeprom

sbit    DAT =P1^7;
sbit    SRCLK =P3^2;
sbit    CLK  =P3^3;

//*****************************************************************
sbit     T_CLK = P1^0;    /*实时时钟时钟线引脚 */
sbit     T_IO  = P1^1;    /*实时时钟数据线引脚 */
sbit     T_RST = P1^4;    /*实时时钟复位线引脚 */
//********************************************************************
sbit     ACC7=ACC^7;
sbit     ACC0=ACC^0;
//uchar code  string[]="01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789abcdefghijklmnopqrstuvwxyz";
//0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
uchar    code     led_seg7[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6}; //6B595
 uchar  data   time_sec;
 static uchar  idata  timemem[7];
uint   data   row=0;
uint    data   pt_col=START_PT;
uint  data  flashaddr;
uint    data  flash_addr;

uchar xdata *xp_rbuffer;
uchar   data   over_count;    //回车累计变量,为4时即为通信结束
uint    data   timeout;
uint   counter1;
uint   counter0;
uchar  model_id;
uchar   KEY;
bit     update;
bit     keyflag;
bit     ledflag;
bit     receiveflag;
union
    {
    uchar dpl;
    uchar dph;
    uint  dptr;
    } dp;

void  delay(unsigned int time0)
      {
       while(time0--);

      }

/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/*/
/*********************************************************************/
/*
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
        uchar i;
        ACC = ucDa;
        for(i=8; i>0; i--)
                 {
                 T_IO = ACC0;   /*相当于汇编中的 RRC */
                 T_CLK = 1;
                 T_CLK = 0;
                 ACC = ACC >> 1;
                   }
}


/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
  uchar i;
  for(i=8; i>0; i--)
           {

           ACC=ACC>>1;    /*相当于汇编中的 RRC */
           ACC7=T_IO;
           T_CLK=1;
           T_CLK=0;
           }
           return(ACC);
}



/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(ucAddr); /* 地址,命令 */
        v_RTInputByte(ucDa); /* 写1Byte数据*/
        T_CLK = 1;
        T_RST =0;
}



/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputBytk()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
        uchar ucDa;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        v_RTInputByte(ucAddr);    /* 地址,命令 */
        ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
        T_CLK = 1;
        T_RST =0;
        return(ucDa);
}


/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar idata *pSecDa)
{
        uchar i;
        uchar ucAddr = 0x80;
        v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
        for(i =7;i>0;i--)
              {
              v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

              pSecDa++;
              ucAddr +=2;
              }
       v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}


/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar idata *ucCurtime)
{
        uchar i;
        uchar ucAddr = 0x81;
        for (i=0;i<7;i++)
            {
            *ucCurtime++=uc_R1302(ucAddr);   /*格式为: 秒 分 时 日 月 星期 年 */
            ucAddr += 2;
             }
 }

void charge()      //DS1302 充电
    {
           v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
           v_W1302(0x90,0xa5); // 选用一个二极管及一个2K电阻
           v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/

    }


uint  LoadCounter(uchar number)
{
   union
   {
      uchar byte[2];
      uint  word;
   }num;
   number=number*2+1;
   num.byte[0]=uc_R1302(COUNTADDR+number);
   num.byte[1]=uc_R1302(COUNTADDR+number+2);

   return(num.word);

}
uchar  LoadModelId()
{
   uchar model_id;
   model_id=uc_R1302(MODEL_ID_ADDR+1);

   return(model_id);

}
void  SaveModelId(uchar model_id)
{
   v_W1302(0x8e,0x00);
   v_W1302(MODEL_ID_ADDR,model_id);
   v_W1302(0x8e,0x80);

}

void SaveCounter(uchar number,uint counter)
{
  union
   {
      uchar byte[2];
      uint  word;
   }num;
   number=number*2;
   num.word=counter;

     v_W1302(0x8e,0x00);
     v_W1302(COUNTADDR+number,num.byte[0]);
     v_W1302(COUNTADDR+number+2,num.byte[1]);
     v_W1302(0x8e,0x80);

}
void  SetTime(uchar xdata *pt_time)
{
   uchar idata *ip_time;
   uchar data high;
   uchar data low;
   ip_time=timemem;

   high=*(pt_time+19);         //秒
   high=(high-0x30)<<4;
   low=*(pt_time+20);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;

   high=*(pt_time+16);       // 分
   high=(high-0x30)<<4;
   low=*(pt_time+17);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;


   high=*(pt_time+13);       // 时
   high=(high-0x30)<<4;
   low=*(pt_time+14);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;

   high=*(pt_time+8);       // 日
   high=(high-0x30)<<4;
   low=*(pt_time+9);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;

   high=*(pt_time+5);        // 月
   high=(high-0x30)<<4;
   low=*(pt_time+6);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;

   low=*(pt_time+11);      // 星期
   low=(low-0x30)&0x0f;
   if((low==0)||(low==8))
              low=7;
   *ip_time++=low;
                            // 年
   high=*(pt_time+2);
   high=(high-0x30)<<4;
   low=*(pt_time+3);
   low=(low-0x30)&0x0f;
   *ip_time++=high|low;

    v_Set1302(timemem);

}

void  DispNumToLed(uchar dat)
{
      uchar data d;
      uchar data i;
      d=led_seg7[dat];
        for(i=0;i<8;i++)
        {
          d<<=1;
          DAT=CY;
          _nop_();
          _nop_();
          CLK=0;
          _nop_();
          _nop_();
          _nop_();
          CLK=1;
        }

}
void IntToChar(uint num,uchar data *pt_array)
{
  *pt_array++=num/1000;
  *pt_array++=(num%1000)/100;
  *pt_array++=(num%100)/10;
  *pt_array++=num%10;

}
void  led_disp()
{
  uchar i;
  uchar j;
  uchar d;
  uchar num_array[4];
  uchar  idata *p_time=timemem;     //指向内存中的时间位置
  uchar  data   time;
 //if(ledflag)
   {

        DispNumToLed(2);
        DispNumToLed(0);

         time=*(p_time+6);                // 年
         DispNumToLed((time&0xf0)>>4);
         DispNumToLed(time&0x0f);


         time=*(p_time+4);                //月
         DispNumToLed((time&0xf0)>>4);
         DispNumToLed(time&0x0f);

         time=*(p_time+3);                //日
         DispNumToLed((time&0xf0)>>4);
         DispNumToLed(time&0x0f);


         time=*(p_time+5);               // 星期
         if(time==7)
                 time=8;
         DispNumToLed(time&0x0f);

                                          // 时
         time=*(p_time+2);
         DispNumToLed((time&0xf0)>>4);
         DispNumToLed(time&0x0f);

         time=*(p_time+1);                  //分
         DispNumToLed((time&0xf0)>>4);
        DispNumToLed(time&0x0f);

         time=*(p_time+0);                  // 秒
         DispNumToLed((time&0xf0)>>4);
         DispNumToLed(time&0x0f);

        SRCLK=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SRCLK=1;
        ledflag=0;
   }


}


//********************************* FLASH  读写程序 ****************************
void  Flash_Write(uchar page,uchar xdata *source,uchar xdata *destination)
{
  uint data i;
  IO_CE=1;
  EXT_ADDR=0;
  IO_CE=0;
  XBYTE[0xD555]=0xaa;      //load 0xaa to adresss 5555
  XBYTE[0xAAAA]=0x55;      //load 0x55 to address 2aaa
  XBYTE[0xD555]=0xa0;      //load 0xa0 to adresss 5555
  IO_CE=1;
  EXT_ADDR=page;
  IO_CE=0;
  for(i=0;i<256;i++)
  {
     *destination++=*source++;
  }

  delay(10000);


}

void  Flash_Erase()
{

}

void  Dis_Flash_Protect()
{
  IO_CE=1;
  IO_CE=0;
  XBYTE[0xD555]=0xaa;
  XBYTE[0xAAAA]=0x55;
  XBYTE[0xD555]=0x80;
  XBYTE[0xD555]=0xaa;
  XBYTE[0xAAAA]=0x55;
  XBYTE[0xD555]=0x20;
  delay(20000);


}

void SaveModel(uchar xdata *xp_ram)
{
   uint data i;
   uint data j;
   uchar data k;
   uchar data page_flash;
   uchar xdata *xp_flash;
   uchar data row;

     page_flash=0x43000/0x7fff;
     xp_flash=0x43000|0x8000;
               IO_CE=1;
               EXT_ADDR=0;
               IO_CE=0;
               XBYTE[0xD555]=0xaa;      //load 0xaa to adresss 5555
               XBYTE[0xAAAA]=0x55;      //load 0x55 to address 2aaa
               XBYTE[0xD555]=0xa0;      //load 0xa0 to adresss 5555
               IO_CE=1;
               EXT_ADDR=page_flash;
               IO_CE=0;

                for(i=0;i<256;i++)
                {
                    if(xp_ram<0x7fff)
                    {
                      *xp_flash++=*xp_ram++;
                    }
                    else
                    {
                       *xp_flash++=' ';
                    }

                }
                  delay(10000);

}

uint  LoadSetValue(uchar number)
{
   uint  setvalue;
   uchar xdata *xp_flash;
   uchar data  page_flash;
   uchar num[4];
   uchar data  i;

⌨️ 快捷键说明

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