iic总线的应用程序(电位器和光敏电阻)

调用数码管显示的函数

调用iic协议来读取ad转换芯片的数值

初始化:模拟iic的时序开始

写入地址:写入ad转化芯片的地址,告诉它单片机要与它进行通信(0x90写入设备地址),(0x91读取设备地址)

等待应答:

写入地址: 写连接ad转换芯片的地址

等待应答:

终止iic协议:

数码管显示()

初始化 iic

写入地址:这次是写入读的地址 0x91 设备要读取它的信息

等待应答:

创建变量接收读取的数据

终止应答: 写入1位停止应答

终止iic协议:

数码管显示:

按键处理函数: 设置状态值的变化 ,期间按键按下的时候要显示数码管

主函数while中进行按键扫描,然后对状态值进行判断,然后调用相关的显示函数

 

#include <STC15F2K60S2.H>
#include "iic.h"
unsigned int dat_1;
unsigned int dat_2;
sbit S4=P3^3;
unsigned char stat=0;
code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};
void select138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2=(0x1f&P2)|0x80;
		break;
		case 5:
			P2=(0x1f&P2)|0xa0;
		break;
		case 6:
			P2=(0x1f&P2)|0xc0;
		break;
		case 7:
			P2=(0x1f&P2)|0xe0;
		break;
		case 0:
			P2=(0x1f&P2)|0x00;
		break;
	
	}
}
void smgshow_bite(unsigned char date,unsigned char pos)
{ 	
	select138(6);
	P0=0x01<<pos;
	select138(7);
	P0=date;

}
void smgshowall()
{ 	
	select138(6);
	P0=0xff;
	select138(7);
	P0=0xff;

}

void delay_smg(unsigned int i)
{
	while(i--);
}

void  showdate(unsigned char channel, unsigned char date)
{
	smgshow_bite(SMG_NoDot[16],0);
	delay_smg(500);
	smgshow_bite(SMG_NoDot[channel],1);
	delay_smg(500);
	smgshow_bite(SMG_NoDot[16],2);
	delay_smg(500);
	
	smgshow_bite(0xff,3);
	delay_smg(500);
	smgshow_bite(0xff,4);
	delay_smg(500);
	
	smgshow_bite(SMG_NoDot[(date/100)%10],5);
	delay_smg(500);
	smgshow_bite(SMG_NoDot[(date/10)%10],6);
	delay_smg(500);
	smgshow_bite(SMG_NoDot[date%10],7);
	delay_smg(500);
	smgshowall();
}

void  power()
{
	IIC_Start(); 
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x01);
	IIC_WaitAck();
	IIC_Stop();

	showdate(1, dat_1);
	
	IIC_Start(); 
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat_1=IIC_RecByte();
	
	IIC_SendAck(1);
	IIC_Stop();
	showdate(1, dat_1);
}

void  light()
{
	IIC_Start(); 
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
    showdate(3, dat_2);
	
	IIC_Start(); 
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat_2=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	showdate(3, dat_2);
}

void key()
{
	if(S4==0)
	{
		delay_smg(100);
		if(S4==0)
		{
			if(stat==0)
			{
				stat=1;
				while(S4==0)
				{
					showdate(1, dat_1);
				}
			}
			else if(stat==1)
			{	stat=0;
				while(S4==0)
				{
					showdate(3, dat_2);
				}
			}
		}
		
	}

}

void main()
{
	while(1)
	{
		key();
		if(stat==0)
		{
		light();
		}
		else if(stat==1)
		{
			power();
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值