如何在不触及先前写入的情况下写入 C 中的数据寄存器?
How to write to data register in C, without touching previous writes?
我是 C 的初学者,遇到这种情况:
我可以成功写入数据寄存器 0x103 和方向寄存器 0x95 的 gpio 端口。如果我想写入另一个引脚,我必须 "overwrite" 以前的引脚。
就好像我先写 00010000 然后想让另一个引脚变高我需要写 00010001 才能不让第一个“1”变低。
建议?
这是我的代码:
#include <stdio.h>
#include <stdio.h>
#include <sys/io.h>
#define outportb(a,b) outb(b,a)
#define inportb(a) inb(a)
void main(void)
{
iopl(3);
/* set GPIO port1[7-0] as output mode */
outportb(0x95, 0xff);
/* write data to GPIO port1 */
outportb(0x103, 0x11);
}
输出端口通常是可读的,所以你有
outportb(0x103, 0x10); // set b4
...
outportb(0x103, 0x11); // set b1 and b4
你可以做到,说
outportb(0x103, 0x10); // set b4
...
outportb(0x103, inportb(0x103) | 0x01); // set b0 too
但有时不建议读取/修改/写入输出端口。无论如何,保留输出状态的副本,修改它并将其写入端口
unsigned char bcopy = 0; // init port output
outportb(0x103, bcopy);
...
bcopy |= 0x10; // set b4
outportb(0x103, bcopy);
...
bcopy |= 0x01; // set b0
outportb(0x103, bcopy);
...
bcopy &= 0xEF; // now clear b4
outportb(0x103, bcopy);
或单行:
outportb(0x103, bcopy = 0); // init port
...
outportb(0x103, bcopy |= 0x10); // set b4
...
outportb(0x103, bcopy |= 0x01); // set b0
...
outportb(0x103, bcopy &= 0xEF); // now clear b4
我是 C 的初学者,遇到这种情况:
我可以成功写入数据寄存器 0x103 和方向寄存器 0x95 的 gpio 端口。如果我想写入另一个引脚,我必须 "overwrite" 以前的引脚。
就好像我先写 00010000 然后想让另一个引脚变高我需要写 00010001 才能不让第一个“1”变低。
建议?
这是我的代码:
#include <stdio.h>
#include <stdio.h>
#include <sys/io.h>
#define outportb(a,b) outb(b,a)
#define inportb(a) inb(a)
void main(void)
{
iopl(3);
/* set GPIO port1[7-0] as output mode */
outportb(0x95, 0xff);
/* write data to GPIO port1 */
outportb(0x103, 0x11);
}
输出端口通常是可读的,所以你有
outportb(0x103, 0x10); // set b4
...
outportb(0x103, 0x11); // set b1 and b4
你可以做到,说
outportb(0x103, 0x10); // set b4
...
outportb(0x103, inportb(0x103) | 0x01); // set b0 too
但有时不建议读取/修改/写入输出端口。无论如何,保留输出状态的副本,修改它并将其写入端口
unsigned char bcopy = 0; // init port output
outportb(0x103, bcopy);
...
bcopy |= 0x10; // set b4
outportb(0x103, bcopy);
...
bcopy |= 0x01; // set b0
outportb(0x103, bcopy);
...
bcopy &= 0xEF; // now clear b4
outportb(0x103, bcopy);
或单行:
outportb(0x103, bcopy = 0); // init port
...
outportb(0x103, bcopy |= 0x10); // set b4
...
outportb(0x103, bcopy |= 0x01); // set b0
...
outportb(0x103, bcopy &= 0xEF); // now clear b4