编写并调试出一个C语言程序,其功能为对 8255A 初始化使 PB 口为方式 0 输入,PA 口为输 出,当开关状态为全 0 时,PA 口上发光二极管循环轮流点亮。当开关处于非全 0 时,则 直接把开关状态在发光二极管上显示出来。
时间: 2024-03-10 08:51:24 浏览: 58
好的,以下是一份对8255A进行初始化并实现开关状态在发光二极管上显示的C语言程序,其中PA口对应发光二极管,PB口对应开关状态输入:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit WR = P3^5; // WR写入控制信号
sbit RD = P3^6; // RD读取控制信号
sbit CS = P3^7; // CS芯片选择信号
void delay(uint i) // 延时函数
{
while(i--);
}
void init8255() // 8255初始化函数
{
WR = 1; // 先置WR为高电平
RD = 1; // 先置RD为高电平
CS = 0; // 先置CS为低电平,选择8255
P0 = 0x80; // 将P0口置为1000 0000B,表示初始化模式
WR = 0; // 写入模式控制字
delay(10); // 延时
WR = 1; // 停止写入
P0 = 0xFF; // 将P0口置为1111 1111B,表示A寄存器值
WR = 0; // 写入A寄存器初始值
delay(10); // 延时
WR = 1; // 停止写入
P0 = 0x00; // 将P0口置为0000 0000B,表示B寄存器值
WR = 0; // 写入B寄存器初始值
delay(10); // 延时
WR = 1; // 停止写入
P0 = 0x00; // 将P0口置为0000 0000B,表示C寄存器值
WR = 0; // 写入C寄存器初始值
delay(10); // 延时
WR = 1; // 停止写入
CS = 1; // 释放8255
}
void main()
{
init8255(); // 调用初始化函数
while(1)
{
P1 = P0 & 0x0F; // 将P0口的低四位(开关状态)赋值给P1口
if((P0 & 0x0F) == 0) // 开关状态全0
{
for(uchar i = 0; i < 4; i++) // 循环轮流点亮发光二极管
{
P2 = ~(0x01 << i);
delay(10000);
}
}
else // 开关状态非全0
{
P2 = ~(P1); // 在发光二极管上显示开关状态
}
}
}
```
在这份程序中,我们通过将PA口的初始值设为0xFF,将PB口的初始值设为0x00,来实现PA口为输出、PB口为输入。在主函数中,我们通过将P0口的低四位(PB口的输入状态)赋值给P1口,并判断是否全0来实现轮流点亮发光二极管或显示开关状态。注意在显示开关状态时,需要先对P1口取反,再取反得到的值赋给P2口,因为发光二极管为低电平点亮。
阅读全文