AT89C51单片机32~39号引脚接74ls373D0~D7,ALE引脚接74ls373的ALE,然后接8255A,8255A的D口接单片机,A口为段选线,B口为线选线,编写显示数码管
时间: 2023-07-05 20:25:58 浏览: 82
好的,对于您的问题,我来给您解答一下。
首先,AT89C51单片机的32~39号引脚需要接到74ls373的D0~D7引脚上,ALE引脚接74ls373的ALE引脚上。然后将8255A的D口接到单片机上,A口为段选线,B口为线选线。
接下来,编写显示数码管的代码。这里假设使用的是四位共阳数码管。
1. 定义端口
```
sbit P2_0 = P2^0; // 数码管1
sbit P2_1 = P2^1; // 数码管2
sbit P2_2 = P2^2; // 数码管3
sbit P2_3 = P2^3; // 数码管4
sbit P1_0 = P1^0; // 线选A
sbit P1_1 = P1^1; // 线选B
sbit P1_2 = P1^2; // 线选C
sbit P1_3 = P1^3; // 段选1
sbit P1_4 = P1^4; // 段选2
sbit P1_5 = P1^5; // 段选3
sbit P1_6 = P1^6; // 段选4
```
2. 定义数码管显示码表
```
const unsigned char code NumCode[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
```
3. 定义段选和线选函数
```
void Display(unsigned char num, unsigned char select)
{
switch(select) {
case 0:
P1_0 = 1; P1_1 = 1; P1_2 = 1; break;
case 1:
P1_0 = 0; P1_1 = 1; P1_2 = 1; break;
case 2:
P1_0 = 1; P1_1 = 0; P1_2 = 1; break;
case 3:
P1_0 = 0; P1_1 = 0; P1_2 = 1; break;
case 4:
P1_0 = 1; P1_1 = 1; P1_2 = 0; break;
case 5:
P1_0 = 0; P1_1 = 1; P1_2 = 0; break;
case 6:
P1_0 = 1; P1_1 = 0; P1_2 = 0; break;
case 7:
P1_0 = 0; P1_1 = 0; P1_2 = 0; break;
}
P1_3 = NumCode[num] & 0x01;
P1_4 = (NumCode[num] >> 1) & 0x01;
P1_5 = (NumCode[num] >> 2) & 0x01;
P1_6 = (NumCode[num] >> 3) & 0x01;
}
void Select(unsigned char select)
{
switch(select) {
case 0:
P1_0 = 1; P1_1 = 1; P1_2 = 1; break;
case 1:
P1_0 = 0; P1_1 = 1; P1_2 = 1; break;
case 2:
P1_0 = 1; P1_1 = 0; P1_2 = 1; break;
case 3:
P1_0 = 0; P1_1 = 0; P1_2 = 1; break;
}
}
```
4. 主函数中循环显示
```
void main()
{
unsigned char i;
while(1) {
for(i = 0; i < 4; i++) {
Select(i);
Display(i, i);
delay(1);
}
}
}
```
这样就可以实现四位共阳数码管的显示了。其中,`delay()`函数用于延时,可以根据需要自行编写。
阅读全文