51单片机内部E2ROM

/*main.c源程序*/
#include <reg52.h>
#include "E2ROM.c"
#include "key.c"

sfr WDT_CONTR = 0xE1;//定义STC单片机中新加入的看门狗寄存器

code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断)
code uchar scan_bit[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};                                //数码管位选 6 5 4 3 2 1

uchar cp1 = 0;
uchar cp2 = 0;
uchar j = 0;           //控制数码管的位选
uchar flash = 0;     //控制小数点闪烁

/*延时函数*/
void delayms(uint ms)
{
     uint i, j;

     for(i = ms; i > 0; i--)//i = ms 即延时约ms毫秒
     {
          for(j = 110; j > 0; j--);
     }
}
/***********************中断初始化函数**********************/
void timer0_init(void)
{
     TMOD = 0x01;      //中断方式1    
     TH0 = 0xf8;
     TL0 = 0x2f;          //对机器脉冲计数,2000个计满溢出引发中断
     EA = 1;               //开总中断
     ET0 = 1;          //开T0中断
     TR0 = 1;          //启动定时器T0
}
/*******************Timer0中断服务函数**********************/
void timer0_isr(void) interrupt 1
{
     TH0 = 0xf8;        //重新附初值
     TL0 = 0x2f;        //重新附初值
     cp1++;
     if(cp1 >= 250)//半秒
     {
          cp1 = 0;
          cp2++;
          flash = ~flash;    //每半秒取反一次
     }
     if(cp2 >= 2)//一秒
     {         
          cp2 = 0;
          sec++;
          SectorErase(0x2000);          //擦除第一扇区
          byte_write(0x2000, sec);     //重新写入数据
     }
     if(sec >= 60)//当秒为60时分钟开始计数
     {
          sec = 0;
          min++;
          SectorErase(0x2200);          //擦除第二扇区
          byte_write(0x2200, min);     //重新写入数据
     }
     if(min >= 60)//当分钟为60时小时开始计数
     {
          min = 0;
          hour++;
          SectorErase(0x2400);          //擦除第三扇区
          byte_write(0x2400, hour);     //重新写入数据
     }
     if(hour  >= 24)
     {
          hour = 0;               //当小时大于24时小时赋值为0
     }
     P0 = 0xff;                    //Protues仿真需要消隐
     //显示正在走时间
     if(key_flag == 0)
     {
          switch(j)
          {
               case 0 : P0 = seven_seg[sec % 10]; break;
               case 1 : P0 = seven_seg[sec / 10]; break;
               case 2 : P0 = seven_seg[min % 10] & (0x7f | flash); break;
               case 3 : P0 = seven_seg[min / 10]; break;
               case 4 : P0 = seven_seg[hour % 10] & (0x7f | flash);break;
               case 5 : P0 = seven_seg[hour / 10]; break;
          }
     }
     //显示调整的小时
     if(key_flag == 1)
     {
          switch(j)
          {
               case 0 : P0 = seven_seg[time[2] % 10]; break;
               case 1 : P0 = seven_seg[time[2] / 10]; break;
               case 2 : P0 = seven_seg[time[1] % 10] & 0x7f; break;
               case 3 : P0 = seven_seg[time[1] / 10]; break;
               case 4 : P0 = seven_seg[time[0] % 10] & 0x7f | flash; break;
               case 5 : P0 = seven_seg[time[0] / 10] | flash; break;
          }
     }
     //显示调整的分钟
     if(key_flag == 2)
     {
          switch(j)
          {
               case 0 : P0 = seven_seg[time[2] % 10]; break;
               case 1 : P0 = seven_seg[time[2] / 10]; break;
               case 2 : P0 = seven_seg[time[1] % 10] & 0x7f | flash; break;
               case 3 : P0 = seven_seg[time[1] / 10] | flash; break;
               case 4 : P0 = seven_seg[time[0] % 10] & 0x7f; break;
               case 5 : P0 = seven_seg[time[0] / 10]; break;
          }
     }
     //显示调整的秒
     if(key_flag == 3)
     {
          switch(j)
          {
               case 0 : P0 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值