📄 main.c
字号:
//24c16的串行数据SDA接于P3.7,串行时钟接于p3.6
//程序的功能:向24C16的第一区第二页的写一页的数据(16个字节),在把这页的所有单元的
//数据读出,并每隔0.5秒送一个数据到数码管上显示送到数码管上显示出来
//XT2:8MHZ
#include "msp430x14x.h"
//24C01控制口的定义
#define SDA_L P3OUT&=~BIT7//EEPROM数据线低
#define SDA_H P3OUT|=BIT7//数据线高
#define SDA_OUT P3DIR|=BIT7//设置数据线为输出状态
#define SDA_IN P3DIR&=~BIT7//设置数据线为输入状态
#define SDA_DATE P3IN & BIT7//读入SDA线的状态
#define SCL_L P3OUT&=~BIT6//串行时钟线低
#define SCL_H P3OUT|=BIT6//时钟高
#define SCL_OUT P3DIR|=BIT6//设置时钟线为输出状态
//数码管控制脚定义
#define SHUMA_PORT_DIR P5DIR
#define SHUMA_PORT_OUT P5OUT
#define SHUMA_1_LOW P6OUT&=~BIT6//开数码管的第一位P6.6口控制数码管的第一位
#define SHUMA_1_HIGH P6OUT|=BIT6//灭第一位数码管
#define SHUMA_2_LOW P6OUT&=~BIT5//开数码管的第二位
#define SHUMA_2_HIGH P6OUT|=BIT5//灭数码管的第二位
#define SHUMA_3_LOW P6OUT&=~BIT4//开数码管的第三位
#define SHUMA_3_HIGH P6OUT|=BIT4//灭数码管的第三位
#define SHUMA_4_LOW P6OUT&=~BIT0//开数码管的第四位
#define SHUMA_4_HIGH P6OUT|=BIT0//灭数码管的第四位
void int_clk();//时钟初始化函数声名
unsigned char rd1byte(void);//从2416中读取一字节子程序声名
void cack();//应答或非应答判断子程序声名
void delay_us(unsigned int i);//2.5微妙延时程序
void w1byte(unsigned char byte1);//向24C16写一字节的子程序声明
void star();//iic启动子程序
void stop();//IIC停止子程序
void nak();//iic非应答子程序
void mack();// iic发送应答子程序
void shumaguan_xianshi();
void write();//向24C16写入一页的数据的函数
void int_timer();//定时器A出使化子程序
void read();//从24C16读出一页的数据,共16字节,读出的数据放在disp[16]中
const unsigned char tabl1[11]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0X20,0x38,0xff};
// ;0 ,1 ,2 ,3 , 4, 5, 6 ,7 ,8 ,9 ,灭}数码管段码表
const unsigned char tabl2[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//带写入24C16的一页数据,共16个
static unsigned char err=0;
static unsigned char DISPLAY,disp[16];
static unsigned char time1=0,time2=0;
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
SHUMA_PORT_DIR|=0XFF;//set P5 is out 设置控制数码管数据口的IO口为输出模式
P6DIR|=BIT0+BIT4+BIT5+BIT6;
P3DIR|=BIT0;//P3.0控制74HC573的OE,把这个口设置为输出
P3OUT&=~BIT0;//使能74573,使得74573的输出随输入变化
int_clk();//时钟出使化
int_timer();
_EINT();//开中断
write();
read();
while(1)
{
shumaguan_xianshi();}
}
void int_timer()
{
TACTL|=TASSEL1+TACLR+ID0+ID1+MC0+TAIE;//选择SMLK的8分频作为定时器的时钟,定时器为增加模式,并且使能中断
TACCR0=9999;//中断周期为10豪秒
}
# pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
unsigned char flag;
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:flag=1;break;
}
while(flag)
{
flag=0;
time1++;
if(time1==50)
{
time1=0;
time2++;
DISPLAY=disp[time2];
if(time2==0x10)time2=0;
}
}
}
void read()//读数据操作
{ unsigned char i;
read1:
nak();
star();//发送启动脉冲
w1byte(0xa0);//24C16的芯片地址,高四位固定为1010,选择第一区,写操作
cack();
if(err)goto read1;
w1byte(0x10);//写入24C16的内部地址,选择第二页
cack();
if(err)goto read1;
nak();
stop();//重新开始
star();//
w1byte(0xa1);// 24C16的芯片地址,高四位固定为1010,选择第一区,读操作
cack();
if(err)goto read1;
for(i=0;i<16;i++)
{
disp[i]=rd1byte();//读入的数据送到显示缓冲单元
mack();
}
nak();
stop();
}
void write()//写入数据操作
{ unsigned char i;
write1:
star();//发送启动脉冲
w1byte(0xa0);//写24C16的芯片地址,高四位固定为1010,选择第一区,写操作
cack();// 读取应答或非应答信号
if(err)goto write1;//判断
w1byte(0x10);//写入24C16的内部地址,选择第二页
cack();
if(err)goto write1;
for(i=0;i<0x10;i++)
{
w1byte(tabl2[i]);//向2416的第一区第二页写入数据90
cack();
if(err)goto write1;
}
stop();//写数据完毕,发送停止脉冲
}
void shumaguan_xianshi()
{
unsigned char DISPLAY1;//=0x00;
unsigned char DISPLAY2;//=0X01;
unsigned char DISPLAY3;//=0X02;
unsigned char DISPLAY4;//=0X03;
DISPLAY2=DISPLAY/100%10;
DISPLAY1=DISPLAY/1000%10;
DISPLAY3=DISPLAY/10%10;
DISPLAY4=DISPLAY%10;
SHUMA_PORT_OUT=tabl1[DISPLAY1];
SHUMA_1_LOW;
delay_us(500);
SHUMA_1_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY2];
SHUMA_2_LOW;
delay_us(500);
SHUMA_2_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY3];
SHUMA_3_LOW;
delay_us(500);
SHUMA_3_HIGH;
SHUMA_PORT_OUT=tabl1[DISPLAY4];
SHUMA_4_LOW;
delay_us(500);
SHUMA_4_HIGH;
}
//时钟初始化子程序
void int_clk()
{
unsigned char i;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM1+SELS;
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}while((IFG1&OFIFG));
IFG1&=~OFIFG;
}
unsigned char rd1byte(void)//;读1字节子程序(通用)读出的数据存放在30H中
{ unsigned char i;
unsigned char ddata=0;
signed char temp;
SCL_OUT;//
SDA_IN;//
for(i=0;i<8;i++)//
{
ddata<<=1;
delay_us(4);
SCL_H;//
temp=SDA_DATE;
if(temp) ddata++;
delay_us(4);//
SCL_L;//
}
return ddata;
}
void cack()//;判断应答或非应答子程序 (通用)
{ SDA_IN;//SET SDA IO IS OUT
SCL_OUT;//SET SCL IO IS OUT
SCL_L;// cack:clr scl
//SDA_H;// setb sda
delay_us(1);// nop
SCL_H;// setb scl
err=0;//清除错误标志 clr err
if(SDA_DATE)err=1;// // mov c,sda
// jnc ack1
SCL_L; // setb err
SDA_OUT; //ack1: clr scl
}// ret
void w1byte(unsigned char byte1)//w1byte:
{
unsigned char i=8;// mov r7,#08h
SDA_OUT;
SCL_OUT;
while(i--) //wrlp: rlc A
{ // MOV SDA,C
delay_us(4);
if(byte1 & 0x80) // nop
{SDA_H;}
else//
{SDA_L;}
delay_us(4);
SCL_H; // SETB SCL
delay_us(4); // NOP
SCL_L; // CLR SCL
byte1<<=1; // DJNZ R7,WRLP
// ret
}
}
void mack() //;发应答子程序 (通用)
{ SDA_OUT;//
SCL_OUT;//
SDA_L;// mack: clr sda
SCL_H;// setb scl
delay_us(2);// nop
// nop
SCL_L;// clr scl
SDA_H;// setb sda
}// ret
void nak()//;非应答子程序 (通用)
{
SDA_OUT;
SCL_OUT;
SDA_H; //nak: setb sda
delay_us(2);// NOP
// NOP
SCL_H;// setb scl
delay_us(2);// nop
// nop
SCL_L;// clr scl
SDA_L;// clr sda
}// ret
void stop()//;发停止脉冲子程序 (通用)
{ SCL_OUT;//SET SCL IO IS OUT
SDA_OUT;//SET SDA IO IS OUT // stop: clr sda
SDA_L;// setb scl
SCL_H;// nop
delay_us(2);// nop
SDA_H;// setb sda
delay_us(2);// nop
//nop
SCL_L;// clr scl
}// ret
void star()//;发启动脉冲子程序 (通用)
{
SCL_OUT;//SET SCL IO IS OUT
SDA_OUT;//SET SDA IO IS OUT
SDA_H;// star: setb sda
SCL_H;// setb scl
delay_us(2); // nop
// nop ;确保空闲时间大于4.7us
SDA_L; // clr sda
delay_us(2);// nop
// nop
SCL_L; // clr scl
} // ret
void delay_us(unsigned int i)//delay 2.5us at 8M
{
unsigned int ii;
for(ii =i;ii > 0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -