单片机--iic

iic.c

#include "myhead.h"

xdata unsigned char alarm_hour = 13;
xdata unsigned char alarm_min = 1;
xdata unsigned char alarm_sec = 59;
bit ack = 0;
void iic_start()
{     
      SDA = 1;//先操作SDA保证SCL=1期间SDA只有一个下降沿信号
    SCL = 1;
      delay_us(1);
      SDA = 0;
      delay_us(1);

      SCL = 0;//钳住总线,让IIC失效
}

void iic_stop()
{
    SDA = 0;
      SCL = 1;
      delay_us(1);
      SDA = 1;
      delay_us(1);

      SCL = 0;
}

void iic_send_byte(unsigned char byte)//每次发送最高位
{
      unsigned char i;

      for(i = 0;i < 8;i++)
      {
              SDA = byte & 0x80;//赋值非零,SDA=1,赋值为零,SDA=0
              SCL = 1;
              delay_us(1);
              SCL = 0;
              byte <<= 1;         
        }

        SCL = 1;
        SDA = 1;
        delay_us(1);

        if(0 == SDA)
        {
                ack = 1;
        }
        else
        {
                ack = 0;
        }

        SCL = 0;
}

unsigned char iic_rcv_byte()
{
      unsigned char i;
      unsigned char temp = 0;
      unsigned char a;

      SDA = 1;

      for(i = 0;i < 8;i++)
      {
          SCL = 0;
              delay_us(1);
              SCL = 1;
              if(SDA)
                {
                      a = 0x01;
                }
                else
                {
                      a = 0;
                }

                temp |= a << (7 - i);
                delay_us(1);
        }

        SCL = 0;

        return temp;
}

// void iic_ack()
// {
//    SDA = 0;
//      SCL = 1;
//      delay_us(1);

//      SCL = 0;
// }

void iic_noack()
{
    SDA = 1;
      SCL = 1;
      delay_us(1);

      SCL = 0;
}
//向AT24C02发送字符串
unsigned char AT24C02_send_str(unsigned char devaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
      unsigned char i;

      iic_start();//起始信号

      iic_send_byte(devaddr);   
      if(0 == ack)
        {
              return ERR;
        }

        iic_send_byte(romaddr);
        if(0 == ack)
        {
            return ERR;
        }

        for(i = 0;i < num;i++)
        {
              iic_send_byte(*s);
              if(0 == ack)
                {
                      return ERR;
                }
                s++;
        }

        iic_stop();

        return SUCC;
}
//从AT24C02读数据
unsigned char AT24C02_rcv_time(unsigned char devaddr,unsigned char romaddr)
{
      unsigned char t;

      iic_start();

      iic_send_byte(devaddr);
      if(0 == ack)
        {
              return ERR;
        }

        iic_send_byte(romaddr);
        if(0 == ack)
        {
              return ERR;
        }

        iic_start();
        iic_send_byte(devaddr + 1);



        t = iic_rcv_byte();
        iic_noack();

        iic_stop();

        return t;
}

void iic()
{
      unsigned char i;
      unsigned char time[4] = {0};
      unsigned char clock[4] = {0};
      unsigned char flag1 = 1;
      unsigned char key;

      lcd_init();
      uart_init();
      time0_init();

      hour = AT24C02_rcv_time(0xae,16);
      min = AT24C02_rcv_time(0xae,17);
      sec = AT24C02_rcv_time(0xae,18);

      delay_ms(500);    

      alarm_hour = AT24C02_rcv_time(0xae,24);
      alarm_min = AT24C02_rcv_time(0xae,25);
      alarm_sec = AT24C02_rcv_time(0xae,26);


        while(flag1)
        {
              if(flag)
                {

                    if(ch[0] == 't')
                        {                     
                             TR0 = 0;
                           lcd_dis_str(0,1,"change time     ");
               hour = (ch[1] - '0') * 10 +(ch[2] - '0');
                         min = (ch[4] - '0') * 10 +(ch[5] - '0');
                         sec = (ch[7] - '0') * 10 +(ch[8] - '0');
               lcd_dis_time();
               delay_s(3);
                             lcd_dis_str(0,1,"        ");
                             lcd_dis_time();
                     lcd_dis_alarm_time();
               TR0 = 1;                         
                        }

                        if(ch[0] == 'c')
                        {                     
                           lcd_dis_str(0,0,"change clock    ");
               alarm_hour = (ch[1] - '0') * 10 +(ch[2] - '0');
                         alarm_min = (ch[4] - '0') * 10 +(ch[5] - '0');
                         alarm_sec = (ch[7] - '0') * 10 +(ch[8] - '0');
               lcd_dis_alarm_time();
               delay_s(5);  
               lcd_dis_str(0,0,"                ");
                             lcd_dis_time();
                     lcd_dis_alarm_time();                      
                        }
                        uart_send_str(ch);
                        flag = 0;
                }
                else
                {
                  lcd_dis_time();
                  lcd_dis_alarm_time();
                }

                if(alarm_hour == hour && alarm_min == min)
                {
//                  PlayMusic();
//                  lcd_dis_time();
//              lcd_dis_alarm_time();

                    for(i = 0;i < 100;i++)
                    {
                        beep = ~beep;
                        delay_ms(10);
                    }
                }


                time[0] = hour;
                time[1] = min;
                time[2] = sec;

                clock[0] = alarm_hour;
                clock[1] = alarm_min;
                clock[2] = alarm_sec;

                AT24C02_send_str(0xae,16,time,3);
                delay_ms(500);
                AT24C02_send_str(0xae,24,clock,3);

                delay_s(1);
                key = key_scan();

                if(0xe7 == key)
                {
                      lcd_init();
                      lcd_over();
                      flag1 = 0;
                      iic_stop();                 
                }

        }

}

iic.h

#ifndef _UART_H
#define _UART_H

extern void uart_init(void);
extern void uart_isr();
extern void uart_send_byte(unsigned char byte);
extern void uart_send_str(unsigned char *str);
extern void uart();

#endif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值