单片机==DA写(29)

#include <reg52.h>
#include "delay.h"

sbit SCL = P2^0;
sbit SDA = P2^1;
bit  ack = 0;

#define SUCC 0
#define ERR 1


#define LCDPORT P0
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;

#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0

//ÆðʼÐźÅ
void iic_start()
{
    SDA = 1;         //SDAÏȸ³Öµ£¬ÎªÁ˱£Ö¤SCLΪ¸ßµçƽÆڼ䣬SDAÖ»ÓÐÒ»´Î²¨Ðα仯
      SCL = 1;
        delay_us(1);
        SDA = 0;
        delay_us(1);
        SCL = 0;         //ǯס×ÜÏß
}



//ÖÕÖ¹ÐźÅ
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»á²»»á±ä³É0£¬»á²»»áÓÐÓ¦´ð
        SDA = 1;
        delay_us(1);

        if(0 == SDA)
            ack = 1;                //ÓÐÓ¦´ð
        else
            ack = 0;                //ûÓÐÓ¦´ð

        SCL = 0;                  //ǯס×ÜÏߣ¬ÈÃSDAÊÍ·Å£¬±ä³É1
}



//Ö÷»ú½ÓÊÕÊý¾Ý£¬¶ÁÓ¦´ð
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;
}

//´«ËÍÒ³
unsigned char AT24C02_send_str(unsigned char devaddr, unsigned char roomaddr, unsigned char *s, unsigned char num)
{
    unsigned char i;
    iic_start();
    iic_send_byte(devaddr);
    if(0 == ack)
        return ERR;
    iic_send_byte(roomaddr);
    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;
}


//¶ÁÈ¡×Ö·û´®
unsigned char AT24C02_rcv_str(unsigned char devaddr, unsigned char roomaddr, unsigned char *s, unsigned char num)
{
        unsigned char i;
      iic_start();
      iic_send_byte(devaddr);
      if(0 == ack)
        return ERR;
      iic_send_byte(roomaddr);
      if(0 == ack)
          return ERR;

        iic_start();
        iic_send_byte(devaddr + 1);     //¿ªÊ¼¶ÁÖµ  ±ä³É1
        for(i = 0; i < num - 1; i++)
        {
            *s = iic_rcv_byte();
            iic_ack();
            s++;
        }
        *s = iic_rcv_byte();
        iic_noack();
        iic_stop();

        return SUCC;
}


void lcd_write(unsigned char byte, unsigned char flag)
{
    if(flag)
    {
        RS = 1;
    }
    else
    {
        RS = 0;
    }
    RW = 0;
    E = 1;
    LCDPORT = byte;
    delay_us(5);
    E = 0;
}

void lcd_init()
{
    delay_ms(16);
    lcd_write(0x38, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x38, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x38, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x38, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x08, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x01, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x06, LCD_WRITE_COM);
    delay_ms(5);
    lcd_write(0x0C, LCD_WRITE_COM);
    delay_ms(5);
}

void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte)
{
    if((x > 15) || (y > 1))
    {
        return;
    }
    if(0 == y)
    {
        lcd_write(0x80 + x, LCD_WRITE_COM);
    }
    else
    {
        lcd_write(0x80 + 0x40 + x , LCD_WRITE_COM);
    }

    lcd_write(byte, LCD_WRITE_DATA);

}

void display_str(unsigned char x, unsigned char y, unsigned char * string)
{
    if((x > 15) || (y > 1))
    {
        return;
    }
    if(0 == y)
    {
        lcd_write(0x80 + x, LCD_WRITE_COM);
    }
    if(1 == y)
    {
        lcd_write(0x80 + 0x40 + x , LCD_WRITE_COM);
    }

    while( (*string) != '\0' )
    {
        lcd_write(*string, LCD_WRITE_DATA);
        string++;
    }
}

unsigned char AD_read()
{
    unsigned char temp;
    iic_start();
    iic_send_byte(0x90);
    if(0 == ack)
        return ERR;
    iic_send_byte(0x40);
    if(0 == ack)
        return ERR;

    iic_start();
    iic_send_byte(0x90 + 1);
    if(0 == ack)
        return ERR;
    temp = iic_rcv_byte();
    iic_noack();
    iic_stop();
    return temp;
}

unsigned char DA_WRITE(unsigned char num)
{
    iic_start();
    iic_send_byte(0x90);
    if(0 == ack)
        return ERR;
    iic_send_byte(0x40);
        return ERR;
    if(0 == ack)
        return ERR;
    iic_send_byte(num);
    if(0 == ack)
        return ERR;
    iic_stop();

    return SUCC;
}

void main()
{
    unsigned char num;

  lcd_init();

  while(1)
    {
        DA_WRITE(num);
        num++;

        delay_s(2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值