我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 542|回复: 0

STC12C5A60S2显示开机次数 需要原理图的密我!

[复制链接]
灰太狼小 该用户已被删除
发表于 2015-9-17 15:32:00 | 显示全部楼层 |阅读模式
#include "exter.h"

/************************
  Software delay function
************************/
void Delay(uchar z)
{
   uchar i,j;
   for(i=0; i<100; i++)
   {
      for(j=0; j<z; j++)
      {
         ;;
      }
   }
}

/*********************************
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
**********************************/
void IapIdle(void)
{
  IAP_CONTR = 0;      //Close IAP function
  IAP_CMD = 0;          //Clear command to standby
  IAP_TRIG = 0;          //Clear trigger register
  IAP_ADDRH = 0x80;      //Data ptr point to non-EEPROM area
  IAP_ADDRL    = 0;      //Clear IAP address to prevent misuse
}

/********************************
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output: Flash data
********************************/
uchar IapReadByte(uint addr)
{
   uchar dat;         //Data buffer
   
   IAP_CONTR = ENABLE_IAP;    //Open IAP function, and set wait time
   IAP_CMD = CMD_READ;        //Set ISP/IAP/EEPROM READ command
   
   IAP_ADDRL = addr;             //Set ISP/IAP/EEPROM address low
   IAP_ADDRH = addr >> 8;     //Set ISP/IAP/EEPROM address high
   IAP_TRIG = 0x5a;              //Set trigger command1 (0x5a)   
   IAP_TRIG = 0xa5;            //Set    trigger command2 (0xa5)   
  
   _nop_();                      //MCU will hold here until ISP/IAP/EEPROM  
                              //operation complete;
   dat = IAP_DATA;            //Read ISP/IAP/EEPROM data
   IapIdle();                 //Close ISP/IAP/EEPROM function

   return dat;                //Return Flash data
}

/********************************
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
       dat  (ISP/IAP/EEPROM data)   
Output:
********************************/
void IapProgramByte(uint addr, uchar dat)
{
   IAP_CONTR = ENABLE_IAP;    //Open IAP function, and set wait time
   IAP_CMD = CMD_PROGRAM;     //Set ISP/IAP/EEPROM  PROGRAM command
   IAP_ADDRL = addr;             //Set ISP/IAP/EEPROM address low
   IAP_ADDRH = addr >> 8;     //Set ISP/IAP/EEPROM address high
   IAP_DATA = dat;            //Write ISP/IAP/EEPROM data
   IAP_TRIG = 0x5a;              //Set trigger command1 (0x5a)   
   IAP_TRIG = 0xa5;            //Set    trigger command2 (0xa5)   
  
   _nop_();                      //MCU will hold here until ISP/IAP/EEPROM  
                              //operation complete;

   IapIdle();                 //Close ISP/IAP/EEPROM function
}

/********************************
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:
********************************/
void IapEraseSector(uint addr)
{
   IAP_CONTR = ENABLE_IAP;    //Open IAP function, and set wait time
   IAP_CMD = CMD_ERASE;       //Set ISP/IAP/EEPROM ERASE command  
   IAP_ADDRL = addr;           //Set ISP/IAP/EEPROM address low
   IAP_ADDRH = addr >> 8;     //Set ISP/IAP/EEPROM address high
   IAP_TRIG = 0x5a;           //Set trigger command1 (0x5a)   
   IAP_TRIG = 0xa5;              //Set trigger command2 (0xa5)   

   _nop_();                      //MCU will hold here until ISP/IAP/EEPROM  
                              //operation complete;

   IapIdle();                  //Close ISP/IAP/EEPROM function
}



/**********************************************************
     自己的电路必须用自己的码表



**********************************************************/

#include "smg.h"

//uchar table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar table[10] = {0xE7,0x21,0xEC,0x6D,0x2B,0x4F,0xCF,0x25, 0xEF,0x6F};
void Display(uchar num)
{

/****显示十位****/
  if(num>=10)
  {
    P0 = 0xfe;
    wela = 1;
    wela = 0;
   
    P0 = table[num/10];
    dula = 1;
    dula = 0;
    Delay(100);
   }

/****显示个位****/
   P0 = 0xfd;
   wela = 1;
   wela = 0;

   P0 = table[num%10];   
   dula = 1;
   dula = 0;
   Delay(100);



}


#include "exter.h"
#include "smg.h"

void main(void)
{
  uchar num;


  num = IapReadByte(IAP_ADDRESS);
  if(num >= 100)
  {
    num = 12;
  }

  IapEraseSector(IAP_ADDRESS);    // Erase current sector


  IapProgramByte(IAP_ADDRESS, num+1);     
  
     
  while(1)
  {
      Display(num);
  }
}
/**************************/
对应头文件


#ifndef __EXTER_H__#define __EXTER_H__

#include "reg51.h"#include "intrins.h"

typedef unsigned char uchar;typedef unsigned int  uint;

/********Declare SFR associated with IAP **********/sfr IAP_DATA    = 0xC2;   //FLASH data register
sfr IAP_ADDRH   = 0xC3;   //FLASH address Highsfr IAP_ADDRL   = 0xC4;   //FLASH address Low
sfr IAP_CMD     = 0xC5;   //FLASH command registersfr IAP_TRIG    = 0xC6;   //FLASH command trigger
sfr IAP_CONTR   = 0xC7;   //FLASH control register

/********Define ISP/IAP/EEPROM command*************/#define CMD_IDLE     0      //Stand - By
#define CMD_READ     1      //Byte - Read               #define CMD_PROGRAM  2      //Byte - Program               
#define CMD_ERASE    3      //Sector - Erase

/********Define ISP/IAP/EEPROM operation const for IAP_CONTR***********///#define ENABLE_IAP   0x80 //if SYSCLK < 30MHz
//#define ENABLE_IAP   0x81 //if SYSCLK < 24MHz#define ENABLE_IAP   0x82 //if SYSCLK < 20MHz
//#define ENABLE_IAP   0x83 //if SYSCLK < 12MHz//#define ENABLE_IAP   0x84 //if SYSCLK < 6MHz
//#define ENABLE_IAP   0x85 //if SYSCLK < 3MHz//#define ENABLE_IAP   0x86 //if SYSCLK < 2MHz
//#define ENABLE_IAP   0x87 //if SYSCLK < 1MHz

//Start address for STX12C5A60S2 series EEPROM#define IAP_ADDRESS  0x0000

void Delay(uchar);void IapIdle(void);                             //Disable ISP/IAP/EEPROM function                  
uchar IapReadByte(uint addr);                    //Read one byte from ISP/IAP/EEPROM areavoid IapProgramByte(uint addr, uchar date);        //Program one byte to ISP/IAP/EEPROM area
void IapEraseSector(uint addr);                    //Erase one sector area


#endif


#ifndef __SMG_H__#define __SMG_H__

#include "reg51.h"#include "exter.h"


sbit  wela = P2^4;sbit  dula = P2^3;

void Display(uchar num);

#endif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表