1、编写C语言main函数,在main函数中实现点亮、熄灭、 闪烁、流水灯等效果 2、修改上述程序,只改变GPJ0 (3、4、5)引脚相关的寄 存器位,其余不改变。
时间: 2023-10-20 18:06:08 浏览: 84
以下是实现点亮、熄灭、闪烁、流水灯等效果的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#define GPIO_BASE 0x11000000
#define GPJ0CON 0x0240
void write_reg(unsigned int addr, unsigned int val) {
int fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
perror("open");
return;
}
unsigned int *ptr = (unsigned int*)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~0xFFF);
if (ptr == MAP_FAILED) {
perror("mmap");
close(fd);
return;
}
ptr[(addr & 0xFFF) / 4] = val;
munmap(ptr, 4096);
close(fd);
}
int main() {
// 设置GPJ0引脚为输出模式
write_reg(GPIO_BASE + GPJ0CON, 0x1 << 12 | 0x1 << 8 | 0x1 << 4);
while (1) {
// 点亮
write_reg(GPIO_BASE + 0x1100, 0x1 << 3);
sleep(1);
// 熄灭
write_reg(GPIO_BASE + 0x1100, 0x0 << 3);
sleep(1);
// 闪烁
write_reg(GPIO_BASE + 0x1100, 0x1 << 3);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x0 << 3);
sleep(1);
// 流水灯
write_reg(GPIO_BASE + 0x1100, 0x1 << 3);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x1 << 4);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x1 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x0 << 3 | 0x0 << 4 | 0x0 << 5);
sleep(1);
}
return 0;
}
```
接下来是修改后只改变GPJ0引脚相关的寄存器位的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#define GPIO_BASE 0x11000000
#define GPJ0CON 0x0240
void write_reg(unsigned int addr, unsigned int val) {
int fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
perror("open");
return;
}
unsigned int *ptr = (unsigned int*)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~0xFFF);
if (ptr == MAP_FAILED) {
perror("mmap");
close(fd);
return;
}
ptr[(addr & 0xFFF) / 4] = val;
munmap(ptr, 4096);
close(fd);
}
int main() {
// 设置GPJ0引脚为输出模式
write_reg(GPIO_BASE + GPJ0CON, 0x1 << 12 | 0x1 << 8 | 0x1 << 4);
while (1) {
// 点亮
write_reg(GPIO_BASE + 0x1100, 0x1 << 3);
sleep(1);
// 熄灭
write_reg(GPIO_BASE + 0x1100, 0x0 << 3);
sleep(1);
// 闪烁
write_reg(GPIO_BASE + 0x1100, 0x1 << 3);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x0 << 3);
sleep(1);
// 流水灯
write_reg(GPIO_BASE + 0x1100, 0x1 << 3 | 0x1 << 4 | 0x1 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x0 << 3 | 0x1 << 4 | 0x1 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x1 << 3 | 0x0 << 4 | 0x1 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x1 << 3 | 0x1 << 4 | 0x0 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x0 << 3 | 0x0 << 4 | 0x1 << 5);
sleep(1);
write_reg(GPIO_BASE + 0x1100, 0x1 << 3 | 0x0 << 4 | 0x0 << 5);
sleep(1);
}
return 0;
}
```
注意到程序中只使用了GPJ0引脚相关的寄存器位来控制LED闪烁和流水灯效果,而未修改其他的寄存器位。其中,第3、4、5个寄存器位分别对应GPJ0引脚。
阅读全文