打印
[AVR单片机]

使用WinAVR-20070525后,为什么好好的液晶初始化程序变成了这

[复制链接]
1661|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
axia2008|  楼主 | 2007-6-1 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我的一段液晶初始化程序被编译成这样了,已经不符合初始化操作的流程了。

具体清单如下:
编译器版本:WinAVR-20070525
单片机型号:AT90CAN128。
优化等级采用-01,02,03,0s都一样。

=================================
c源程序
=================================
#include <avr/io.h>

#define LCD_DATA_PORT 0x6820
#define LCD_COM_PORT  0x6821

void InitLcd()
{
    uint8_t *  pt1;

    pt1  = (uint8_t *)LCD_DATA_PORT;
    *pt1 = 0x00;
    *pt1 = 0x00;
    pt1  = (uint8_t *)LCD_COM_PORT;
    *pt1 = 0x42;
    pt1  = (uint8_t *)LCD_DATA_PORT;
    *pt1 = 0x1E;
    *pt1 = 0x00;
    pt1  = (uint8_t *)LCD_COM_PORT;
    *pt1 = 0x43;
}

int main( void )
{
    InitLcd();
    while (1);
}

=====================================
经过编译后得到的InitLcd子程序汇编代码
=====================================
InitLcd():
0000006B:   92106820    STS     0x6820,R1
0000006D:   E483        LDI     R24,0x43
0000006E:   93806821    STS     0x6821,R24
00000070:   9508        RET

相关帖子

沙发
zhangqibo| | 2007-6-1 23:05 | 只看该作者

怪谁呢?!

端口是一个易变值,为什么不加volatile修饰词?

另外你这种用法也太别扭了吧,每次用还要加个强制转换(何把强制转换也加到宏定义中)。
通常的做法是这样:
如:
#define CMD_READ  (*(volatile unsigned char *)0x2008)
其中的volatile是绝对不可以省的!!

使用特权

评论回复
板凳
zsmbj| | 2007-6-2 09:32 | 只看该作者

呵呵!

使用特权

评论回复
地板
axia2008|  楼主 | 2007-6-2 15:34 | 只看该作者

谢谢

使用特权

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

本版积分规则

253

主题

336

帖子

0

粉丝