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口比较杂乱 该如何表示这关系?
楼主用位段应该更合适一些
ps:楼主太小气了{:lol:} zjr0411 发表于 2012-9-25 16:33 static/image/common/back.gif
楼主用位段应该更合适一些
ps:楼主太小气了
用位段如何建立IO 与被驱动led的关系? 用不着这样吧,用一个16位的数,每一位表示一个led
然后
switch(这个数)
{
case 0x0001: led1=1;break;
.
.
.
.
default break;
} 这个东西,我个人如果说是要对14个IO都有独立的操作,那么我的做法是宏定义 比如说 LED0_OpenPORTA |= (1<<X); LED0_Close PORTA &= (1<<X); 这个X是你IO口在PORTA中的位。
有了这些定义,你想对哪个IO口操作就操作哪个
今天才来阿莫,希望我的回答对你有帮助 本帖最后由 zhanan 于 2012-9-25 17:33 编辑
杂乱无规律,也只有写14个判断了,一目了然,组合变换反而容易错。
if( 某位 ) 端口=1; else 端口=0;
也可以这样,但编译出来可能比上面的费程序空间:端口=某位;
14句输出语句封装成一个函数,就是一个输出命令。 谢谢
但理解错了
我不是单纯的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个状态的简单罗列。 1. 你定义在普通内存, 没法操作IO。
2. 即使你定义在IO上,没法用char,用bit。
3. 如果是51 几个IO地址不连续。
本帖最后由 bootgames 于 2012-9-25 17:55 编辑
#define B.Led PORTA_Bit3
#define B.Led PORTA_Bit5
这样写提示不对
怎么改? 第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。
你这个对某一个IO操作的写法怎么写的。 zhanan 发表于 2012-9-25 17:57 static/image/common/back.gif
第二点无解,变来变去的不见得比直接写端口省多少,已经是原子操作了。
...
可能是无解
我没想出办法来
似乎不能实现 tangguanglun 发表于 2012-9-25 17:58 static/image/common/back.gif
你这个对某一个IO操作的写法怎么写的。
只能用结结构体里的变量来定义IO口了
bootgames 发表于 2012-9-25 18:01 static/image/common/back.gif
可能是无解
我没想出办法来
似乎不能实现
你这个对某一个IO操作的写法怎么写的。 只能用结结构体里的变量来定义IO口了
怎么写 bootgames 发表于 2012-9-25 18:03 static/image/common/back.gif
只能用结结构体里的变量来定义IO口了
我说的是这个意思,比如51的定义的sbitled=P1^1;这种。就可以对P1口的PIN1操作。那你这款芯片对应的操作方式呢 钻牛角尖,这个操作已经到了端口位操作,C的基本类型是字节,部分扩展才到位。
变来变去的,也只是“看起来”是直接对应了,但编译出来不见得省。
十四个端口,也不算多。真想省的话,应该硬件、软件统筹考虑。 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的关系? 一一对应输出。 14个IO口,PA占6个 PB占4个 PC占4个
PORTA=B.led ; PORTB=B.led;PARTC=B.led ; 本帖最后由 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);
}
楼上的方法不错{:lol:} 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]