是 MLF 封装 M88 ,编译环境 icc713pro
#define DATA_IN ((PINC&(0x0f))<<4)|(PIND &(0x0f))
C口 和 D口 低4位都为输入 并上拉, 内部 1Mhz
程序 调用 value =DATA_IN 时C口读出结果对,D口全为1为;
改为 #define DATA_IN PIND &(0x0f)) | ((PINC&(0x0f))<<4)
D 口对,C 全1; 注意是先读的对!
然后改为
value =PIND &(0x0f)) ; for(i=0;i<10;i++); value=value + ((PINC&(0x0f))<<4);
就全对了, 难得 不能连续读吗??
汇编 (不太懂,好像没错) ; //for(i=0;i<10;i++); ; value=DATA_IN1; in R24,0x6 andi R24,15 andi R24,#0x0F swap R24 mov R10,R24 .dbline 76 ; //for(i=0;i<10;i++); ; value=value+DATA_IN2; in R24,0x9 andi R24,15 add R10,R24 .dbline 77
value = ((PINC&(0x0f))<<4)|(PIND &(0x0f)); 这句的汇编码贴一下
;value = ((PINC&(0x0f))<<4)|(PIND &(0x0f)); in R24,0x9 andi R24,15 in R25,0x6 andi R25,15 andi R25,#0x0F swap R25 mov R10,R25 or R10,R24
前面一个 输入口没问题,后面一个 读取为全1 。有 条件的 朋友测试测试 。
这条命令的前一条是 把两个口设置为输入并上拉。速度为 内部 8M 8分频(1MHZ)
然后改为
value =PIND &(0x0f)) ; for(i=0;i<10;i++); value=value + ((PINC&(0x0f))<<4);
就全对了,加NOP() 应该是可以的。
问题在:
value = ((PINC&(0x0f))<<4)|(PIND &(0x0f));
先读的 端口数据正确,而 后读 的不行了?
在连续几个时钟周期内不能连续读 端口输入吗?
上面提供的 汇编代码 说明语句还是正确的。
|