打印

12LF1823端口LED闪烁位取反不行877A可以为啥?

[复制链接]
2372|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robin_chen559|  楼主 | 2013-12-29 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单个端口使LED闪烁,LED_G = ~LED_G 877A可以,1823却不行,为啥?
/***********************************************************
项目:练习PIC内部时钟使用
功能:练习PIC内部时钟使用
设计:robin_chen559
日期:2013.11.21
备注:
***********************************************************/
#include<pic12lf1822.h>

#define LED_G RA0

//子程序声明
void Delay_MS(unsigned int MS);        //延时子程序
void LED_Flash(void);                  //LED闪烁子程序

//子程序

void Delay_MS(unsigned int MS)         //延时子程序
{
  unsigned int i,j;
   for(i=0;i<MS;i++)       
      for(j=0;j<90;j++);         
}

void LED_Flash(void)
{
  LED_G = 0;                       //LED_G闪烁
  Delay_MS(200);
  LED_G = 1;                       //LED_G闪烁
  Delay_MS(200);

/************
  LED_G = ~LED_G;                       //LED_G闪烁
  Delay_MS(200);
************/

}

void main(void)
{
OSCCON = 0b01101010;                   //内部时钟4M
TRISA0 = 0x00;                         //A0口输出
LED_G = 0;
while(1)
{
  LED_Flash();
}
}

877A的好使,没这个问题。
/******************************************************
1.项目:877A LED闪烁
2.功能:877A使LED闪烁
3.设计:robin_chen559
4.日期:2013.12.28

******************************************************/
#include<pic.h>

#define uchar unsigned char
#define uint unsigned int

#define LED_R RB0           //定义LED端口

//子程序声明
void Delay_MS(uint MS);
void LED_Flash(void);

//子程序

void Delay_MS(uint MS)     //延时子程序
{
   uint i,j;
   for(i=0;i<MS;i++)       
      for(j=0;j<22;j++);         
}

void LED_Flash(void)
{
   LED_R = ~LED_R;
   Delay_MS(500);
}

void main(void)
{
  TRISB = 0x00;          //设置RB口为输出
  LED_R = 0;
  while(1)
  {
   LED_Flash();
  }
}

1.1823源文件包,mplab8.70 proteus7.10
http://pan.baidu.com/s/1o66UF5w
2.877A源文件包
http://pan.baidu.com/s/1i3HUpgx
沙发
robin_chen559|  楼主 | 2013-12-29 23:17 | 只看该作者
同样的端口定义,同样的位取反,难道换个单片机就这个问题么,什么也都是pic一家的单片机呀~~~~

使用特权

评论回复
板凳
yklstudent| | 2013-12-30 08:45 | 只看该作者
因为你马虎 不看资料就照搬照写/?????? 出问题就对的 不出问题就不对了

使用特权

评论回复
地板
yewuyi| | 2013-12-30 09:07 | 只看该作者
唉,无语,这种问题根本没有回答的激情。

基础知识还是自己翻翻书吧。

使用特权

评论回复
5
yewuyi| | 2013-12-30 09:11 | 只看该作者
唉,无语,这种问题根本没有回答的激情。

基础知识还是自己翻翻书吧。

使用特权

评论回复
6
robin_chen559|  楼主 | 2013-12-30 18:17 | 只看该作者
yklstudent 发表于 2013-12-30 08:45
因为你马虎 不看资料就照搬照写/?????? 出问题就对的 不出问题就不对了

或许是规格书没看明白吧~~~

使用特权

评论回复
7
robin_chen559|  楼主 | 2013-12-30 18:19 | 只看该作者
yewuyi 发表于 2013-12-30 09:11
唉,无语,这种问题根本没有回答的激情。

基础知识还是自己翻翻书吧。

规格书都翻了好几遍了,昨天去上海书城看pic资料。开始学得STC,换过来可能有些不一样的地方没注意到吧~~~

使用特权

评论回复
8
robin_chen559|  楼主 | 2013-12-31 16:14 | 只看该作者
(1)应该是内部编译的问题,对877A来说  #define LED_R RB0 //定义LED端口,LED_R系统认为是位变量,但是对12LF1822来说,#define LED_G RA0之后,LED_G不视为位变量
(2)volatile bit RA0                 @ ((unsigned)&PORTA*8)+0; 包含的是pic.h,这个就费解了
(3)定义个位变量bit LED_G_Flag = 0;LED_G_Flag = ~LED_G_Flag;  LED_G = LED_G_Flag;  //LED_G闪烁 至少能跑,比之前在网上找的两个if嵌套方便些。
/***********************************************************
项目:练习PIC内部时钟使用
功能:练习PIC内部时钟使用
设计:robin_chen559
日期:2013.11.21
备注:
***********************************************************/
#include<pic12lf1822.h>

#define LED_G RA0

bit LED_G_Flag = 0;

//子程序声明
void Delay_MS(unsigned int MS);        //延时子程序
void LED_Flash(void);                  //LED闪烁子程序

//子程序

void Delay_MS(unsigned int MS)         //延时子程序
{
  unsigned int i,j;
   for(i=0;i<MS;i++)       
      for(j=0;j<90;j++);         
}

void LED_Flash(void)
{
/*************  
LED_G = 0;                       //LED_G闪烁
  Delay_MS(200);
  LED_G = 1;                       //LED_G闪烁
  Delay_MS(200);

***********/

   LED_G_Flag = ~LED_G_Flag;
   LED_G = LED_G_Flag;                //LED_G闪烁
   Delay_MS(300);


}

void main(void)
{
OSCCON = 0b01101010;                   //内部时钟4M
TRISA = 0x00;                         //A0口输出
//LED_G = 0;
while(1)
{
  LED_Flash();
}
}




   

使用特权

评论回复
9
yklstudent| | 2014-1-1 07:52 | 只看该作者
引脚改为数字口 老毛病了都

使用特权

评论回复
10
robin_chen559|  楼主 | 2014-1-3 19:40 | 只看该作者
yklstudent 发表于 2014-1-1 07:52
引脚改为数字口 老毛病了都

恩,还真是,是规格书看明白,还以为要做模拟输入的时候才需设置ANSEL,十分感谢。

使用特权

评论回复
11
robin_chen559|  楼主 | 2014-1-3 19:42 | 只看该作者
ANSA0 = 0;   //设置为数字i/o口,1为模拟输入,不设置不能直接位操作。
/***********************************************************
项目:练习PIC内部时钟使用
功能:练习PIC内部时钟使用
设计:robin_chen559
日期:2013.11.21-2014.01.03
备注:
***********************************************************/
#include<pic12lf1822.h>

#define LED_G RA0

//子程序声明
void Delay_MS(unsigned int MS);        //延时子程序
void LED_Flash(void);                  //LED闪烁子程序

//子程序

void Delay_MS(unsigned int MS)         //延时子程序
{
  unsigned int i,j;
   for(i=0;i<MS;i++)       
      for(j=0;j<90;j++);         
}

void LED_Flash(void)
{

   LED_G = ~LED_G;                //LED_G闪烁
   Delay_MS(300);


}

void main(void)
{
OSCCON = 0b01101010;                   //内部时钟4M
TRISA = 0x00;                          //A0口输出
ANSA0 = 0;                             //设置为数字i/o口,1为模拟输入

while(1)
{
  LED_Flash();
}
}




使用特权

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

本版积分规则

22

主题

302

帖子

10

粉丝