请教C51 sbit定义的变量通过函数参数传递进函数内部的问题
本帖最后由 mangolu 于 2018-11-10 19:09 编辑如题,是一个74HC595传送数据的函数,如下面:
/** 定义DS数据端口连接 */
sbit HC595_DS = P2 ^ 1;
/** 定义SH_CP移位时钟端口连接 */
sbit HC595_SH_CP = P2 ^ 0;
/** 定义ST_CP锁存时钟端口连接 */
sbit HC595_ST_CP = P2 ^ 2;
/** 定义DS输出低电平的方法 */
#define HC595_DS_LOW (HC595_DS = 0)
/** 定义DS输出高电平的方法 */
#define HC595_DS_HIGH (HC595_DS = 1)
/** 定义SH_CP输出低电平的方法 */
#define HC595_SH_CP_LOW (HC595_SH_CP = 0)
/** 定义SH_CP输出高电平的方法 */
#define HC595_SH_CP_HIGH (HC595_SH_CP = 1)
/** 定义ST_CP输出低电平的方法 */
#define HC595_ST_CP_LOW (HC595_ST_CP = 0)
/** 定义ST_CP输出高电平的方法 */
#define HC595_ST_CP_HIGH (HC595_ST_CP = 1)
void HC595_Send_Data(unsigned char ucData) {
unsigned char ucI;
for(ucI = 0; ucI < 8; ucI ++) {
HC595_SH_CP_LOW;
HC595_DS = (ucData & 0x80);
HC595_SH_CP_HIGH;
ucData <<= 1;
}
}
因为我这个发送函数直接把sbit定义的HC595_DS、HC595_SH等引脚包含在里面,当我的系统中要使用两组以上的74HC595总线时,我这个函数就要重装写过。我现在想要实现的功能是在函数的参数里添加一个变量比如:
void HC595_Send_Data(PORT *port, unsigned char ucData)
这样通过PORT这个参数,把sbit定义的引脚传替进去。但是试了几种方法,sbit这个他定义出来的又不是什么具体的变量,无法传进去。请教大家,谁有比较好的解决方法?还是只能一个总线写一个函数才能解决? 不是间接寻址,无法传递的哦! XA144F 发表于 2018-11-10 19:15
不是间接寻址,无法传递的哦!
那给个思路,谢谢了 mangolu 发表于 2018-11-10 19:19
那给个思路,谢谢了
这个貌似无解,只能对每组bit专门写代码。因为位操作是单独的指令(例如51的位设位清,AVR的Read-Modify-Write,都是单独的指令,不可以动态配置)。你要是非要调,只能写成端口和mask,然后手动读,位操作,写。时间增加4倍以上。 定义好所有引脚,port 定义为组号,函数内部if...else区分 本帖最后由 mangolu 于 2018-11-10 19:55 编辑
wye11083 发表于 2018-11-10 19:25
这个貌似无解,只能对每组bit专门写代码。因为位操作是单独的指令(例如51的位设位清,AVR的Read-Modify- ...
本来我是想这样传递:
typedef struct {
unsigned int DS_Port;
unsigned char DS_Pin;
unsigned int SH_CP_Port;
unsigned char SH_CP_Pin;
} HC595_PORT;
void HC595_Send_Data(HC595_PORT *port,unsigned char ucData) {
unsigned char ucI;
/** 从高字节开始,依次传送数据 */
for(ucI = 0; ucI < 8; ucI ++) {
/** 移位时钟先设置为低电平 */
port -> SH_CP_Port &= ~(1 << (port -> SH_CP_Pin));
/** 输出电平方法1 */
if(ucData & 0x80) {
port -> DS_Port |= (1 << (port -> DS_Pin));
} else {
port -> DS_Port &= ~(1 << (port -> DS_Pin));
}
/** 移位时钟从低变为高,上升沿锁存DS数据进移位寄存器 */
port -> SH_CP_Port |= (1 << (port -> SH_CP_Pin));
ucData <<= 1; /** 从最高位开始传输,向左移位 */
}
}
HC595_PORT port;
port.DS_Port = P2;
port.DS_Pin = 1;
port.SH_CP_Port = P2;
port.SH_CP_Pin = 0;
HC595_Send_Data(&port,0x80);
HC595_Send_Store();
但是实现不了,不懂上面我这个程序有没有错误。可能也是P2这样的端口是用sfr这个指令定义的。不懂有什么方法可以用指针通过地址直接操作端口吗?
helloshi 发表于 2018-11-10 19:38
定义好所有引脚,port 定义为组号,函数内部if...else区分
那样就是把所有代码写一遍,我也在想如果实现不了,就全写出来,用预编译做个开关就行。但是太麻烦了 mangolu 发表于 2018-11-10 19:53
本来我是想这样传递:
位操作是单独的指令,不是可以动态生成的变量。所以不能直接传递。这个无解,也许有大牛能做出来。我是在义愤用if()else()去做的。 wye11083 发表于 2018-11-10 20:33
位操作是单独的指令,不是可以动态生成的变量。所以不能直接传递。这个无解,也许有大牛能做出来。我是在 ...
谢谢了,看来我也只能照着ifelse打一遍了 #define H595_0_PORT P2
..... H595_0_PIN 0x01
...
H595_0_PORT |= H595_0_PIN;
...
没有位操作的不是这样吗,多了1-2条指令,要比if...else之类的快些
页:
[1]