发新帖我要提问
12
返回列表
打印

求助PIC-I/O口问题

[复制链接]
楼主: 21ID
手机看帖
扫描二维码
随时随地手机跟帖
21
程序按下面两种方法都试一下:
1.
main()
{  
    init();//初始化
    LED1 = 1;  //RA5
    LED2 = 1;  //RA4
     while(1){asm("clrwdt");}
}
2.
main()
{  
while(1)
{
   PORTA = 0b00110000;
     asm("clrwdt");
}
}
如果上面两种方法都可以,证明就是读修改写现象,不过proteus是不是能这么NB的反映现实,就不知道了!
最简单直观的方法就是加大电阻!不要总抱着实际可以,仿真不行说问题,要去试!可以跟可行区别是很大的!

使用特权

评论回复
22
21ID|  楼主 | 2010-8-5 12:16 | 只看该作者
程序按下面两种方法都试一下:
1.
main()
{  
    init();//初始化
    LED1 = 1;  //RA5
    LED2 = 1;  //RA4
     while(1){asm("clrwdt");}
}
2.
main()
{  
while(1)
{
   PORTA = 0b00110000;
     asm("clrwdt ...
xymxym 发表于 2010-8-5 09:33


程序1:
#include
<pic.h>

#include <pic16630.h>
__CONFIG (CPROTECT & PWRTEN & BOREN & WDTEN &
MCLRDIS & INTOSCIO);

//__IDLOC (2010);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
#define LED1 RC5
#define LED2 RC4
#define LED3 RA5
#define LED4 RA4
//////////////////////////////////////
void Init_Sys()
{

ANSEL = 0x00;


IOCA
= 0x00;


TRISA = 0x08;


TRISC = 0x00;


PORTA = 0x00;


PORTC = 0x00;


LED1 = 0;


LED2 = 0;


LED3 = 0;


LED4 = 0;

}
///////////////////////////////////////////
main()
{


Init_Sys();//
初始化


LED1 = 1;
//RC5


LED2 = 1;
//RC4


LED3 = 1;
//RA5


LED4 = 1;
//RA4


while(1){asm("clrwdt");}

}
结果1:如图1

程序2:
#include
<pic.h>

#include <pic16630.h>
__CONFIG (CPROTECT & PWRTEN & BOREN & WDTEN &
MCLRDIS & INTOSCIO);

//__IDLOC (2010);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
#define LED1 RC5
#define LED2 RC4
#define LED3 RA5
#define LED4 RA4
//////////////////////////////////////
void Init_Sys()
{

ANSEL = 0x00;


IOCA
= 0x00;


TRISA = 0x08;


TRISC = 0x00;


PORTA = 0x00;


PORTC = 0x00;


LED1 = 0;


LED2 = 0;


LED3 = 0;


LED4 = 0;

}
///////////////////////////////////////////
main()
{


Init_Sys();//
初始化


LED1 = 1;
//RC5


LED2 = 1;
//RC4


LED4 = 1;
//RA4


LED3 = 1;
//RA5


while(1){asm("clrwdt");}

}
结果2:如图2

程序3:
#include <pic.h>
#include <pic16630.h>
__CONFIG (CPROTECT & PWRTEN & BOREN & WDTEN &  MCLRDIS & INTOSCIO);
//__IDLOC (2010);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
#define LED1 RC5
#define LED2 RC4
#define LED3 RA5
#define LED4 RA4
//////////////////////////////////////
void Init_Sys()
{
ANSEL = 0x00;
IOCA  = 0x00;
TRISA = 0x08;
TRISC = 0x00;
PORTA = 0x00;
PORTC = 0x00;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
}
///////////////////////////////////////////
main()
{  
    Init_Sys();//初始化
    LED1 = 1;  //RC5
    LED2 = 1;  //RC4
PORTA = 0b00110000;
     while(1){asm("clrwdt");}
}
结果3:如图3

1.jpg (76.15 KB )

1.jpg

2.jpg (73.57 KB )

2.jpg

3.jpg (71.35 KB )

3.jpg

使用特权

评论回复
23
21ID|  楼主 | 2010-8-5 12:33 | 只看该作者
本帖最后由 21ID 于 2010-8-5 12:36 编辑

实际电路里烧进程序1时,会得到结果3。不明白!

加大电阻,用1K的结果和在proteus里面和实际电路中用100的结果都一样!

使用特权

评论回复
24
21ID|  楼主 | 2010-8-5 12:38 | 只看该作者
个人认为:
在proteus里面是读-修改-写的问题。但是出错在哪里不明白。
在实际电路中的现象和自己理解的一样。

使用特权

评论回复
25
skygrow| | 2010-8-5 13:12 | 只看该作者
采用影子寄存器法,结果怎样呢?
........
struct
{
   unsigned :4;
   unsigned LED1:1;
   unsigned LED2:1;
  unsigned dummy:2
}PORTA_temp;
.......
main()
{
....
LED1=1;
LED2=1;
PORTA=PORTA_temp;
....
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则