AT89C51单片机,用74LS373扩展输出接口地址为2FFFH,外接8个发光二极管;用74LS244扩展输出接口地址为5FFFH,外接8个按键,按下按键,对应的发光二极管亮,释放按键,对应的发光二极管灭。用4-16译码器对373和244进行译码。写出代码
时间: 2024-01-10 12:03:57 浏览: 96
Proteus仿真74LS148扩展中断+代码+DSN
5星 · 资源好评率100%
好的,以下是使用C语言编写的AT89C51单片机程序,实现了上述功能:
```
#include <reg51.h>
// 定义IO口和译码器的引脚
sbit D0 = P0^0;
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
sbit OE1 = P3^4; // 373译码器输出使能
sbit OE2 = P3^5; // 244译码器输出使能
sbit A0 = P2^0; // 译码器地址线A0
sbit A1 = P2^1; // 译码器地址线A1
sbit A2 = P2^2; // 译码器地址线A2
sbit A3 = P2^3; // 译码器地址线A3
sbit ENLED = P3^6; // 发光二极管使能
// 定义变量和常量
unsigned char LED_DATA = 0xFF; // 发光二极管数据,初始值为全灭
unsigned char KEY_DATA = 0xFF; // 按键数据,初始值为全释放
unsigned char ADDR1 = 0x00; // 373译码器地址,初始值为0
unsigned char ADDR2 = 0x01; // 244译码器地址,初始值为1
const unsigned char LED_TAB[] = { // 发光二极管表格,0表示亮,1表示灭
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07
};
// 延时函数
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 120; j++);
}
}
// 译码器输出函数
void output(unsigned char data, unsigned char addr, bit oe) {
A0 = addr & 0x01;
A1 = (addr >> 1) & 0x01;
A2 = (addr >> 2) & 0x01;
A3 = (addr >> 3) & 0x01;
if (oe) {
P1 = data;
} else {
P1 = 0xFF;
}
}
// 主函数
void main() {
// 初始化IO口和译码器
P0 = 0xFF;
P1 = 0xFF;
P2 = 0x00;
P3 = 0xFF;
OE1 = 0;
OE2 = 0;
ENLED = 1;
// 循环读取按键状态,并更新LED状态
while (1) {
// 读取按键状态
KEY_DATA = P2 & 0xF0;
if (KEY_DATA != 0xF0) {
// 检测到按键按下,更新LED状态
switch (KEY_DATA) {
case 0xE0: LED_DATA = LED_TAB[0]; break;
case 0xD0: LED_DATA = LED_TAB[1]; break;
case 0xB0: LED_DATA = LED_TAB[2]; break;
case 0x70: LED_DATA = LED_TAB[3]; break;
case 0xE: LED_DATA = LED_TAB[4]; break;
case 0xD: LED_DATA = LED_TAB[5]; break;
case 0xB: LED_DATA = LED_TAB[6]; break;
case 0x7: LED_DATA = LED_TAB[7]; break;
default: LED_DATA = 0xFF; break;
}
}
// 输出LED状态
output(LED_DATA, ADDR1, 1);
OE1 = 1;
delay(5);
OE1 = 0;
// 输出按键状态
output(KEY_DATA, ADDR2, 1);
OE2 = 1;
delay(5);
OE2 = 0;
// 刷新发光二极管
output(LED_DATA, ADDR1, 0);
ENLED = 0;
delay(1);
ENLED = 1;
}
}
```
程序的思路如下:
1. 定义IO口和译码器的引脚,以及变量和常量。
2. 初始化IO口和译码器。
3. 进入循环,不断读取按键状态。
4. 如果检测到按键按下,根据按键的值更新LED状态。
5. 输出LED状态和按键状态,通过译码器将地址转换成输出引脚。
6. 刷新发光二极管,将LED状态输出到发光二极管上。
7. 延时一段时间,以保证闪烁效果。
8. 回到循环的开头,继续读取按键状态。
至于Proteus的仿真操作,可以参考相关教程和资料。
阅读全文