协会的430开发板资料,一点点搜集,一点点积累
这个430板子是杨松师兄给我用的,今年暑假我深入地研究了一番,感触颇多,一些芯片资料是下载的,程序是一点点读datasheet摸索出来的,有些费了好大劲,但总算成功了。把我的探索和经历在此分享一下,希望对后人有所帮助。这个是电路原理图。
点击此处下载 ourdev_512781.pdf(文件大小:2.09M) (原文件名:12x2-149.pdf)
学习430,有一个很好的条件就是可以申请免费芯片,可以自己画板,我暑假就画了一个1611的最小系统板,开出来自己用,爽O(∩_∩)O~ 相关的芯片资料,也可以自己下载,不过放着这里比较方便大家查看
点击此处下载 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放在程序前面的原因。
英语不好,不是借口。
相反,正好借此机会可以练练自己的阅读能力,很可能对你考六级有帮助呢! 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,你就在代码区添加自己的代码就行了。
选择单片机型号
选择仿真器
编译
仿真
就这几步,好好练习 第二天:点亮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;
} 第三天:按键
键盘我用过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;
} 第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;
} 串口当然是必不可少的!尤其在做上位机控制系统的时候。
在调试程序的时候,也可以用串口。
但最好用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();
} 第五天: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;
} 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,直到找到问题的关键所在。
这是我假期总结出来的经验,希望对大家有用。
一定要用一个变量存储最近状态,这样在变量窗口可以清晰看到出现哪些问题。 和上面一起的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模块数据等等都是用结构体实现的。
除了结构体,还有位域,还有联合体,都需要认真学学。 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;
} 了贴,很好的学习参考资料!! mark 强贴。 顶啊!! 8错 不错 顶上来 强!! 很好!!! 很不错的资料。谢谢。 好东西辛苦了 楼主强悍,辛苦了~~~ mark 支持楼主 mark430 谢谢lz
这几天在学430 mark mark,感谢楼主分享的资料 我们也要用430做电子设计大赛,不过感觉学的有点吃力啊,寄存器太多了,记不住呢,要是每次都需要看datasheet,那还不得慢死。lz的第几天做什么都是按时完成的吗? 楼主辛苦了,谢谢分享! lz帅呆了·· mark 谢谢楼主 mark 谢楼主! mark!!! mark lz好强大呀 mark 楼主强大了~~
MARK一下 很全面,向你学习。 标记下,阿弥陀佛! MARK hao顶 记号 校友啊 mark 记号我来过 MARK mark hao mark 楼主这进度实在了得 MARK下,楼主精神了得 马瑞卡!! mark 记下,好! MARK MARK 支持楼主,谢谢分享。 cool 马瑞卡 好的,学习了,谢谢 mark! LZ辛苦了 对于新手来说这确实是个好办法 我也正在入门学习430单片机,你写的值得我学习 mark MARK MARK 标记一下! 楼主很用心,谢谢。 楼主很用心,谢谢。 很好啊!标记学习! 学习啦!谢谢楼主!
页:
[1]