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

📄 rem_main.c

📁 我最初用TMS320F240芯片作开发
💻 C
📖 第 1 页 / 共 2 页
字号:

         *GPFDAT=*GPFDAT | 0x80;              /* 设置24C08的SCL脚为高电平 */   /***************************/
         Delay_us(5);                                                          /* 第9个时钟产生NO ACK信号 */
         *GPFDAT=*GPFDAT & 0xFF7F;            /* 设置24C08的SCL脚为低电平 */   /***************************/
         Delay_us(5);
         EDIS;
        }
      if((m & 1)==0) *p=reg*256;              /* 接收的数据存入表的高8位 */
      else *p=*p+reg,p++;                     /* 接收的数据存入表的低8位 */
     }
     *GPFDAT=*GPFDAT & 0xFFBF;                /* 即SDA输出0 */                 /**************************/
     Delay_us(5);                                                              /* 第10个时钟产生STOP信号 */
     *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /**************************/
     Delay_us(5);
     *GPFDAT=*GPFDAT | 0x40;                  /* 即SDA输出1 */
}

/****   Write EEPROM Function   ****/
void Write_eeprom(unsigned int x,unsigned int y,unsigned int z)  /* 该函数用于将table[z]起始的数据存入以起始地址为x的,长度为y的EEPROM存储块中 */
{    unsigned int shift,device_address;
     int n;
     int *p=&table[z];

     device_address=0xA0;                      /* 第0位为0,表示写 */
     shift=0x80;

     *GPFDAT=*GPFDAT & 0xFFBF;                 /* 设置24C08的SDA脚为低电平 */   /*****************/
     Delay_us(5);                                                               /* 产生START信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                 /* 设置24C08的SCL脚为低电平 */   /*****************/
     Delay_us(5);

     for(n=7;n>=0;n--)                         /* 发送device_address */
     {if((device_address & shift)==0)
        *GPFDAT=*GPFDAT & 0xFFBF;              /* GPIO F9,即DAT输出0 */
      else *GPFDAT=*GPFDAT | 0x40;             /* GPIO F9,即DAT输出1 */
      *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /*******************/
      Delay_us(5);                                                              /* 产生CLK时钟信号 */
      *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /*******************/
      Delay_us(5);
      shift=shift/2;                           /* 即使移位控制位右移1位 */
     }

     EALLOW;                                   /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFFBF;                 /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

     *GPFDAT=*GPFDAT | 0x80;                   /* 设置24C08的SCL脚为高电平 */   /************************/
     Delay_us(5);                                                               /* 第9个时钟产生ACK信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                 /* 设置24C08的SCL脚为低电平 */   /************************/
     Delay_us(5);

     *GPFDIR=*GPFDIR | 0x40;                   /* 设置DSP的I/O脚为输出 */
     EDIS;

     shift=0x80;
     for(n=7;n>=0;n--)                         /* 发送word_address */
     {if((x & shift)==0)
        *GPFDAT=*GPFDAT & 0xFFBF;              /* GPIO F9,即DAT输出0 */
      else *GPFDAT=*GPFDAT | 0x40;             /* GPIO F9,即DAT输出1 */
      *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /*******************/
      Delay_us(5);                                                              /* 产生CLK时钟信号 */
      *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /*******************/
      Delay_us(5);
      shift=shift/2;                           /* 即使移位控制位右移1位 */
     }

     EALLOW;                                   /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFFBF;                 /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

     *GPFDAT=*GPFDAT | 0x80;                   /* 设置24C08的SCL脚为高电平 */   /************************/
     Delay_us(5);                                                               /* 第9个时钟产生ACK信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                 /* 设置24C08的SCL脚为低电平 */   /************************/
     Delay_us(5);

     *GPFDIR=*GPFDIR | 0x40;                   /* 设置DSP的I/O脚为输出 */
     EDIS;

     for(;y>0;y--)
     {if((y & 1)==0)
        {shift=0x8000;
         for(n=7;n>=0;n--)                       /* 发送DATA */
         {if((*p & shift)==0)
            *GPFDAT=*GPFDAT & 0xFFBF;            /* SDA输出0 */
          else *GPFDAT=*GPFDAT | 0x40;           /* SDA输出1 */

          *GPFDAT=*GPFDAT | 0x80;                /* 设置24C08的SCL脚为高电平 */   /*******************/
          Delay_us(5);                                                           /* 产生CLK时钟信号 */
          *GPFDAT=*GPFDAT & 0xFF7F;              /* 设置24C08的SCL脚为低电平 */   /*******************/
          Delay_us(5);
          shift=shift/2;                         /* 即使移位控制位右移1位 */
         }

         EALLOW;                                 /* 允许访问 EALLOW 保护区域 */
         *GPFDIR=*GPFDIR & 0xFFBF;               /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

         *GPFDAT=*GPFDAT | 0x80;                 /* 设置24C08的SCL脚为高电平 */   /************************/
         Delay_us(5);                                                             /* 第9个时钟产生ACK信号 */
         *GPFDAT=*GPFDAT & 0xFF7F;               /* 设置24C08的SCL脚为低电平 */   /************************/
         Delay_us(5);

         *GPFDIR=*GPFDIR | 0x40;                 /* 设置DSP的I/O脚为输出 */
         EDIS;
        }
      else
        {shift=0x80;
         for(n=7;n>=0;n--)                       /* 发送DATA */
         {if((*p++ & shift)==0)
            *GPFDAT=*GPFDAT & 0xFFBF;            /* SDA输出0 */
          else *GPFDAT=*GPFDAT | 0x40;           /* SDA输出1 */

          *GPFDAT=*GPFDAT | 0x80;                /* 设置24C08的SCL脚为高电平 */   /*******************/
          Delay_us(5);                                                            /* 产生CLK时钟信号 */
          *GPFDAT=*GPFDAT & 0xFF7F;              /* 设置24C08的SCL脚为低电平 */   /*******************/
          Delay_us(5);
          shift=shift/2;                         /* 即使移位控制位右移1位 */
         }

         EALLOW;                                 /* 允许访问 EALLOW 保护区域 */
         *GPFDIR=*GPFDIR & 0xFFBF;               /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

         *GPFDAT=*GPFDAT | 0x80;                 /* 设置24C08的SCL脚为高电平 */   /************************/
         Delay_us(5);                                                             /* 第9个时钟产生ACK信号 */
         *GPFDAT=*GPFDAT & 0xFF7F;               /* 设置24C08的SCL脚为低电平 */   /************************/
         Delay_us(5);

         *GPFDIR=*GPFDIR | 0x40;                 /* 设置DSP的I/O脚为输出 */
         EDIS;
        }
     }

     *GPFDAT=*GPFDAT & 0xFFBF;                   /* 即SDA输出0 */                 /**************************/
     Delay_us(5);                                                                 /* 第10个时钟产生STOP信号 */
     *GPFDAT=*GPFDAT | 0x80;                     /* 设置24C08的SCL脚为高电平 */   /**************************/
     Delay_us(5);
     *GPFDAT=*GPFDAT | 0x40;                     /* 即SDA输出1 */
}

