×
单片机 > 单片机程序设计 > 详情

AVR PCF8591 AD&DA数码管显示

发布时间:2020-06-18 发布时间:
|

#include "iom16v.h"

#include "macros.h"

#define uchar unsigned char

#define uint unsigned int

/*******************************************

TWSR中数据的各种状态,#include"iom16v.h"

#include "macros.h"

#define uchar unsigned char

#define uint unsigned int

/*******************************************

TWSR中数据的各种状态,参照mega 16手册172页

*******************************************/

//主模式启动状态

#define START 0X08//启动总线

#define RESTART 0X10//再启动总线

//主机发送模式各种状态

#define MT_SLA_ACK 0X18//SLA_W写地址已发送,收到应答位

#define MT_SLA_NACK 0X20//SLA_W写地址已发送,收到非应答位

#define MT_DATA_ACK 0X28//写数据已发送,收到应答位

#define MT_DATA_NACK 0X30//写数据已发送,收到非应答位

#define MT_ARB_LOST 0X38//SLA_W或者数据仲裁失败

//主接收模式各种状态

#define MR_ARB_LOST 0X38//SLA_W或者数据仲裁失败

#define MR_SLA_ACK 0X40//SLA_R已发送,收到应答位

#define MR_SLA_NACK 0X48//SLA_R已发送,收到非应答位

#define MR_DATA_ACK 0X50//收到数据,返回应答位

#define MR_DATA_NACK 0X58//收到数据,返回非应答位

//IIC操作

#define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))

#define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))

#define TestACK() (TWSR&0Xf8)//TWSR前五位状态

#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))

#define SendAck() (TWCR|=BIT(TWEA))

#define SendNoAck() (TWCR&=~BIT(TWEA))

#define ReadNoAck()   (TWCR=BIT(TWEN)|BIT(TWINT))

#define ReadAck()(TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))

#define Wait() while(!(TWCR&BIT(TWINT)))//等待TWINT置1

uint i;

////////////////////////////////////

void twi_init()

{

   TWBR=0X12;

         TWSR=0;

         TWCR=0X44;

}

////////////////////////////////////////////////////////////////写函数

uchar write_data(uchar add, uchardata,uchar data1)

{

   Start();

         Wait();

         if(TestACK()!=START)

         {

           PORTA=0x01;

         }

         TWDR=add;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {

            PORTA=0x04;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x10;

         }

         TWDR=data1;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x20;

         }

         Stop();

         delay(1);

         

         

}

//////////////////////读函数//////////////////////////////////////////////////

uchar Read(uchar data)

{

uchar team;

Start();

Wait();

if(TestACK()!=START)

         {show(8,1);

           PORTA=0xfe;

         }

         TWDR=0x90;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {show(8,1);

            PORTA=0xfb;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {show(8,1);

            PORTA=0xff;

         }

         Start();

         Wait();

         if(TestACK()!=RESTART)

         {show(8,1);

           PORTA=0xff;

         }

         TWDR=0x91;

         Send();

         Wait();

         if(TestACK()!=MR_SLA_ACK)

         {show(8,1);

            PORTA=0xff;

         }

         ReadNoAck();

         Wait();

         delay(1);

         if(TestACK()!=MR_DATA_NACK)

         {show(0,1);

            PORTA=0xff;

         }

         team=TWDR;

          Stop();

          return team;show(8,0);

         

}

///////////////////////////////////////////////////////////////////////

const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,

                             0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

const table1[]={0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void delay(uint ms)

{

       uint i,j;

         for(i=0;i

            {

            for(j=0;j<1141;j++);

      }

}

void show(uchar j,uchar k)

{

         DDRB=0XFF;

         DDRD=0X03;

         PORTD=0X02;   

         PORTB=table[j];

         PORTD=0X01;

         PORTB=table1[k];

   delay(1);

}

///////////////////////////////////////////////////////////

main()

{

uint a=0,temp;

twi_init();

DDRA=0XFF;

while(1){

a++;

write_data(0x90,0x44,a);

if(a>200) {a=0;}

temp=Read(0x42);

show(temp/100,1);

show(temp%100/10,2);

show(temp%100%10,3);

}

}参照mega 16手册172页

*******************************************/

//主模式启动状态

#define START 0X08//启动总线

#define RESTART 0X10//再启动总线

//主机发送模式各种状态

#define MT_SLA_ACK 0X18//SLA_W写地址已发送,收到应答位

#define MT_SLA_NACK 0X20//SLA_W写地址已发送,收到非应答位

#define MT_DATA_ACK 0X28//写数据已发送,收到应答位

#define MT_DATA_NACK 0X30//写数据已发送,收到非应答位

#define MT_ARB_LOST 0X38//SLA_W或者数据仲裁失败

//主接收模式各种状态

#define MR_ARB_LOST 0X38//SLA_W或者数据仲裁失败

#define MR_SLA_ACK 0X40//SLA_R已发送,收到应答位

#define MR_SLA_NACK 0X48//SLA_R已发送,收到非应答位

#define MR_DATA_ACK 0X50//收到数据,返回应答位

#define MR_DATA_NACK 0X58//收到数据,返回非应答位

//IIC操作

#define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))

#define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))

#define TestACK() (TWSR&0Xf8)//TWSR前五位状态

#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))

#define SendAck() (TWCR|=BIT(TWEA))

#define SendNoAck() (TWCR&=~BIT(TWEA))

#define ReadNoAck()   (TWCR=BIT(TWEN)|BIT(TWINT))

#define ReadAck()(TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))

#define Wait()while(!(TWCR&BIT(TWINT)))//等待TWINT置1

uint i;

////////////////////////////////////

void twi_init()

{

   TWBR=0X12;

         TWSR=0;

         TWCR=0X44;

}

////////////////////////////////////////////////////////////////写函数

uchar write_data(uchar add, uchardata,uchar data1)

{

   Start();

         Wait();

         if(TestACK()!=START)

         {

           PORTA=0x01;

         }

         TWDR=add;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {

            PORTA=0x04;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x10;

         }

         TWDR=data1;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x20;

         }

         Stop();

         delay(1);

         

         

}

//////////////////////读函数//////////////////////////////////////////////////

uchar Read(uchar data)

{

uchar team;

Start();

Wait();

if(TestACK()!=START)

         {show(8,1);

           PORTA=0xfe;

         }

         TWDR=0x90;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {show(8,1);

            PORTA=0xfb;

         }

         TWDR=data;

         Send();



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单