请教基本的问题

[复制链接]
 楼主| hlhfootbal 发表于 2011-11-14 16:34 | 显示全部楼层 |阅读模式
#include <p24Fxxxx.h>
#include <stdio.h>
int main(void)
{
    unsigned short a = 0x83FF;
    unsigned char  i = 0;
    TRISB |= a; /*configure PORTB<13:10> as output*/  
   
    while(1)
    {
    PORTB = 0x4000;
    for(i=0;i<16;i++)
    {
     
     PORTB += 0x0400;
     PORTB |= 0xBFFF;
    }
    }   
}

以上是我编写的程序。编译通过。
用KIT2烧录程序。烧完后板子指示灯没有反应。
不知道有没有烧录成功,还是程序有问题?
第一次用PIC单片机,对开发工具还不是很熟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yewuyi 发表于 2011-11-14 20:37 | 显示全部楼层
俺不清楚你要干什么,但至少 PORTB += 0x0400;
     PORTB |= 0xBFFF;
好象不太有道理,PORTB是BYTE型,为何要和WORD型的0400相加?
wangz2011 发表于 2011-11-14 21:33 | 显示全部楼层
PORTB += 0x0400;
PORTB |= 0xBFFF;
不清楚你要做什么。
 楼主| hlhfootbal 发表于 2011-11-15 08:30 | 显示全部楼层
我用的是pic24fj64ga002.
我看资料上PORTB是16位的,所以应该是WORD型。

PORTB += 0x0400;
PORTB |= 0xBFFF;
以上第一句:在for循环里,循环16次,每次加一,让PORTB<13:10>输出0到16数据。
以上第二句:让PORTB BIT 14 输出低电平,去控制LED等。for循环外有一句  PORTB = 0x4000;
是让PORTB BIT 14 输出高电平。
xaq79 发表于 2011-11-15 09:18 | 显示全部楼层
把PORTB改为 LATB 试试看

16位的输出一般对LATX操作
asspeed 发表于 2011-11-15 10:53 | 显示全部楼层
unsigned short a = 0x83FF; unsigned char i = 0;
TRISB |= a; /*configure PORTB<13:10> as output*/

a=0x83FF
TRISB=0xffff

TRISB |=a;
结果是多少?
xymxym 发表于 2011-11-15 10:58 | 显示全部楼层
硬件先确认有没有问题,电源有木有,复位O不O,振荡起不起,配置位正不正。
 楼主| hlhfootbal 发表于 2011-11-15 14:26 | 显示全部楼层
多谢各位帮忙。我的逻辑写错了。改了下程序,指示灯有反应了。
但是PORB<13:10>口没有测到相应的波形,现状是在PORB 10口和11口测到高电平,在12口和13口测到低电平。此程序的目的是让PORB<13:10>依次输出0000-1111的波形。
是因为没有加延时,看不出来,还是程序没写对?
延时函数怎么写?
多谢!
#include <p24Fxxxx.h>
#include <stdio.h>

int main(void)
{
    unsigned short a = 0x0000;
    unsigned char  i = 0;
    TRISB = a; /*configure PORTB<15:0> as output*/  
   
    while(1)
    {
    PORTB = 0xC000;
    for(i=0;i<16;i++)
    {
     
     PORTB += 0x0400;
     PORTB = PORTB && 0xBFFF;
     /*delay(10);*/
    }
    }   
}
yewuyi 发表于 2011-11-15 15:17 | 显示全部楼层
PIC有16位宽度的IO吗?
 楼主| hlhfootbal 发表于 2011-11-15 15:22 | 显示全部楼层
我用的是pic24fj64ga002.
PORTB是16位的。你可以查下资料。
yewuyi 发表于 2011-11-15 16:49 | 显示全部楼层
我用的是pic24fj64ga002.
PORTB是16位的。你可以查下资料。
hlhfootbal 发表于 2011-11-15 15:22


没用过PIC24的16位机,不过别家16位机器虽然数据总线是16位的,但IO宽度一般还是8位的,呵呵,如果PIC24搞成16位宽度,那到真的是很爽很拉风。
 楼主| hlhfootbal 发表于 2011-11-15 18:10 | 显示全部楼层
有什么爽的,有什么拉风的
yadaovs 发表于 2011-11-16 00:05 | 显示全部楼层
最后 一条语句错了,按位与写成逻辑与了
xymxym 发表于 2011-11-16 08:24 | 显示全部楼层
mcc18有个库delays.h,有现成的延时函数,还是很精准的。这24的就不知道了。。。
 楼主| hlhfootbal 发表于 2011-11-16 17:07 | 显示全部楼层
13# yadaovs

你是说这句吗?PORTB = PORTB && 0xBFFF;
 楼主| hlhfootbal 发表于 2011-11-16 17:08 | 显示全部楼层
14# xymxym
24的好像没有这个库函数
我在程序里加#include <delays.h>编译有误
yadaovs 发表于 2011-11-16 21:53 | 显示全部楼层
15# hlhfootbal 是啊
 楼主| hlhfootbal 发表于 2011-11-16 21:55 | 显示全部楼层
我程序里对寄存器直接进行算术运算了。
后来改用变量,变量算术运算,再赋值给寄存器,就好了。
但还是没有延时函数啊。
 楼主| hlhfootbal 发表于 2011-11-16 22:13 | 显示全部楼层
17# yadaovs 谢谢赐教
 楼主| hlhfootbal 发表于 2011-11-17 09:21 | 显示全部楼层
延时函数自己做了一个。
在for循环里,循环16次,每次加一,让PORTB<13:10>输出0到16数据。
我这样处理是不是有问题啊。

#include <p24Fxxxx.h>
#include <stdio.h>

int main(void)
{
    unsigned short a = 0x0000;
    unsigned short b = 0x4000;
    unsigned char  i = 0;
    TRISB = a; /*configure PORTB<15:0> as output*/  
   
    void delay()
    {
     unsigned char t;
     while(--t)
      {;}
    }

    while(1)
    {
    PORTB = b;
     for(i=0;i<16;i++)
    {
     b += 0x0400;
     PORTB =b;
    }
    }   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

417

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

133

主题

417

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部