iic.c文件
为什么我实现下面的代码,会出现先这个结果呀,数字在数码管上的显示这些函数是没有问题的。
/* # I2C代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "iic.h"
#define DELAY_TIME 5
//
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
//
void I2CSendAck(unsigned char ackbit)
{
scl = 0;
sda = ackbit;
I2C_Delay(DELAY_TIME);
scl = 1;
I2C_Delay(DELAY_TIME);
scl = 0;
sda = 1;
I2C_Delay(DELAY_TIME);
}
void eeprom_write_string(unsigned char* eeprom_string,unsigned char num,unsigned char addr)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
while(num--)
{
I2CSendByte(*eeprom_string++);
I2CWaitAck();
I2C_Delay(200);
}
I2CStop();
}
void eeprom_read_string(unsigned char* eeprom_string,unsigned char num,unsigned char addr)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
while(num--)
{
*eeprom_string++=I2CReceiveByte();
I2C_Delay(200);
if (num)
I2CSendAck(0);
else
I2CSendAck(1);
}
I2CStop();
}
void eeprom_write_byte(unsigned char dat,unsigned char addr)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
unsigned char eeprom_Read_byte(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
dat=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return dat;
}
void Write()
{
unsigned char i;
for (i=0;i<6;i++)
{
eeprom_write_byte(input[i],i);
}
}
void Read()
{
unsigned char i;
for (i=0;i<6;i++)
{
mima[i]=eeprom_Read_byte(i);
}
}
iic.h
#ifndef __iic_H__
#define __iic_H__
#include <STC15F2K60S2.H>
#include "System.h"
#include "Display.h"
#include "Key.h"
#include "intrins.h"
sbit sda=P2^1;
sbit scl=P2^0;
static void I2C_Delay(unsigned char n);
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(unsigned char ackbit);
void eeprom_write_string(unsigned char* eeprom_string,unsigned char num,unsigned char addr);
void eeprom_read_string(unsigned char* eeprom_string,unsigned char num,unsigned char addr);
void eeprom_write_byte(unsigned char dat,unsigned char addr);
unsigned char eeprom_Read_byte(unsigned char addr);
void Write();
void Read();
#endif
main.c
#include <STC15F2K60S2.H>
#include "System.h"
#include "Display.h"
#include "Key.h"
#include "iic.h"
unsigned char x;
unsigned char num=8;
unsigned char daxx[2]={30,60};
unsigned char dax[2]={20,70};
void display()
{
unsigned char i=0;
P0=0xff;SelectHC573(7);SelectHC573(0);
SMG_Bit(SMG[daxx[0]/10],3);
SMG_Delay(300);
SMG_Bit(SMG[daxx[0]%10],4);
SMG_Delay(300);
SMG_Bit(SMG[daxx[1]/10],6);
SMG_Delay(300);
SMG_Bit(SMG[daxx[1]%10],7);
SMG_Delay(300);
SMG_Bit(0xff,8);
SMG_Delay(300);
}
int main()
{
Close();
eeprom_write_string(dax,2,0);
eeprom_read_string(daxx,2,0);
while(1)
{
display();
}
}