一个简单的示例程序,统计开机次数。代码如下:
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
#include "iic.h"
u8 flag_display=0;
u8 flag_ds18b20=0;
u8 flag_at=0;
u8 at=0;
u8 temp=0;
u8 a[8]={10,10,10,10,10,10,10,10};
void ctrl(u8 ctrl)
{
u8 p2data=P2;
P2=ctrl<<5|(0x1f&P2);
P2=0x1f&p2data;
}
void display(u8 site,u8 light)
{
P0=0xff;ctrl(7);
P0=0x01<<site;ctrl(6);
switch(light)
{
case 0:P0=0xc0;break;
case 1:P0=0xf9;break;
case 2:P0=0xa4;break;
case 3:P0=0xb0;break;
case 4:P0=0x99;break;
case 5:P0=0x92;break;
case 6:P0=0x82;break;
case 7:P0=0xf8;break;
case 8:P0=0x80;break;
case 9:P0=0x90;break;
case 10:P0=0xff;break;
default:break;
}
ctrl(7);
}
void get(u8 a0,u8 a1,u8 a2,u8 a3,u8 a4,u8 a5,u8 a6,u8 a7)
{
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;
}
void Process(void)
{
if(flag_ds18b20==200){flag_ds18b20=0;temp=(int)ds18b20();}
if(flag_at==200){EA=0;at=atread(0x55);flag_at=0;EA=1;}
}
void Timer2_Isr(void) interrupt 12
{
flag_ds18b20++;
flag_display++;
flag_at++;
flag_display=flag_display%8;
display(flag_display,a[flag_display]);
}
void Timer2_Init(void)
{
AUXR &= 0xFB;
T2L = 0x9C;
T2H = 0xFF;
AUXR |= 0x10;
IE2 |= 0x04;
EA=1;
}
void main()
{
P0=0x00;ctrl(5);
P0=0xff;ctrl(4);
at=atread(0x55);
Timer2_Init();
atwrite(0x55,at+1);
while(1)
{
Process();
get(10,at%100/10,at%10,10,10,10,temp/10,temp%10);
}
}
因为ATREAD、ATWRITE中都包含了延时函数,在每1ms进行一次的定时器2中断影响下读写都会失败,所以设立了FLAG_AT标志位,进行读写前先中断,完成读写后再开启。中断函数被关闭时,由于我们一般对全局变量进行操作,所以读写的暂停基本不造成影响。
代码中,只再PROCESS里不断完成读取数据的操作,并没有完成写的操作,大家可以根据同样的方法对写进行完善。
标签:10,u8,ctrl,读写,蓝桥,单片机,flag,AT24C02,include From: https://blog.csdn.net/zhenghuangjie/article/details/137085424