需要用到的函数和变量来实现相应的功能:
数码管显示一般只直接显示数据,所以先要将数据给处理好
调用相关的函数将光敏电阻传感器产生的值放入到一个变量中
进行数据的分析函数:根据光照强度点亮相关的led灯,等级
打开24c02
定义按键函数: 按键1 实时显示数码管的值,然后将光敏电阻产生的数据放入到24c02的存储器中
按键2 显示 24c02中的数据
主函数while中 一直判断一直显示
存储变化的数值要用全局变量
实现具体步骤:
定义4个变量,用来存放实时的光敏电阻的值和将数据保存到24c02中的数据
调用数码管显示函数
先显示实时光敏电阻的值:
调用iic协议:
iic初始化,写入器件地址(0x90),等待应答,写入芯片对应的外设的地址光敏电阻(0x01),等待应答,iic结束 数码管显示相关的值 iic初始化 ,写入器件地址(0x91),等待应答,创建变量接收数值,发送终止iic信号(1),iic结束
led处理函数:需要将光敏电阻的显示调用到,根据光敏电阻的值来进行等级的划分
调用24c02:
写入函数 :需要填入地址,和数据
将地址和数据写入到24c02中:iic初始化,写入设备地址地址(0xa0),等待应答,写入需要存储的地址(addr),等待应答,写入数据(date),等待应答,终止iic
读取函数: 需要填入地址
为写操作:iic初始化,等待应答,写入设备地址(0xa0),等待应答,写入要读取数据的地址(addr),等待应答,iic初始化,写入设备地址(0xa1),等待应答,创建变量接收数据,发送终止信号(1),停止iic,返回变量
按键处理函数:按键1按下,将数据写入到相关的地址中,等待按键松开显示实时数据
按键2按下,利用创建的变量接收读取的数据,数码管显示数据(不是实时显示数据)
注意的是:数码管需要定义两个用来显示实时数据和存储在24c02中的数据
调用24c02函数时,是将数据写入到地址中,写两个数据中间不需要用到延时函数
#include <STC15F2K60S2.H>
#include"iic.h"
unsigned char dat_1;
unsigned char level;
unsigned char dat_2=0;
unsigned char level_1=0;
sbit S5=P3^2;
sbit S4=P3^3;
code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void delay(unsigned int i);
void select138(unsigned char n)
{
switch(n)
{
case 4: P2=(P2&0x1f)|0x80;
break;
case 5: P2=(P2&0x1f)|0xa0;
break;
case 6: P2=(P2&0x1f)|0xc0;
break;
case 7: P2=(P2&0x1f)|0xe0;
break;
}
}
void smg_bite(unsigned char date, unsigned char pos)
{
select138(6);
P0=0x01<<pos;
select138(7);
P0=date;
}
void shoutdown(unsigned char date)
{
select138(6);
P0=0xff;
P0=date;
}
void smg_show()
{
smg_bite(SMG_NoDot[16],0);
delay(500);
smg_bite(SMG_NoDot[level],1);
delay(500);
smg_bite(SMG_NoDot[16],2);
delay(500);
smg_bite(0xff,3);
delay(500);
smg_bite(0xff,4);
delay(500);
smg_bite(SMG_NoDot[(dat_1/100)%10],5);
delay(500);
smg_bite(SMG_NoDot[(dat_1%100)/10],6);
delay(500);
smg_bite(SMG_NoDot[dat_1%10],7);
delay(500);
shoutdown(0xff);
delay(500);
}
void smg_show_1()
{
smg_bite(SMG_NoDot[16],0);
delay(500);
smg_bite(SMG_NoDot[level_1],1);
delay(500);
smg_bite(SMG_NoDot[16],2);
delay(500);
smg_bite(0xff,3);
delay(500);
smg_bite(0xff,4);
delay(500);
smg_bite(SMG_NoDot[(dat_2/100)%10],5);
delay(500);
smg_bite(SMG_NoDot[(dat_2%100)/10],6);
delay(500);
smg_bite(SMG_NoDot[dat_2%10],7);
delay(500);
shoutdown(0xff);
delay(500);
}
void delay(unsigned int i)
{
while(i--);
}
void RD1()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
smg_show();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_1=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
smg_show();
}
void auto_show()
{ RD1();
select138(4);
if(dat_1>200)
{
level=1;
P0=0xfe;
}
else if( dat_1>150 && dat_1<200)
{
level=2;
P0=0xfc;
}
else if(dat_1>100&& dat_1<150)
{
level=3;
P0=0xf0;
}
else if(dat_1>50&&dat_1<100)
{
level=4;
P0=0xc0;
}
else
{
level=5;
P0=0x00;
}
}
void _24c02(unsigned char date,unsigned char addr)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
unsigned char _24c02read(unsigned char addr)
{
unsigned char date;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
date=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return date;
}
void key()
{
if(S4==0)
{
delay(500);
if(S4==0)
{
_24c02(dat_1,0x06);
_24c02(level,0x05);
while(S4==0)
{
smg_show();
}
}
}
if(S5==0)
{
delay(500);
if(S5==0)
{
level_1=_24c02read(0x05);
dat_2 = _24c02read(0x06);
while(S5==0)
{
smg_show_1();
}
}
}
}
void main()
{
while(1)
{
auto_show();
smg_show();
key();
}
}