⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MSP430子程序集
💻 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 + -