打印

30f6014A PORTD端口的高8位怎样操作最简单?

[复制链接]
2692|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
骆驼|  楼主 | 2009-10-16 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30f6014A和一个外围芯片连接,8位的并口总线,使用的PORTD的高8位,请问在C30里怎样赋值最方便?就像PORTDH = 0x00之类的。是不是要修改一下H文件才行?还望使用过的治教一下。
沙发
cheungman| | 2009-10-16 18:37 | 只看该作者
改gld和h文件有难度,  直接用异或操作其实也很方便.

使用特权

评论回复
板凳
e掾木| | 2009-10-19 08:15 | 只看该作者
*( ( volatile unsigned char * )&( PORTD+1 ) ) = yours_data;

使用特权

评论回复
地板
骆驼|  楼主 | 2009-10-22 17:20 | 只看该作者
多谢,我试一下,之前打算用union变量修改响应字节后赋值端口。

使用特权

评论回复
5
cheungman| | 2009-10-29 16:04 | 只看该作者
*( ( volatile unsigned char * )&( PORTD+1 ) ) = yours_data;
e掾木 发表于 2009-10-19 08:15


1.有错, 首先&不能对表达式( PORTD+1 ) 取内存地址
2.手头正好有dsPIC33FJ256MC710, 测试一下, 先看下边反汇编

58:                 *( ( volatile unsigned char * )(&LATA    ) ) = 0x55;
01ACE  202C41     mov.w #0x2c4,0x0002
01AD0  B3C550     mov.b #0x55,0x0000
01AD2  784880     mov.b 0x0000,[0x0002]
59:                 *( ( volatile unsigned char * )(&LATA + 1) ) = 0xaa;
01AD4  202C60     mov.w #0x2c6,0x0000
01AD6  780080     mov.w 0x0000,0x0002
01AD8  B3CAA0     mov.b #0xaa,0x0000
01ADA  784880     mov.b 0x0000,[0x0002]
60:                 *( ( volatile unsigned char * )(&LATA) + 1 ) = 0x88;
01ADC  202C40     mov.w #0x2c4,0x0000
01ADE  E80080     inc.w 0x0000,0x0002
01AE0  B3C880     mov.b #0x88,0x0000
01AE2  784880     mov.b 0x0000,[0x0002]

dsPIC33FJ256MC710是16位单片机, 对寄存器是按字访问的,0x2C4是LATA寄存器地址, 0x2C6是TRISB的寄存器地址

如果是59:的表达式,从反汇编来看是对寄存器地址0x2C6的TRISB写入0xaa
如果用60:的表达式,从反汇编来看是对寄存器地址0x2C5写入0x88,违背按字访问原则,故错

下边是测试结果:
Update  Address   Symbol Name    Hex   
            02C6   TRISB       0xFFAA
            02C4   LATA        0x8055

使用特权

评论回复
6
凡格| | 2009-10-29 19:47 | 只看该作者
我用的是30f6012,直接操作就好了啊

使用特权

评论回复
7
cheungman| | 2009-11-7 22:38 | 只看该作者
没下文...

使用特权

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

本版积分规则

13

主题

34

帖子

0

粉丝