/****   Setup System Function   ****/
void Set_system(void)
{    asm(" SETC INTM");                       /* 关闭所有可屏蔽中断 */
     Vector_Table_Copy();                     /* 将中断向量表拷贝进PIE向量区 */

     EALLOW;                                  /* 允许访问 EALLOW 保护区域 */

     *PCLKCR=0x40;
     *SCSR=0x03;
     *PLLCR=0xA;                              /* OSCCLK=25M,CLKIN=SYSCLKOUT=(OSCCLK×10)/2=125M *//* OSCCLK=30M,CLKIN=SYSCLKOUT=(OSCCLK×10)/2=150M */
     *GPFMUX=0x0;                             /* 设置GPIO F为数字IO口 */
     *GPFDIR=0x7FFF;                          /* 设置GPIO F为输出口,GPIO F6是24C08的SDA脚,F7是24C08的SCL脚,GPIO F8是HD7279A的CLK,GPIO F9是DAT,GPIO F10,F11,F12,F13是CS */
     *GPFDAT=*GPFDAT | 0xFFFF;                /* 设置GPIO F输出高电平 */
     *HISPCP=0x04;

// Section secureRamFuncs contains user defined code that runs from CSM secured RAM
     memcpy(&secureRamFuncs_runstart,
               &secureRamFuncs_loadstart,
                  &secureRamFuncs_loadend - &secureRamFuncs_loadstart);

// Initialize the FLASH
     Flash_Reg_Modify();

//     *FOPT=0x1;                               /* Flash流水线模式激活 */                                                /******************************************/
//     *FSTDBYWAIT=0x1FF;                       /* 设置Flash从休眠到待机等待1个SYSCLKOUT周期 */                          /* 对Flash寄存器的设置不能在Flash内部运行 */
//     *FACTIVEWAIT=0x1FF;                      /* 设置Flash从待机到激活等待1个SYSCLKOUT周期 */                          /* 而应该装载在Flash中,在RAM中运行!!!!!!! */
//     *FBANKWAIT=*FBANKWAIT | 0x0505;          /* 设置Flash页读等待1个SYSCLKOUT周期,随机读操作等待1个SYSCLKOUT周期 */   /******************************************/

     *TIMER0TCR=0x8030;                       /* 定时器0停止,中断不使能,清中断标志 */
     *TIMER0TPR=0;                            /* 定时器0预定标计数器设置为0,即使定时器0的时钟源周期=SYSCLKOUT */
     *TIMER0TPRH=0;
     *TIMER0PRD=TIMER0L;                      /* 将定时器0的定时周期值赋给定时器0定时周期寄存器 */
     *TIMER0PRDH=TIMER0H;                     /* 定时时间为100us */

     *TIMER0TCR=0xC020;                       /* 将定时周期值装入,启动计数器计数,清中断标志,使能定时器0中断 */
     *PIEACK=0x0FFF;
     *PIEIFR1=0x0;                            /* 清PIE组1中断标志寄存器 */
     *PIEIER1=0x40;                           /* 使能定时器0中断对应的PIE中断 */
     *PIECTRL=0x01;                           /* 使能PIE向量 */

     asm(" OR IER,#0x01");                    /* 使能CPU级中断的INT1 */
     asm(" AND IFR,#0x0");                    /* 清CPU级中断的INT1 */
     asm(" CLRC INTM");                       /* 开所有可屏蔽中断 */

     Read_eeprom();

     msec=0;
     programcyc=0;
     t0int_flag=0;
     keyin_tf=0;
     led_bit=0;
     az_object=1111110;
     el_object=111110;
     all_R0=0;
     all_R1=0;

     EDIS;                                    /* 禁止访问 EALLOW 保护区域 */
}

