|
- #include "reg52.h"
- #include "intrins.h"
- #include "TM1637.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; //定义继电器控制输出脚
- sbit k1=P3^2; //按键
- uchar tmp[4]=0,yw=0,mode=0;
- uint i,num=0,num_diaodian=100; //定义整型变量i
- uchar g1=0,s1=0,b1=0,q1=0;
- uchar g=0,s=0,b=0,q=0;
- bit ReadTimeFlag=0,Flag=0;//定义读时间标志
- unsigned char keydate=0xff;
- /********************************************************************
- ************************ 命令定义
- *********************************************************************/
- #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地址
- /********************************************************************
- ************************ 函数初始化
- *********************************************************************/
- void Delay(uchar n); //延时函数
- void IapIdle();//操作函数
- uchar IapReadByte(uint addr); //读取函数
- void IapProgramByte(uint addr,uchar dat); //写入函数
- void IapEraseSector(uint addr);//擦除函数
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 54;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- void key(void) // //读按键值 并做处理
- {
- keydate=0XFF;
- if(ReadTimeFlag==1) //100ms读取
- {
- ReadTimeFlag=0;
- keydate=ScanKey(); //读按键值
- }
- switch(keydate)
- {
- case 0xf7: //K1
- if(mode++>=1)
- {mode=0;}
- if(mode==0)
- {
- tmp[0]=num%256;
- tmp[1]=num/256;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(8);//延时
- IapEraseSector(IAP_ADDRESS); //擦除扇区
- for(i=0;i<4;i++)//对4个字节进行数据写入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//写入数据
- }
- Delay(8);
- }
- break;
- case 0xf6: //K2
- if(yw++>=3)yw=0;
- break;
- case 0xf5: //K3
- switch(mode)
- {
- case 0:
- break;
- case 1:
- if(yw==0){ if(q1++>=9)q1=0;}
- else if(yw==1){ if(b1++>=9)b1=0;}
- else if(yw==2){ if(s1++>=9)s1=0;}
- else if(yw==3){ if(g1++>=9)g1=0;}
- num_diaodian=q1*1000+b1*100+s1*10+g1;
- break;
- }
-
- break;
- case 0xf4: //K4
- switch(mode)
- {
- case 0:
- break;
- case 1:
- if(yw==0){ if(q1--<=0)q1=9;}
- else if(yw==1){ if(b1--<=0)b1=9;}
- else if(yw==2){ if(s1--<=0)s1=9;}
- else if(yw==3){ if(s1--<=0)s1=9;}
- num_diaodian=q1*1000+b1*100+s1*10+g1;
- break;
- }
-
- break;
- }
- }
- /*------------------------------------------------
- 定时器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- /*------------------------------------------------
- 定时器中断子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned int num=0,cnt=0;
- TH0=(65536-50000)/256; //重新赋值 50ms
- TL0=(65536-50000)%256;
- num++;
- if(num==3) //大致100ms
- {
- num=0;
- ReadTimeFlag=1; //读标志位置1
- }
- if(cnt++>=8)
- {
- cnt = 0;
- Flag= ~ Flag;
-
- }
- }
- /********************************************************************
- ************************ 主函数
- *********************************************************************/
- void main()
- {
- P5M0=0; P5M1=0;
- for(i=0;i<4;i++)//对4个字节数据读出
- {
- tmp[i]=IapReadByte(IAP_ADDRESS+i);//读eeprom数据
- }
- num=(uint)(tmp[0]+tmp[1]*256);
- num_diaodian =(uint)(tmp[2]+tmp[3]*256);
- if(num++>=num_diaodian)//到达预定掉电次数后
- {
- P33 = 0;//输出低电平
- }
- q=num/1000%10;
- b=num/100%10;
- s=num/10%10;
- g=num%10;
- TM1637_display(q,b,s,g,0);
- tmp[0]=num%256;
- tmp[1]=num/256;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(8);//延时
- IapEraseSector(IAP_ADDRESS); //擦除扇区
- for(i=0;i<4;i++)//对4个字节进行数据写入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//写入数据
- }
- Delay(8);//延时
- Init_Timer0();
- while(1)
- {
- key();
- if(k1==0)
- { Delay5ms();
- if(k1==0)
- {
- P33 = 1;//输出G电平
- /**********上电次数清零*********/
- num=0;
- tmp[0]=0;
- tmp[1]=0;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(1);//延时
- IapEraseSector(IAP_ADDRESS); //擦除扇区
- for(i=0;i<4;i++)//对2个字节进行数据写入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//写入数据
- }
- Delay(1);//延时
-
- }
- Delay5ms();
- while(!k1) ;
- }
- q=num/1000%10;
- b=num/100%10;
- s=num/10%10;
- g=num%10;
- q1=num_diaodian/1000%10;
- b1=num_diaodian/100%10;
- s1=num_diaodian/10%10;
- g1=num_diaodian%10;
- if(mode==0)
- {
- TM1637_display(q,b,s,g,0);
- }
- else if(mode==1)
- {
- if(Flag == 0)
- {
- TM1637_display(q1,b1,s1,g1,0);
- }
- else if(Flag == 1)
- {
- if(yw==0) TM1637_display(21,b1,s1,g1,0);
- else if(yw==1) TM1637_display(q1,21,s1,g1,0);
- else if(yw==2) TM1637_display(q1,b1,21,g1,0);
- else if(yw==3) TM1637_display(q1,b1,s1,21,0);
- }
- }
- }
- }
- /********************************************************************
- ************************ 延时函数
- *********************************************************************/
- void Delay(uchar n)
- {
- uint x;
- while(n--)
- {
- x=0;
- while(++x);
- }
- }
- /********************************************************************
- ************************ 操作函数
- *********************************************************************/
- 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();
- }
复制代码
|
评分
-
查看全部评分
|