|
发表于 2013-7-7 17:05:00
|
显示全部楼层
额,1个小时都检查不出来...给你改好了,请认真学习一下宏定义还有注意键盘打字的粘连还有分号也别漏...PS:既然用了ACC怎么还用类似于1<<TWINT的表达...- //开机次数的记忆
- #include <iom16v.h>
- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- //命令定义
- //MT 为主机发送 mr 为主机接收
- #define START 0X08
- #define RE_START 0X10
- #define MT_SLA_ACK 0X18
- #define MT_SLA_NOACK 0X20
- #define MT_DATA_ACK 0X28
- #define MT_DATA_NOACK 0X30
- #define MR_SLA_ACK 0X40
- #define MR_SLA_NOACK 0X48
- #define MR_DATA_ACK 0X50
- #define MR_DATA_NOACK 0X58
- //前四位与器件地址有关
- #define RD_DEVICE_ADDR 0XA1
- #define WD_DEVICE_ADDR 0XA0
- //常用twi操作(主模式写和读)
- #define start() (TWCR = BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))
- #define stop() (TWCR = BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))
- #define wait() {while(!(TWCR & BIT(TWINT)));}
- #define teset_ack() (TWSR & 0xf8)
- #define set_ack() (TWSR|=BIT(TWEA))
- #define set_noack() (TWCR=BIT(TWEN))
- #define twi() (TWCR = BIT(TWINT)|BIT(TWEA)|BIT(TWEN))
- #define write8bit(x) {TWDR = (x);TWCR = BIT(TWINT)|BIT(TWEN);}
- uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar disp[8]={0,0,0,0,0,0,0,0};
- void delay(int t)//延时函数
- {
- int k,j;
- for(k=0;k<t;k++)
- for(j=0;j<10;j++);
- }
-
- void init (void )
- {
- DDRB=0XFF; // 端口初始化
- PORTB=0X00;
-
- DDRA=0XFF;
- PORTA=0;
-
- }
-
- void display(uchar *p)
- {
- char i;
- for(i=0;i<8;i++)
- {
- PORTA=table[*p];//段选
- p++;
- PORTB=table2[i];//位选
- delay(10);
- }
- }
-
- void twi_init(void)
- {
- TWBR=0X20;//大于10
- TWCR=0X04;//开启twi总线
- TWSR=0;//1分频
- }
-
-
- uchar iic_write(uchar wadata,uchar addr)
- {
- start();//开始信号
- wait();//等待
- if(teset_ack()!=START)//检验twi状态寄存器
- return 1;
-
- write8bit(WD_DEVICE_ADDR);//发送器件地址
- wait(); //等待
- if(teset_ack()!=MT_SLA_ACK )//检验TWI 状态寄存器,屏蔽预分频位,
- //如果状态字不是MT_SLA_ACK 转出错处理
- return 1;
-
- write8bit(addr);//写地址
- wait();//等待
- if(teset_ack()!=MR_DATA_ACK )//检验TWI 状态寄存器,屏蔽预分频器,如
- //果状态字不是MT_DATA_ACK 转出错处处理
- return 1;
-
- write8bit(wadata);//写数据
- wait();//等待
- if(teset_ack()!=MR_DATA_ACK )//检验TWI 状态寄存器,屏蔽预分频器,如
- //果状态字不是MT_DATA_ACK 转出错处处理
- return 1;
-
- stop();//停止信号
- return 0;
- }
- uchar iic_read(uchar addr)
- {
- uchar temp;
- start();//开始信号
- wait();//等待
- if(teset_ack()!=START)//检验twi状态寄存器
- return 1;
-
- write8bit(WD_DEVICE_ADDR);//发送器件地址
- wait(); //等待
- if(teset_ack()!=MT_SLA_ACK )//检验TWI 状态寄存器,屏蔽预分频位,
- //如果状态字不是MT_SLA_ACK 转出错处理
- return 1;
-
- write8bit(addr);//写地址
- wait();//等待
- if(teset_ack()!=MR_DATA_ACK )//检验TWI 状态寄存器,屏蔽预分频器,如
- //果状态字不是MT_DATA_ACK 转出错处处理
- return 1;
-
- start();//开始信号
- wait();//等待
- if(teset_ack()!=RE_START)//检验twi状态寄存器
- return 1;
-
- write8bit( RD_DEVICE_ADDR );//发送器件地址
- wait(); //等待
- if(teset_ack()!=MR_SLA_ACK )//检验TWI 状态寄存器,屏蔽预分频位,
- //如果状态字不是MT_SLA_ACK 转出错处理
- return 1;
-
- twi();//重新启动
- wait();//等待
- if(teset_ack()!=MR_DATA_NOACK )//检验TWI 状态寄存器,屏蔽预分频位,
- //如果状态字不是MT_SLA_ACK 转出错处理
- return 1;
-
- temp=TWDR;
- stop();//停止信号
- return temp;
- }
-
- void main(void )
- {
- uchar i;
- init();
- twi_init();
- i=iic_read(0x20);
- i++;
- disp[0]=i/100;
- disp[1]=i%100/10;
- disp[2]=i%100%10;
- while (iic_write(i,0x20));
- while(1)
- {
- display(disp);
- }
-
-
- }
复制代码 |
|