这段时间刚玩PIC,用PIC16F877A和PIC16F876A,写了几个简单程序,都可以正常运行,
唯独用到16F676时,就出问题了,位操作不正常,
请教下高手们,16F676和16F877A编程上面有什么不一样的吗?
MCU配置寄存器是严格按数据手册上配置的,
在主函数里面操作一个位可以正常运行,
但再在后面连续操作其它位端口的时候,就不正常了
看代码:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
/*****************************************************************/
__CONFIG(0X1D1); //前面是两个下杠 00000111010001
//13、12-BG1-BG0,用于欠压检测和上电复位电压的带隙校准位
// 00=最低带隙电压,11=最高带隙电压
//11-9,未用=0
//8、CPD,数据代码保护全能位, 1=禁止数据存储器代码保护,0=使能数据存储代码保护
//7、CP,程序代码保护使能位, 1=禁止程序代码保护,0=使能程序代码保护
//6、BODEN,欠压检测BOD使能位, 1=使能,0=禁止
//5、MCLRE,RA3/MCLR引脚功能选择, 1=RA3为MCLR,0=RA3为数字IO,MCLR内部连接到VDD
//4、PWRTE,上电复位定时器PWRT使能位, 1=禁止PWRT,0=使能PWRT
//3、WDTE, 看门狗定时器WDT使能位, 1=使能WDT,0=禁止WDT
//2-0,FOSC2-0,振荡器选择位
//111=RC振荡器,
//111 = RC 振荡器: RA4/OSC2/CLKOUT 作为 CLKOUT 引脚 , RA5/OSC1/CLKIN 作为RC 输入引脚
//110 = RC振荡器: RA4/OSC2/CLKOUT 作为I/O 引脚,RA5/OSC1/CLKIN 作为 RC输入引脚。
//101 = INTOSC振荡器: RA4/OSC2/CLKOUT 作为 CLKOUT引脚 ,RA5/OSC1/CLKIN作为I/O引脚。
//100 = INTOSC振荡器: RA4/OSC2/CLKOUT 作为 I/O引脚, RA5/OSC1/CLKIN 作为 I/O引脚
//011 = EC:RA4/OSC2/CLKOUT 作为I/O 引脚, RA5/OSC1/CLKIN作为 CLKIN引脚
//010 = HS 振荡器: 高速晶体 /谐振器接到RA4/OSC2/CLKOUT 和 RA5/OSC1/CLKIN
//001 = XT 振荡器: 晶振/谐振器接到 RA4/OSC2/CLKOUT 和 RA5/OSC1/CLKIN
//000 = LP 振荡器:低功耗晶振接到 RA4/OSC2/CLKOUT 和 RA5/OSC1/CLKIN
/*****************************************************************/
#define D1 RC0
#define D2 RC1
#define D3 RC2
#define D4 RC3
/*****************************************************************/
void delayms(uint z)
{
uint y;
while(z--)
for(y=100;y>0;y--); //晶振频率为4M时,Y=100,延时1MS
}
/*****************************************************************/
void mcu_init()
{
TRISA=0X02; //设置RA的IO方向,高为输入,低为输出
TRISC=0X00;
// OPTICN_REG= //100
// IOCA=0X02; //使能RA3引脚为外部中断引脚
// WPUA=0X02; //A端口弱上拉使能,输入状态时用
// GIE=1; //开总中断
}
/*****************************************************************/
void main()
{
uchar i;
mcu_init();
RC0=1;
RC1=1;
RC2=1;
do
{
/* D1=1;
delayms(500);
D2=1;
delayms(500);
D3=1;
delayms(500);
D4=1;
delayms(500);
// PORTC=0;
*/ // delayms(500);
}
while(1);
}
/*****************************************************************/
void interrupt RA()
{
RAIF=0; //中断标志位清零
D1=D2=D3=D4=1;
delayms(1000);
D1=D2=D3=D4=0;
}
|