搜索
bottom↓
回复: 21

C语言编写请教

[复制链接]

出0入0汤圆

发表于 2012-9-25 16:09:27 | 显示全部楼层 |阅读模式
本帖最后由 bootgames 于 2012-9-25 16:54 编辑

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

A    B[14]=
{
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口比较杂乱 该如何表示这关系?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出200入0汤圆

发表于 2012-9-25 16:33:53 | 显示全部楼层
楼主用位段应该更合适一些

ps:楼主太小气了

出0入0汤圆

 楼主| 发表于 2012-9-25 16:45:49 | 显示全部楼层
zjr0411 发表于 2012-9-25 16:33
楼主用位段应该更合适一些

ps:楼主太小气了

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

出0入22汤圆

发表于 2012-9-25 16:46:07 | 显示全部楼层
用不着这样吧,用一个16位的数,每一位表示一个led
然后
switch(这个数)
{
  case 0x0001: led1=1;break;
.
.
  .
.
default break;

}

出0入0汤圆

发表于 2012-9-25 16:57:23 | 显示全部楼层
这个东西,我个人如果说是要对14个IO都有独立的操作,那么我的做法是宏定义 比如说 LED0_Open  PORTA |= (1<<X);   LED0_Close PORTA &= (1<<X); 这个X是你IO口在PORTA中的位。
有了这些定义,你想对哪个IO口操作就操作哪个

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

出0入0汤圆

发表于 2012-9-25 17:24:55 | 显示全部楼层
本帖最后由 zhanan 于 2012-9-25 17:33 编辑

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

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

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

出0入0汤圆

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

出0入0汤圆

发表于 2012-9-25 17:47:57 | 显示全部楼层
1. 你定义在普通内存, 没法操作IO。
2. 即使你定义在IO上,没法用char,用bit。
3. 如果是51 几个IO地址不连续。

出0入0汤圆

 楼主| 发表于 2012-9-25 17:54:01 | 显示全部楼层
本帖最后由 bootgames 于 2012-9-25 17:55 编辑

#define B[0].Led     PORTA_Bit3
#define B[1].Led     PORTA_Bit5

这样写提示不对
怎么改?

出0入0汤圆

发表于 2012-9-25 17:57:38 | 显示全部楼层
第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。

出0入0汤圆

发表于 2012-9-25 17:58:54 | 显示全部楼层
你这个对某一个IO操作的写法怎么写的。

出0入0汤圆

 楼主| 发表于 2012-9-25 18:01:22 | 显示全部楼层
zhanan 发表于 2012-9-25 17:57
第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。
...

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

出0入0汤圆

 楼主| 发表于 2012-9-25 18:03:05 | 显示全部楼层
tangguanglun 发表于 2012-9-25 17:58
你这个对某一个IO操作的写法怎么写的。

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

出0入0汤圆

发表于 2012-9-25 18:03:18 | 显示全部楼层
bootgames 发表于 2012-9-25 18:01
可能是无解
我没想出办法来
似乎不能实现

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

出0入0汤圆

 楼主| 发表于 2012-9-25 18:03:42 | 显示全部楼层
只能用结结构体里的变量来定义IO口了

怎么写

出0入0汤圆

发表于 2012-9-25 18:04:48 | 显示全部楼层
bootgames 发表于 2012-9-25 18:03
只能用结结构体里的变量来定义IO口了

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-9-26 08:33:54 | 显示全部楼层
typedef struct {
                    char  led;
                      }MOMN;

MOMN    KIOO[14]=
{
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[i].led=0 或 1;//0-亮   1-灭
}

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

出0入0汤圆

发表于 2012-9-29 10:43:05 | 显示全部楼层
14个IO口,PA占6个 PB占4个 PC占4个
PORTA=B[i].led ;   PORTB=B[6+i].led  ;  PARTC=B[6+4+i].led ;     

出0入0汤圆

发表于 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[14] = {
   {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);
}

出0入0汤圆

发表于 2012-9-29 14:30:45 | 显示全部楼层
楼上的方法不错

出0入0汤圆

发表于 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[14] = {
   {GPIOC, GPIO_Pin_8},
   {GPIOA, GPIO_Pin_2},
   {..., ...},
   ...
};

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

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

for (i = 0; i < 15; i++)
   (op_fun[b[i].led])(MAP[i].g, MAP[i].io);
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 13:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表