?? chengxu.c
字號:
/********************************************************************
匯誠科技
實現功能:定次(開機次數記憶最大記憶次數65536次)key按一次,
可以重新記憶 催款應用程序
使用芯片:STC15F104E
晶振:12MHZ
編譯環境:Keil
作者:zhangxinchunleo
網站:www.ourhc.cn
淘寶店:匯誠科技 http://shop36330473.taobao.com
【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
*********************************************************************/
/********************************************************************/
#include "reg52.h"
#include <intrins.H>
#define uchar unsigned char //宏定義字符型變量
#define uint unsigned int //宏定義整型變量
/********************************************************************
寄存器設置
*********************************************************************/
sfr IAP_DATA =0xc2; //數據寄存器
sfr IAP_ADDRH =0xc3; //地址寄存器
sfr IAP_ADDRL =0xc4; //地址寄存器
sfr IAP_CMD =0xc5; //命令寄存器
sfr IAP_TRIG =0xc6; //觸發寄存器
sfr IAP_CONTR =0xc7; //擦除寄存器
sbit P33=P3^3; //定義繼電器控制輸出腳
/********************************************************************
命令定義
*********************************************************************/
#define CMD_IDLE 0 //EEPROM無操作
#define CMD_READ 1 //讀取字節
#define CMD_PROGRAM 2 //寫入字節
#define CMD_ERASE 3 //擦除字節
/********************************************************************
編程周期由晶振決定
*********************************************************************/
//#define ENABLE_IAP 0X80 //編程周期由晶振決定(如果<30MHZ選用此項)
//#define ENABLE_IAP 0X81 //編程周期由晶振決定(如果<24MHZ選用此項)
//#define ENABLE_IAP 0X82 //編程周期由晶振決定(如果<20MHZ選用此項)
#define ENABLE_IAP 0X83 //編程周期由晶振決定(如果<12MHZ選用此項)
//#define ENABLE_IAP 0X84 //編程周期由晶振決定(如果<6MHZ選用此項)
//#define ENABLE_IAP 0X85 //編程周期由晶振決定(如果<3MHZ選用此項)
//#define ENABLE_IAP 0X86 //編程周期由晶振決定(如果<2MHZ選用此項)
//#define ENABLE_IAP 0X87 //編程周期由晶振決定(如果<1MHZ選用此項)
#define IAP_ADDRESS 0X0000 //內部EEPROM地址
/********************************************************************
開機最大次數和最長時間定義
*********************************************************************/
#define C 10 //開機最大次數(次)
/********************************************************************
初始定義
*********************************************************************/
uchar Count;
sbit jdq=P3^3;
sbit key=P3^5;
/********************************************************************
函數初始化
*********************************************************************/
void IapIdle(); //操作函數
uchar IapReadByte(uint addr); //讀取函數
void IapProgramByte(uint addr,uchar dat); //寫入函數
void IapEraseSector(uint addr); //擦除函數
//============================================================
//延時程序
void delayms(unsigned int x)
{
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<260;j++);
}
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
delayms(600);
Count=IapReadByte(10);
Count++;
IapEraseSector(10); //擦除扇區 //34us
IapProgramByte(10,Count); //寫入數據//38us
//定時器中斷初始化
if(Count<C)
TR0=1;
if(Count>=C)
{
TR0=0;
jdq=1;
IapEraseSector(10); //擦除扇區
IapProgramByte(10,C+2); //寫入數據
}
while(1)
{ if(key==0)
{jdq=1;
while(!key);
jdq=0;
IapEraseSector(10); //擦除扇區
}
}
}
/********************************************************************
操作函數
*********************************************************************/
void IapIdle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
/********************************************************************
讀取一個字節函數
*********************************************************************/
uchar IapReadByte(uint addr)
{
uchar dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
dat=IAP_DATA;
IapIdle();
return dat;
}
/********************************************************************
寫入一個字節函數
*********************************************************************/
void IapProgramByte(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
IapIdle();
}
/********************************************************************
擦除一個字節函數
*********************************************************************/
void IapEraseSector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
_nop_();
IapIdle();
}
/********************************************************************
結束
*********************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -