zhaoyongke 发表于 2009-12-10 14:19:18

协会的430开发板资料,一点点搜集,一点点积累

这个430板子是杨松师兄给我用的,今年暑假我深入地研究了一番,感触颇多,一些芯片资料是下载的,程序是一点点读datasheet摸索出来的,有些费了好大劲,但总算成功了。把我的探索和经历在此分享一下,希望对后人有所帮助。

这个是电路原理图。
点击此处下载 ourdev_512781.pdf(文件大小:2.09M) (原文件名:12x2-149.pdf)

学习430,有一个很好的条件就是可以申请免费芯片,可以自己画板,我暑假就画了一个1611的最小系统板,开出来自己用,爽O(∩_∩)O~

zhaoyongke 发表于 2009-12-10 14:28:13

相关的芯片资料,也可以自己下载,不过放着这里比较方便大家查看

点击此处下载 ourdev_512787.pdf(文件大小:250K) (原文件名:24LC01.pdf)
点击此处下载 ourdev_512788.pdf(文件大小:110K) (原文件名:74lvcc4245.pdf)
点击此处下载 ourdev_512789.pdf(文件大小:755K) (原文件名:dac7571.pdf)
点击此处下载 ourdev_512790.pdf(文件大小:167K) (原文件名:ds1307.pdf)
点击此处下载 ourdev_512791.pdf(文件大小:591K) (原文件名:ds2433.pdf)
点击此处下载 ourdev_512792.pdf(文件大小:941K) (原文件名:ds2890.pdf)
点击此处下载 ourdev_512793.pdf(文件大小:364K) (原文件名:max1169.pdf)
点击此处下载 ourdev_512794.pdf(文件大小:1.07M) (原文件名:msp430f149.pdf)
点击此处下载 ourdev_512795.pdf(文件大小:782K) (原文件名:pdiusbd12.pdf)
点击此处下载 ourdev_512796.pdf(文件大小:257K) (原文件名:reg1117.pdf)
点击此处下载 ourdev_512797.pdf(文件大小:668K) (原文件名:tlc274.pdf)

养成一个习惯:

不要找现成的程序(你会说,自己写多麻烦!),给自己一天时间读读datasheet,你再去看别人的程序,或者自己写程序,就能发现N多问题,借着问题去探索这个芯片,不管是什么芯片,都能被你训练得服服帖帖!

如果直接找到别人现成的程序,用起来了,但印象不够深刻,有些问题你根本就发现不了,从而和没用过这个芯片一样,没有任何收获。

这也是为什么我把datasheet放在程序前面的原因。

英语不好,不是借口。

相反,正好借此机会可以练练自己的阅读能力,很可能对你考六级有帮助呢!

zhaoyongke 发表于 2009-12-10 14:46:56

ouravr是目前我上的最多的论坛,因为在这里,是一个自由的地方。学习就是需要这样一个自由的空间。

当我遇到困惑时,当我感到迷茫时,我会来这里转转,找到灵感。

今年参加全国电子设计大赛,郁闷的时候,看那些特别解气的帖子,心里就痛快很多。

感谢armok。

第一天:准备编译环境。

430开发要用IAR编译器,我用的是IAR Embedded Workbench for MSP430 V4.11B。协会成员可以到协会的公共硬盘下载。

大赛我们用430,但没有发挥出任何优势,因为,我们做C题,和单片机基本不沾边,所以,准备了一假期的430,就bye了。

IAR是很好用的软件,让我养成了jtag单步、断点调试的习惯,这是以前学51,avr没有的习惯。以前用的最多的是串口调试,这两者对写程序来说是最好的帮手,如果找不到问题,那就说明你的调试环境有问题,你先把调试环境建立起来,以后就好说了。51和avr还是用串口比较好,avr的jtag用过一段时间,发现反应很迟钝,而430的jtag速度相当快。这也叫各有利弊吧!

安装不必说,一顺到底,飘柔就是这么自信!

新建工程需要注意,选C工程。然后自动生成一个main.c,你就在代码区添加自己的代码就行了。

选择单片机型号

选择仿真器

编译

仿真

就这几步,好好练习

zhaoyongke 发表于 2009-12-10 14:50:36

第二天:点亮led

十月革_命的一声炮响,给我们带来了马克思主义。

led点亮标志着我们学会430的最基本IO操作了。


/***************************************************************************
作者:赵永科
日期:2009-6-10
功能:使430板子上数码管显示数字,从左到右。
***************************************************************************/
#include "msp430x14x1.h"
#include "led.h"
unsigned char buffer={0,1,2,3,4,9};/*显存,可在程序中更改*/
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
init_led();
while(1)
{
    show(buffer);
}

}


led.h

#ifndef _kkk_164led_h
#define _kkk_164led_h
void send164(unsigned char a);
void delay_led(unsigned int a);
void show(unsigned char *d);
void init_led(void);
#endif


led.c

/**************************************************************************
发送164数据
**************************************************************************/
#include "msp430x14x1.h"
void send164(unsigned char a)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
   if(a&0x80)
   {
       P5OUT|=0x80;
   }
   else
   {
       P5OUT&=~0x80;
   }
   P5OUT&=~0x40;
   P5OUT|=0x40;
   a<<=1;
   }
}
void delay_led(unsigned int a)
{
while(a--);
}
/*************************************************************************
显示函数,参数需要一个至少6字节的数组
*************************************************************************/
void show(unsigned char *d)
{
unsigned char i;
const unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x7e,0x71};
for(i=0;i<6;i++)
{
    send164(~(1<<i));
    send164(table]);
    delay_led(450);
}
}
void init_led(void)
{
P5DIR|=0xc0;
}

zhaoyongke 发表于 2009-12-10 14:58:13

第三天:按键
键盘我用过1*8的,也用过4*4的,而这个板子上的按键有点特别,属于n线控制n*(n-1)型行列键盘,需要动动脑筋。

其实也简单,只要一列列地选通,判断其余的行,就能确定坐标了。




#include "msp430x14x1.h"
#define KW1 0x01
#define KW2 0x02
#define KW3 0x04
#define KW4 0x08
void key(unsigned char *buffer)
{
unsigned char t[]={0x01,0x02,0x04,0x08};
/////////////////////////////

P1DIR|=0x0f;
P1OUT=t;
P1DIR=t;
if(P1IN&KW2)
{
    *buffer=9;
}
if(P1IN&KW4)
{
    *buffer=7;
}
if(P1IN&KW3)
{
    *buffer=8;
}
P1OUT=0x00;

P1DIR=0x0f;
P1OUT=t;
P1DIR=t;
if(P1IN&KW1)
{
    *buffer=6;
}
if(P1IN&KW3)
{
    *buffer=5;
}
if(P1IN&KW4)
{
    *buffer=4;
}
P1OUT=0x00;
P1DIR=0x0f;
P1OUT=t;
P1DIR=t;
if(P1IN&KW1)
{
    *buffer=3;
}
if(P1IN&KW2)
{
    *buffer=2;
}
if(P1IN&KW4)
{
    *buffer=1;
}
    P1OUT=0x00;

P1DIR=0x0f;
P1OUT=t;
P1DIR=t;
if(P1IN&KW1)
{
    *buffer=11;
}
if(P1IN&KW2)
{
    *buffer=10;
}
if(P1IN&KW3)
{
    *buffer=0;
}
P1OUT=0x00;
P1DIR&=~0x0f;
}

zhaoyongke 发表于 2009-12-12 23:37:17

第4天 ds18b20
ds18b20.h
#ifndef _kkk_ds18b20_h
#define _kkk_ds18b20_h
#include "msp430x15x.h"
/*
移植时需要改动
*/
#define Mask_18b20      0x20
#define DataDir_18b20   P3DIR
#define DataIN_18b20    P3IN&Mask_18b20
#define OUT_0   P3OUT&=~Mask_18b20
#define OUT_1   P3OUT|=Mask_18b20



//some data for ROM commands
#define SEARCH_ROM 0xf0
#define READ_ROM   0x33
#define MATCH_ROM0x55
#define SKIP_ROM   0xcc
#define SEARCH_ALARM 0xec

//some data for function
#define TEMPERATURE_CONVERT 0x44
#define WRITE_SCRATCHPAD 0x4e
#define READ_SCRATCHPAD0xbe
#define COPY_SCRATCHPAD0x48
#define READ_SUPPLY      0xb4
#define RECALL_EEPROM    0xb8



void delay_10us(unsigned int t);
unsigned char reset_bus(void);
void init_device(void);
void write_1(void);
void write_0(void);
void write_byte(unsigned char d);
unsigned char read_bit(void);
unsigned char read_byte(void);
void start_convert(void);
unsigned int read_temperature(void);
void convert_t(int temp,char dst[]);

#endif


ds18b20.c

#include "ds18b20.h"


void delay_10us(unsigned int t)
{
unsigned char i;
while(t--)
{
    for(i=8;i;i--);
}
}

unsigned char reset_bus(void)
{
DataDir_18b20|=Mask_18b20;
OUT_1;
_NOP();
_NOP();
OUT_0;
delay_10us(49);
DataDir_18b20&=~Mask_18b20;
delay_10us(6);
while(!DataIN_18b20);
return 0;
}
void init_device(void)
{
unsigned char i;
BCSCTL1&=~XT2OFF;
do
{
    IFG1&=~OFIFG;
    for(i=0xff;i;i--);
}while((IFG1&OFIFG)!=0);
BCSCTL2|=SELM1;//MCLK=XT2;         
DataDir_18b20|=Mask_18b20;
}
void write_1(void)
{
DataDir_18b20|=Mask_18b20;
OUT_1;
_NOP();
_NOP();
OUT_0;
_NOP();
_NOP();
DataDir_18b20&=~Mask_18b20;
delay_10us(6);
}
void write_0(void)
{
DataDir_18b20|=Mask_18b20;
OUT_1;
_NOP();
_NOP();
OUT_0;
delay_10us(7);
DataDir_18b20&=~Mask_18b20;
}
void write_byte(unsigned char d)
{
unsigned char i;
for(i=0;i<8;i++)
{
    if(d&0x01)
    {
      write_1();
    }
    else
    {
      write_0();
    }
    d>>=1;
    _NOP();
    _NOP();
}
}
unsigned char read_bit(void)
{
unsigned char t;
DataDir_18b20|=Mask_18b20;
OUT_1;
_NOP();
_NOP();
OUT_0;
_NOP();
_NOP();
DataDir_18b20&=~Mask_18b20;
delay_10us(1);
t=DataIN_18b20;
delay_10us(6);
return t;
}
unsigned char read_byte(void)
{
unsigned char t=0,i;
for(i=0;i<8;i++)
{
    t>>=1;
    t|=(read_bit()?0x80:0x00);
    _NOP();
    _NOP();
}
return t;
}
/*****************************
设置18b20数据长度
参数可以是9,10,11,12
不要设为其它值!
******************************/
void set_config(unsigned char length)
{
length+=3;
length<<=5;
write_byte(WRITE_SCRATCHPAD);
_NOP();
write_byte(0xff);
_NOP();
write_byte(0xff);
_NOP();
write_byte(length);
_NOP();
}
/*****************************
18b20开始温度转换函数
******************************/
void start_convert(void)
{
reset_bus();
delay_10us(100);
write_byte(SKIP_ROM);
delay_10us(100);
write_byte(TEMPERATURE_CONVERT);
delay_10us(100);
}
/*****************************
从18b20读取温度函数
返回18b20的温度值
******************************/
unsigned int read_temperature(void)
{
    unsigned int temperature=0x0000;
    unsigned char low,high;
    reset_bus();
    delay_10us(100);
    write_byte(SKIP_ROM);
    delay_10us(100);
    write_byte(READ_SCRATCHPAD);
    delay_10us(100);
    low=read_byte();//0
    delay_10us(100);
    high=read_byte();//1
    delay_10us(100);
   reset_bus();
   delay_10us(100);
   temperature|=(high<<8)|low;
   return temperature;
}
/*****************************
温度显示转换函数
temp:18b20传来的原始数据
dst数组存放转换结果,以便显示
第一字节:符号。0+,1-
第二字节:整数部分
第三字节:小数部分=data*2^(-4)
******************************/
void convert_t(int temp,char dst[])
{
dst=temp&0x8000;
dst=(temp&0x0fff)>>4;
dst=temp&0x0f;
}

zhaoyongke 发表于 2009-12-12 23:42:28

串口当然是必不可少的!尤其在做上位机控制系统的时候。
在调试程序的时候,也可以用串口。
但最好用jtag调试,方便,而且直接。



#ifndef usart_module_h
#define usart_module_h
#include<msp430x15x.h>
/*
以下为430 的底层函数,不要随意改动
但根据实际可以将注释后的语句提取出来
*/
void init_usart(void);
void delay_usart(void);
/*
以下为通用函数,可以按照需求进行修改
可以仿照C++格式(数据流格式)
*/
//输出字符串
void print_str(const unsigned char *d);
//输出十进制整数
void print_int(int a);
//输出十六进制数,便于调试
void print_hex(unsigned char a);
//一些常用函数,可以做成函数库
unsigned char strlen(unsigned char *d);
void reverse(unsigned char * d);//翻转
int char2int(unsigned char c);//字符转整形
void int2char(unsigned char*d,int a);//整形转字符
#endif

/***********************************声明*********************
以下为430 的底层函数,不要随意改动
但根据实际可以将注释后的语句提取出来
void init_usart(void);
void delay_usart(void);
以下为通用函数,可以按照需求进行修改
可以仿照C++格式(数据流格式)
//输出字符串
void print_str(const unsigned char *d);
//输出十进制整数
void print_int(int a);
//输出十六进制数,便于调试
void print_hex(unsigned char a);
//一些常用函数,可以做成函数库
unsigned char strlen(unsigned char *d);
void reverse(unsigned char * d);//翻转
int char2int(unsigned char c); //字符转整形
void int2char(unsigned char*d,int a);//整形转字符
************************************************/
#include"usart_module.h"
void delay_usart(void)
{
    unsigned int i;
    for(i=400;i;i--);
}
void init_usart(void)
{ unsigned char i;
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
BCSCTL1 &= ~XT2OFF;                     // XT2on
do
{
IFG1 &= ~OFIFG;                           // Clear OSCFault flag
for (i = 0xFF; i > 0; i--);               // Time for flag to set
}while ((IFG1 & OFIFG));                   // OSCFault flag still set?
P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
BCSCTL2 |= SELS;               // MCLK = SMCLK = XT2 (safe)
ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
UCTL0 |= CHAR;                            // 8-bit character
UTCTL0 |= SSEL1;                        // UCLK = SMCLK
UBR00 = 0x41;                           // 8MHz 9600
UBR10 = 0x03;                           // 8MHz 9600
UMCTL0 = 0x4A;                            // 8MHz 9600 modulation
UCTL0 &= ~SWRST;                        // Initialize USART state machine(默认为1,在1的情况下设置串口,
                                          //                                  然后设置SWRST=0;
IE1 |= URXIE0;                            // Enable USART0 RX interrupt
   _EINT();                                 //全局中断
}
void send_usart(unsigned char d)
{
       _DINT();                           //禁止中断
       TXBUF0=d;
       while((IFG1&UTXIFG0)==0);
       IFG1&=~UTXIFG0;                  //可以省略,因为对UTXBUF进行写操作可以复位UTXIFGX
       _EINT();
}
unsigned char rcv_usart(void)
{
    _DINT();
    while(!IFG1&URXIFG0);
    return RXBUF0;
}
//求字符串长度                           //可以考虑sizeof
unsigned char strlen_usart(unsigned char *d)
{
        unsigned char i=0;
        while(d);
        return   --i;                  //因为在判断字符串结尾的\0时i加了一
}
//将字符串倒置
void reverse(unsigned char * d)
{
        unsigned char i,j,k;
        i=strlen_usart(d);
        for(j=0;j<i/2;j++)
        {
                k=d;
                d=d;
                d=k;
        }
}
//将char变成int
int char2int(unsigned char c)
{
        if(c>='0' && c<='9')
        {
                return (int)(c-'0');
        }
        else
        {
                return -1;
        }
}
//将int变成char
void int2char(unsigned char*d,int a)
{
        unsigned char *dd,t;
        dd=d;
        while(a)
        {
                t=a%10;
                *d++='0'+t;
                a/=10;
        }
        *d=0;
        reverse(dd);
}
//字符串输出函数
void print_str(const unsigned char *d)
{
        while(*d!='\0')
        {
                send_usart(*d);
                d++;
                delay_usart();
        }
}
//整数输出函数
void print_int(int a)
{
        unsigned char buff;
        int2char(buff,a);
      if(!strlen_usart(buff))
         send_usart('0');
        else print_str(buff);
}
//以16进制格式输出整数
void print_hex(unsigned char a)
{
        unsigned char t="0123456789abcdef";
//        print_str("0x");
        send_usart(t);
      delay_usart();
        send_usart(t);
      delay_usart();
}

zhaoyongke 发表于 2009-12-12 23:48:12

第五天:IIC通信

通过这个板子,我深入学习了IIC总线协议,这对以后我做“温室远程控制系统”起到很关键的作用,该系统的传感器采集节点完全用IIC总线连接。

学习总线,最关键的是了解总线的数据流。

IIC无非主发从收,主收从发,应答。

这里使用IO模拟IIC总线,实现了最基本的通信,至于多主总线仲裁没有考虑。


IIC.h
/************************************************************************
IIC通信实验——无线电协会msp430f1491学习板
作者:赵永科
日期:2009-7-23
函数作用:实现基本iic通信
************************************************************************/

#ifndef _kkk_iic_h
#define _kkk_iic_h
void iic_init(void);
void iic_start(void);
void iic_stop(void);
void iic_send_byte(unsigned char d);
void iic_send_ack(void);
void iic_send_nack(void);
unsigned char iic_read_ack(void);
unsigned char iic_read_byte(void);


#endif


iic.c
#include "msp430x14x1.h"


#define SDA_Mask 0x10
#define SCL_Mask 0x80
#define SDA_DirP5DIR
#define SCL_DirP4DIR
#define SDA_0 P5OUT&=~SDA_Mask
#define SDA_1 P5OUT|=SDA_Mask
#define SCL_0 P4OUT&=~SCL_Mask
#define SCL_1 P4OUT|=SCL_Mask
#define DataIn P5IN


void iic_init(void)
{
SDA_Dir|=SDA_Mask;
SCL_Dir|=SCL_Mask;
SDA_1;
SCL_1;
}
void iic_start(void)
{
iic_init();
SCL_1;
SDA_1;
_NOP();
SDA_0;
}
void iic_stop(void)
{
iic_init();
SCL_1;
SDA_0;
_NOP();
SDA_1;
}
void iic_send_byte(unsigned char d)
{
unsigned char i;
SCL_0;
for(i=0;i<8;i++)
{
    if(d&0x80)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    SCL_1;
    d<<=1;
    _NOP();
    SCL_0;
}
}
void iic_send_ack(void)
{
SCL_0;
_NOP();
SDA_0;
_NOP();
SCL_1;
_NOP();
_NOP();
SCL_0;
}
void iic_send_nack(void)
{
SCL_0;
_NOP();
SDA_1;
_NOP();
SCL_1;
_NOP();
_NOP();
SCL_0;
}
unsigned char iic_read_ack(void)
{
unsigned char t;
SCL_0;
_NOP();
SDA_Dir&=~SDA_Mask;
SDA_1;
_NOP();
SCL_1;
if(DataIn&SDA_Mask)//NACK
{
    t=1;
}
else//ACK
{
    t=0;
}
SDA_Dir|=SDA_Mask;
SCL_0;
return t;
}

unsigned char iic_read_byte(void)
{
unsigned char t=0,i;
SCL_0;
SDA_Dir&=~SDA_Mask;
SDA_1;
for(i=0;i<8;i++)
{
    t<<=1;
    SDA_1;
    _NOP();
    SCL_1;
    _NOP();
    if(DataIn&SDA_Mask)
    {
      t|=0x01;
    }
    SCL_0;
}
SDA_Dir|=SDA_Mask;
return t;
}

zhaoyongke 发表于 2009-12-12 23:53:39

ds1302大家一定再熟悉不过了,spi接口,这里我不用它,而用ds1307,和1302的寄存器是一样的,只是接口为iic,

ds1307.h
#ifndef _kkk_ds1307_h
#define _kkk_ds1307_h
#define uchar unsigned char
#define uint unsigned int
struct Timer
{
uchar hour;
uchar minute;
uchar second;
uchar year;
uchar month;
uchar date;
uchar week;
};
void get_time(struct Timer *pt);
void set_time(struct Timer *pt);


#endif

ds1307.c
#include "msp430x14x.h"
#include "iic.h"
#include "ds1307.h"

void get_time(struct Timer * pt)
{
unsigned char i;
iic_start();
iic_send_byte(0xd0);
i=iic_read_ack();
_NOP();
iic_send_byte(0x00);
_NOP();
i=iic_read_ack();
iic_stop();
_NOP();
_NOP();
iic_start();
iic_send_byte(0xd1);
i=iic_read_ack();
_NOP();
pt->second=iic_read_byte();//second
_NOP();
iic_send_ack();
_NOP();
pt->minute=iic_read_byte();//minute
_NOP();
iic_send_ack();
_NOP();
pt->hour=iic_read_byte();//hour
_NOP();
iic_send_ack();
_NOP();
pt->week=iic_read_byte();//week
_NOP();
iic_send_ack();
_NOP();
pt->date=iic_read_byte();//date
_NOP();
iic_send_ack();
_NOP();
pt->month=iic_read_byte();//month
_NOP();
iic_send_ack();
_NOP();
pt->year=iic_read_byte();//year
_NOP();
iic_send_ack();
_NOP();
i=iic_read_byte();//control
_NOP();
iic_send_nack();
iic_stop();

}
void set_time(struct Timer * pt)
{
unsigned char i;
iic_start();
iic_send_byte(0xd0);
i=iic_read_ack();
_NOP();
iic_send_byte(0x00);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->second);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->minute);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->hour);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->week);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->date);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->month);
_NOP();
i=iic_read_ack();
iic_send_byte(pt->year);
_NOP();
i=iic_read_ack();
iic_stop();
}


你一定奇怪,为什么要有i=iic_read_ack();这样一些似乎没用的语句呢?去掉行不行?

答案是不行。IIC总线必须要有应答位的处理,即从机没有应答怎么办?

这里用这样的语句,可以设定断点,在430的调试环境下可以逐步调试IIC,直到找到问题的关键所在。

这是我假期总结出来的经验,希望对大家有用。

一定要用一个变量存储最近状态,这样在变量窗口可以清晰看到出现哪些问题。

zhaoyongke 发表于 2009-12-12 23:56:39

和上面一起的main.c

/************************************************************************
IIC通信实验——无线电协会msp430f1491学习板
作者:赵永科
日期:2009-7-23
函数作用:实现基本iic通信
************************************************************************/
#include "msp430x14x.h"
#include "iic.h"
#include "ds1307.h"
unsigned char i,j;
struct Timer mytimer;
void delay(unsigned int i)
{
while(i--);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
/*
mytimer.second=0x00;
mytimer.minute=0x18;
mytimer.hour=0x11;
mytimer.week=0x04;
mytimer.date=0x23;
mytimer.month=0x07;
mytimer.year=0x09;
set_time(&mytimer);
*/
while(1)
{
    delay(1000);
    get_time(&mytimer);
}

}


如果习惯使用结构体,你会节省不少时间去判断一长串数组的某个字节干什么用的。

以后学usb设备描述符,无线通信模块nrf905,gps模块数据等等都是用结构体实现的。

除了结构体,还有位域,还有联合体,都需要认真学学。

zhaoyongke 发表于 2009-12-12 23:58:46

pca6107大家可能没用过,告诉大家,这是个很有用的IO扩展芯片,带中断,非常适合IO口较少的单片机进行IO扩展,接口为IIC。

.h
#ifndef _kkk_pca6107_h
#define _kkk_pca6107_h
#include "msp430x14x.h"
#define ADDR_pca6107 0x30


/********************************
为了方便操作,写了三个常用宏
DDR(x)和AVR一样,对应位为1代表输出,为0代表输入
PIN   得到引脚输入
POUT(x) 和AVR一样,对应位为1代表高电平输出,为0代表低电平输出
*********************************/
#define DDR(x) set_reg_6107(3,~(x))
#define PIN   get_reg_6107(0)
#define POUT(x) set_reg_6107(1,(x))
void set_reg_6107(unsigned char reg,unsigned char da);
unsigned char get_reg_6107(unsigned char reg);

#endif

.c

#include "pca6107.h"
#include "iic.h"
void set_reg_6107(unsigned char reg,unsigned char da)
{
    iic_start();
    iic_send_byte(ADDR_pca6107);
    while(iic_read_ack());
    iic_send_byte(reg);
    while(iic_read_ack());
    iic_send_byte(da);
    while(iic_read_ack());
    iic_stop();
}
unsigned char get_reg_6107(unsigned char reg)
{
    unsigned char i;
    iic_start();
    iic_send_byte(ADDR_pca6107);
    while(iic_read_ack());
    iic_send_byte(reg);
    while(iic_read_ack());
    iic_start();
    iic_send_byte(ADDR_pca6107+1);
    while(iic_read_ack());
    i=iic_read_byte();
    iic_stop();
    return i;
}

armok 发表于 2010-1-24 17:09:47

armok 发表于 2010-1-24 17:10:18

cooleaf 发表于 2010-1-25 14:00:46

了贴,很好的学习参考资料!!

longfeixue 发表于 2010-3-9 15:45:02

mark

feifue 发表于 2010-3-11 18:16:45

强贴。 顶啊!!

gumogumo 发表于 2010-3-13 21:47:35

8错

ljy0421 发表于 2010-3-16 18:56:23

不错 顶上来

archi9966 发表于 2010-3-17 09:05:19

强!!

woshiyean 发表于 2010-6-25 19:52:12

很好!!!

mige062 发表于 2010-6-25 20:10:43

很不错的资料。谢谢。

xiunix 发表于 2010-6-25 22:10:08

好东西辛苦了

kunpeng032 发表于 2010-6-25 22:22:30

楼主强悍,辛苦了~~~

80162535 发表于 2010-6-30 17:12:27

mark

lsea 发表于 2010-7-21 13:58:47

支持楼主

liuhongyu 发表于 2010-7-23 18:17:15

mark430

fengzhun 发表于 2010-7-26 14:47:40

谢谢lz
这几天在学430

ofdm_pa 发表于 2010-7-29 15:42:05

mark

02015678 发表于 2010-7-31 19:46:08

mark,感谢楼主分享的资料

th152210 发表于 2010-8-1 17:00:03

我们也要用430做电子设计大赛,不过感觉学的有点吃力啊,寄存器太多了,记不住呢,要是每次都需要看datasheet,那还不得慢死。lz的第几天做什么都是按时完成的吗?

topcare 发表于 2010-8-2 10:05:47

楼主辛苦了,谢谢分享!

heroyp 发表于 2010-8-4 10:53:34

lz帅呆了··

c4fantasy 发表于 2010-8-4 16:42:24

mark 谢谢楼主

ffengeng 发表于 2010-8-6 11:12:40

mark   谢楼主!

lostmj 发表于 2010-8-12 12:25:08

mark!!!

lostmj 发表于 2010-9-2 01:13:16

mark

290168514 发表于 2010-9-5 15:13:09

lz好强大呀

yywin 发表于 2010-9-25 21:22:52

mark

winrain 发表于 2010-10-11 22:26:03

楼主强大了~~
MARK一下

ednchina 发表于 2010-10-12 15:53:00

很全面,向你学习。

samons 发表于 2011-1-31 17:00:52

标记下,阿弥陀佛!

ljmdzyx 发表于 2011-2-1 23:35:21

MARK

cumtgao 发表于 2011-2-22 14:15:40

hao顶

zhanglu1990 发表于 2011-2-25 11:04:56

记号

wuyi 发表于 2011-3-23 15:45:05

校友啊

hck2llj 发表于 2011-4-24 14:06:56

mark

coolfzl2008 发表于 2011-4-26 13:53:57

记号我来过

syauxwm 发表于 2011-4-26 16:51:44

MARK

zhangyunjnj 发表于 2011-5-5 15:17:37

mark

sanbanzui2008 发表于 2011-5-12 12:31:22

hao

relotus 发表于 2011-5-12 19:03:30

mark

tyqhaha 发表于 2011-5-12 19:07:55

楼主这进度实在了得

multidecoder 发表于 2011-5-13 07:57:38

MARK下,楼主精神了得

newhand1991 发表于 2011-6-20 22:16:38

马瑞卡!!

jssz_hf 发表于 2011-6-21 09:30:45

mark

wangshuzheng 发表于 2011-6-21 17:02:18

记下,好!

liguanglei 发表于 2011-7-2 00:05:23

MARK

mdj-fish 发表于 2011-7-2 12:21:31

MARK

suiyuan90 发表于 2011-7-2 16:11:09

支持楼主,谢谢分享。

yishiliuyan 发表于 2011-7-11 22:23:15

cool

bzhou830 发表于 2011-7-17 11:20:30

马瑞卡

iceboyser 发表于 2011-7-23 05:14:55

好的,学习了,谢谢

zhechong 发表于 2011-8-1 22:43:59

mark!

keetle 发表于 2011-8-7 15:35:09

LZ辛苦了

xiaoliusheng 发表于 2011-8-15 23:14:42

对于新手来说这确实是个好办法

yilingtian 发表于 2011-8-19 00:37:09

我也正在入门学习430单片机,你写的值得我学习

enric_lee 发表于 2011-12-28 20:44:50

mark

wang_2008 发表于 2011-12-29 11:11:02

MARK

zfz23569552 发表于 2011-12-29 13:15:33

MARK

liuchanghe 发表于 2012-1-7 09:15:28

标记一下!

huang91 发表于 2012-2-1 22:13:51

楼主很用心,谢谢。

elitenigel 发表于 2012-3-9 14:22:15

楼主很用心,谢谢。

137703056 发表于 2012-3-9 14:56:03

很好啊!标记学习!

yikuang 发表于 2012-3-31 11:34:57

学习啦!谢谢楼主!
页: [1]
查看完整版本: 协会的430开发板资料,一点点搜集,一点点积累