作者Magicx (270度的鸟顾之相)
看板Electronics
标题Re: [讨论] 8051之c语言问题
时间Fri Feb 9 07:30:54 2007
※ 引述《CuckooBoy (阿书)》之铭言:
: 下面的程式,动作正常,只是觉得if太多,不知道有办法缩短吗?(不影响动作)
: 另外,想知道.......这样的语法有没有什麽暇吃或不妥的地方法?
: 还有还有......就是.....
: for(i=0;i<3;i++)
: x=abc[i];
: 请问i++是一次做完?还是进入for只做一次,0~3要进入三次
i=0~2进去执行..离开FOR回圈时i=3
: 会问这问题原因是.....下面程式i我用计数代48*i-1
: 我想用for取代.....但是觉得那个i++如果组合语言角度想的话
: 应该是........"进入for时才作一次i++"
: 所以用for改写,好像会让程式动作错误
为何用for? 你不是已经用while来让i做counter的吗?
:
这里我觉得你是要抓47,95,143.....对吗?
也就是你每次传48个bit最後一个bit给1当end-bit
那嚜你为何不改写成..
i=0;
if( (i%48) == 47 )
LE=1;
else if(i==766)
LE=1;
else
{
LE=0;
//这里可以并入你传data-bit的程式
//
}
ps.多一个ELSE IF 是因为我觉得IF里面多一个||
不好解读(看了不顺眼..太长了)而且complier翻出来的组语好像比较长?
=================================================================
: #define SDI P1_0
: #define DCLK P1_1
: #define LE P1_2
: #define GCLK P1_3
: #include "AT89C51.h"
: unsigned int code SDI_LUT [] = {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
: 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,
: 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1};
: main()
: {
: unsigned int SDI_cnt,LE_cnt = 0;
: unsigned int i = 1;
: while(1)
: {
: DCLK = 0;
: SDI = SDI_LUT[SDI_cnt];
: DCLK = 1;
: if (LE_cnt == 48*i-1||LE_cnt == 766)
: {
: LE = 1;
: }
: else
: {
: LE = 0;
: }
: if (SDI_cnt < 47)
: {
: SDI_cnt++;
: }
: else
: {
: SDI_cnt = 0;
: if (i < 16)
: {
: i++;
: }
: else
: {
: i = 1;
: }
: }
: if (LE_cnt < 767)
: {
: LE_cnt++;
: }
: else
: {
: LE_cnt = 0;
: }
: }
: }
ps.你要做的事应该是类似uart传送资料的动作吧...
那麽你应该用interrupt才对..你这样出来的波型..
每个bit的脉波宽度可能都不一样喔^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.142.174.135