/****   Check Key Input Function   ****/
int Key_in(void)                              /* 该函数用来与HD7279A通信,求按键的键值 */
{    unsigned int readkey,shift;              /* readkey是读键缓存,shift是移位控制 */
     int n;
     readkey=0x15;                            /* 读键指令存入 */
     shift=0x80;                              /* 移位控制初值存入,指向发送命令最高位 */
     key_flag=key_flag+1;                     /* 按键计数标志寄存器计数 */

     *GPFDAT=*GPFDAT & 0xFAFF;                /* 设置CS和CLK为低电平 */
     Delay_us(25);                            /* 延时25us */

     for(n=7;n>=0;n--)                        /* 向HD7279A发送读键命令开始 */
     {if((readkey & shift)==0)
        *GPFDAT=*GPFDAT & 0xFDFF;             /* GPIO F9,即DAT输出0 */
      else *GPFDAT=*GPFDAT | 0x200;           /* GPIO F9,即DAT输出1 */

      *GPFDAT=*GPFDAT | 0x100;                /* GPIO F8,即CLK输出高电平 */
      Delay_us(5);                            /* 延时5us */
      *GPFDAT=*GPFDAT & 0xFEFF;               /* GPIO F8,即CLK输出低电平 */
      Delay_us(5);                            /* 延时5us,这4条指令用以产生传送读键命令所需的CLK */
      shift=shift/2;                          /* 即使移位控制位右移1位 */
     }                                        /* 向HD7279A发送读键命令结束,下面准备接收键值 */

     EALLOW;                                  /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFDFF;                /* 改变GPIO F9脚即DAT脚为输入,准备接收键值 */
     EDIS;
     Delay_us(15);                            /* 延时15us */

     readkey=0;
     for(n=7;n>=0;n--)
     {*GPFDAT=*GPFDAT | 0x100;                /* GPIO F8,即CLK输出高电平 */
      Delay_us(5);                            /* 延时5us */
      readkey=readkey*2;                      /* 即使readkey每次循环左移1位 */
      if((*GPFDAT & 0x0200)>0)
      readkey=readkey+1;                      /* 将收到的键值按位存入readkey */
      *GPFDAT=*GPFDAT & 0xFEFF;               /* GPIO F8,即CLK输出低电平 */
      Delay_us(5);                            /* 延时5us */
     }
     EALLOW;
     *GPFDIR=*GPFDIR | 0x200;                 /* 改变GPIO F9脚即DAT脚为输出 */
     *GPFDAT=*GPFDAT | 0x400;                 /* 改变GPIO F10脚即CS脚为高电平,结束读键 */
     EDIS;

     if(readkey==0x0FF)
       key_flag=0;                            /* 如readkey=0x0FF,说明无键按下,按键计数标志寄存器清0 */
     else
       {readkey=readkey & 0x7;                /* 说明有键按下,将键值修正为0~7的整数 */
       if((key_flag & 0x8000)==0)             /* 判断该键是否第1次按下 */
         key_flag=0x8000;                     /* 该键第1次按下,标记该键已按下1次 */
       else
         {if((key_flag & 0x4000)==0)          /* 该键已按下1次,判断该键是否连续按下2次以上 */
            {n=key_flag & 0x3FFF;
            if(n<50) readkey=0x0FF;           /* 该键连续第1次和第2次按下的间隔小于500ms,则这次按下按键无效 */
            else key_flag=0xC000;             /* 标记该

⌨️ 快捷键说明

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