bootgames 发表于 2012-9-25 16:09:27

C语言编写请教

本帖最后由 bootgames 于 2012-9-25 16:54 编辑

我定义了一个结构体
typedef struct {
                   charled;
                     }A;

A    B=
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,//初始化1
};

有14个IO口一一对应控制14个led的亮灭。这14个IO口分布在PORTA、PORTB、 PORTC里。

for(i=0;i<15;i++)
{
B.led=0 或 1;//0-亮   1-灭
}

问题是如何编写14个IO口与14个LED的对应关系?求解
如果是8个LED,通过一个PORTA表示 我可以写为PORTA=B.led ,可是现在14个IO口比较杂乱 该如何表示这关系?

zjr0411 发表于 2012-9-25 16:33:53

楼主用位段应该更合适一些

ps:楼主太小气了{:lol:}

bootgames 发表于 2012-9-25 16:45:49

zjr0411 发表于 2012-9-25 16:33 static/image/common/back.gif
楼主用位段应该更合适一些

ps:楼主太小气了

用位段如何建立IO 与被驱动led的关系?

jiaowoxiaolu 发表于 2012-9-25 16:46:07

用不着这样吧,用一个16位的数,每一位表示一个led
然后
switch(这个数)
{
case 0x0001: led1=1;break;
.
.
.
.
default break;

}

twp99 发表于 2012-9-25 16:57:23

这个东西,我个人如果说是要对14个IO都有独立的操作,那么我的做法是宏定义 比如说 LED0_OpenPORTA |= (1<<X);   LED0_Close PORTA &= (1<<X); 这个X是你IO口在PORTA中的位。
有了这些定义,你想对哪个IO口操作就操作哪个

今天才来阿莫,希望我的回答对你有帮助

zhanan 发表于 2012-9-25 17:24:55

本帖最后由 zhanan 于 2012-9-25 17:33 编辑

杂乱无规律,也只有写14个判断了,一目了然,组合变换反而容易错。
if( 某位 )   端口=1; else 端口=0;

也可以这样,但编译出来可能比上面的费程序空间:端口=某位;

14句输出语句封装成一个函数,就是一个输出命令。

bootgames 发表于 2012-9-25 17:40:18

谢谢
但理解错了
我不是单纯的IO口控制
这里面有个顺序
1.通过条件1判断 得出LED是0还是1.
2.用尽量少的语句吧14个LED的状态赋给IO口。
难点在2上
果是8个LED,都连接PORTA 我可以写为PORTA=B.led , 这样一个语句就能使灯依次点起来
可是现在是14个IO口,PA占6个 PB占4个 PC占4个 比较杂乱
寻找最简洁有力的语句来传递这个对应关系
不是14个状态的简单罗列。

stmmcu 发表于 2012-9-25 17:47:57

1. 你定义在普通内存, 没法操作IO。
2. 即使你定义在IO上,没法用char,用bit。
3. 如果是51 几个IO地址不连续。

bootgames 发表于 2012-9-25 17:54:01

本帖最后由 bootgames 于 2012-9-25 17:55 编辑

#define B.Led   PORTA_Bit3
#define B.Led   PORTA_Bit5

这样写提示不对
怎么改?

zhanan 发表于 2012-9-25 17:57:38

第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。

tangguanglun 发表于 2012-9-25 17:58:54

你这个对某一个IO操作的写法怎么写的。

bootgames 发表于 2012-9-25 18:01:22

zhanan 发表于 2012-9-25 17:57 static/image/common/back.gif
第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。
...

可能是无解
我没想出办法来
似乎不能实现

bootgames 发表于 2012-9-25 18:03:05

tangguanglun 发表于 2012-9-25 17:58 static/image/common/back.gif
你这个对某一个IO操作的写法怎么写的。

只能用结结构体里的变量来定义IO口了

tangguanglun 发表于 2012-9-25 18:03:18

bootgames 发表于 2012-9-25 18:01 static/image/common/back.gif
可能是无解
我没想出办法来
似乎不能实现

你这个对某一个IO操作的写法怎么写的。

bootgames 发表于 2012-9-25 18:03:42

只能用结结构体里的变量来定义IO口了

怎么写

tangguanglun 发表于 2012-9-25 18:04:48

bootgames 发表于 2012-9-25 18:03 static/image/common/back.gif
只能用结结构体里的变量来定义IO口了

我说的是这个意思,比如51的定义的sbitled=P1^1;这种。就可以对P1口的PIN1操作。那你这款芯片对应的操作方式呢

zhanan 发表于 2012-9-25 18:12:23

钻牛角尖,这个操作已经到了端口位操作,C的基本类型是字节,部分扩展才到位。
变来变去的,也只是“看起来”是直接对应了,但编译出来不见得省。
十四个端口,也不算多。真想省的话,应该硬件、软件统筹考虑。

bootgames 发表于 2012-9-26 08:33:54

typedef struct {
                  charled;
                      }MOMN;

MOMN    KIOO=
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,//初始化1
};

有14个IO口一一对应控制14个led的亮灭。这14个IO口分布在PORTA(1/5/6/8)、PORTB(2/3/4/5/)、 PORTC(1/2/5/6/7/8/)里。

for(i=0;i<15;i++)
{
KIOO.led=0 或 1;//0-亮   1-灭
}

如何表述14个IO口与数组KIOO.led的关系?   一一对应输出。

tangxixiaowu99 发表于 2012-9-29 10:43:05

14个IO口,PA占6个 PB占4个 PC占4个
PORTA=B.led ;   PORTB=B.led;PARTC=B.led ;   

himm007 发表于 2012-9-29 14:14:47

本帖最后由 himm007 于 2012-9-29 17:24 编辑

typedef struct {
   GPIO_TypeDef*   g;
   uint16_t               io,
} GPOI_G_T;

//数组MAP存储14个IO口的GPIO组和Pin位

GPIO_G_T MAP = {
   {GPIOC, GPIO_Pin_8},
   {GPIOA, GPIO_Pin_2},
   {..., ...},
   ...
};

for (i = 0; i < 15; i++) {
   if (b.led == 1)
      GPIO_SetBits(MAP.g, MAP.io);
   else
      GPIO_ResetBits(MAP.g, MAP.io);
}

fjian 发表于 2012-9-29 14:30:45

楼上的方法不错{:lol:}

himm007 发表于 2012-9-29 17:24:10

typedef struct {
   GPIO_TypeDef*   g;
   uint16_t             io;
} GPOI_G_T;

//数组MAP存储14个IO口的GPIO组和Pin位
GPIO_G_T MAP = {
   {GPIOC, GPIO_Pin_8},
   {GPIOA, GPIO_Pin_2},
   {..., ...},
   ...
};

typedef void (*OP_FUN_T)( GPIO_TypeDef*, uint16_t);
OP_FUN_T op_fun={GPIO_ResetBits, GPIO_SetBits};

//这个写法更短些, 但难理解些.
//b.led 是第i个灯的状态, 为1则调用op_fun, 即GPIO_SetBits, 反则调用GPIO_ResetBits.
//MAP.g, MAP.io 为第i个灯对应的IO口.

for (i = 0; i < 15; i++)
   (op_fun.led])(MAP.g, MAP.io);
页: [1]
查看完整版本: C语言编写请教