AT89C51单片机32~39号引脚接74ls373,然后接8255A,8255A的D口接单片机,A口为段选线,B口为线选线,编写显示数码管
时间: 2024-02-05 21:03:32 浏览: 76
好的,这个问题涉及到硬件的连接和程序的编写,下面我来为您解答。
首先,将AT89C51单片机的32~39号引脚分别连接到74ls373的D0~D7引脚上,然后将74ls373的输出引脚(Q0~Q7)分别连接到8255A的D0~D7引脚上。
接下来,8255A的A口为段选线,B口为线选线,我们需要根据需要连接数码管的对应引脚。以常见的共阳数码管为例,将8255A的A0~A6引脚分别连接到数码管的a~g引脚上,将8255A的B0~B3引脚分别连接到数码管的第1~4位的共阳引脚上。
接下来,我们需要编写程序来控制数码管的显示。这里提供一份C语言的示例代码,仅供参考:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LATCH=P3^5; //74ls373锁存管的锁存引脚
sbit RS=P3^2; //8255A的寄存器选择引脚
sbit RW=P3^3; //8255A的读写选择引脚
sbit EN=P3^4; //8255A的使能引脚
uchar code seg[]={ //数码管段码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(uint t) //延时函数
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void write_com(uchar com) //写入命令函数
{
RS=0; //选择命令寄存器
RW=0; //写入模式
EN=1; //使能
P1=com; //写入命令
_nop_(); //空操作
_nop_();
EN=0; //禁能
}
void write_data(uchar dat) //写入数据函数
{
RS=1; //选择数据寄存器
RW=0; //写入模式
EN=1; //使能
P1=dat; //写入数据
_nop_(); //空操作
_nop_();
EN=0; //禁能
}
void disp(uchar x) //在数码管上显示一个数字
{
LATCH=0; //锁存管输出无效
P0=seg[x]; //数码管段码
LATCH=1; //锁存管输出有效
}
void main()
{
uchar i,j,k;
write_com(0x38); //8位数据接口,2行显示,5x7点阵字符
write_com(0x0c); //显示器开,光标关闭
write_com(0x06); //光标右移,字符不移动
write_com(0x01); //清屏
while(1)
{
for(i=0;i<10;i++) //第1位循环显示0~9
{
RS=0; //选择命令寄存器
RW=0; //写入模式
EN=1; //使能
P1=0x80; //设置光标位置为第1个字符位置
_nop_();
_nop_();
EN=0; //禁能
disp(i); //在数码管上显示数字
for(j=0;j<10;j++) //第2位循环显示0~9
{
RS=0; //选择命令寄存器
RW=0; //写入模式
EN=1; //使能
P1=0x81; //设置光标位置为第2个字符位置
_nop_();
_nop_();
EN=0; //禁能
disp(j); //在数码管上显示数字
for(k=0;k<10;k++) //第3位循环显示0~9
{
RS=0; //选择命令寄存器
RW=0; //写入模式
EN=1; //使能
P1=0x82; //设置光标位置为第3个字符位置
_nop_();
_nop_();
EN=0; //禁能
disp(k); //在数码管上显示数字
delay(500); //延时,控制显示速度
}
}
}
}
}
```
以上就是一个简单的数码管显示程序,您可以根据实际需求进行修改和扩展。需要注意的是,程序中的引脚和延时参数都需要根据具体硬件连接情况进行调整。
阅读全文