打印

这个程序呢?

[复制链接]
2225|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ty118|  楼主 | 2008-1-3 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序画圈的部分是这样子定义的:
#ifdef_C51_
       #define SWAP(x)((((x)&0xff)<<8)|(((x)>>8)&0xff))
#else
       #define SWAP(X)(X)
       #define code
       #define idata
SWAP是调换X的高位和低位的?
这个是为什么呀.
还有就是上面的为什么要这样定义呢?请大侠指点.
谢谢拉

相关帖子

沙发
ty118|  楼主 | 2008-1-3 21:05 | 只看该作者

在补充一个问题?

unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len,unsigned char * buf)
{
    unsigned char i, j;
    if(bEPPflags.bits.in_isr == 0)
        DISABLE;
    outportb(D12_COMMAND, endp);
    if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) 
    {
        if(bEPPflags.bits.in_isr == 0)
            ENABLE;
        return 0;
    }
    outportb(D12_COMMAND, 0xF0);
    j = inportb(D12_DATA);
    j = inportb(D12_DATA);
    if(j > len)
        j = len;
    for(i=0; i<j; i++)
        *(buf+i) = inportb(D12_DATA);
    outportb(D12_COMMAND, 0xF2);
    if(bEPPflags.bits.in_isr == 0)
        ENABLE;
    return j;
}

这个程序中的if((inportb(D12_DATA) & D12_FULLEMPTY) == 0)
说是判断缓冲区是否为空,如果为空返回,
它的定义是这样子的
#define D12_FULLEMPTY            0x01
这个0x01是随便的一个数呢?还是PDIUSBD12内部必须的,
outportb(D12_COMMAND, 0xF0);
    j = inportb(D12_DATA);
    j = inportb(D12_DATA);
这个为什么要对j进行两次的赋值呢?
谢谢大侠的回答!

使用特权

评论回复
板凳
ty118|  楼主 | 2008-1-5 09:05 | 只看该作者

谢谢各位拉!

谢谢大家帮忙解释一下上面的程序拉!

使用特权

评论回复
地板
wlsui| | 2008-1-5 13:40 | 只看该作者

re:

第一个swap应该是避免大小端的问题,说白了,就是高8位和代8位的存储顺序问题

第二个#define D12_FULLEMPTY            0x01,0x01是最低位的掩码,表示只取最低位,其余屏蔽,当然也就不是随便取的了

j = inportb(D12_DATA);
j = inportb(D12_DATA);
那是读了两次D12的端口数据,相当于读了高8位和低8位,但最后只取低8位(如果高8位在前低8位在后的话,具体是哪个在前不太清楚,因为没玩过D12)

使用特权

评论回复
5
ty118|  楼主 | 2008-1-5 14:11 | 只看该作者

谢wlsui 拉!

谢wlsui大侠 拉!

使用特权

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

本版积分规则

69

主题

209

帖子

0

粉丝