51单片机通过两片74LS164扩展8位输出口,输出分别接6位共阴极动态数码管的段码和位码,请编程实现6位数码管动态显示”3.14159“。74LS245是去、段驱动,7407是位驱动怎么写
时间: 2024-05-10 20:17:46 浏览: 101
以下是基于51单片机的C语言代码实现:
```c
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LATCH = P2^0; // 74LS164锁存器LATCH引脚接P2.0
sbit CLK = P2^1; // 74LS164锁存器CLK引脚接P2.1
sbit DATA = P2^2; // 74LS164锁存器DATA引脚接P2.2
sbit A = P1^0; // 数码管A段接P1.0
sbit B = P1^1; // 数码管B段接P1.1
sbit C = P1^2; // 数码管C段接P1.2
sbit D = P1^3; // 数码管D段接P1.3
sbit E = P1^4; // 数码管E段接P1.4
sbit F = P1^5; // 数码管F段接P1.5
sbit G = P1^6; // 数码管G段接P1.6
sbit DP = P1^7; // 数码管小数点段接P1.7
sbit DIG1 = P0^0; // 数码管第1位选择接P0.0
sbit DIG2 = P0^1; // 数码管第2位选择接P0.1
sbit DIG3 = P0^2; // 数码管第3位选择接P0.2
sbit DIG4 = P0^3; // 数码管第4位选择接P0.3
sbit DIG5 = P0^4; // 数码管第5位选择接P0.4
sbit DIG6 = P0^5; // 数码管第6位选择接P0.5
uchar code segTable[] = { // 7段数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar code digTable[] = { // 位码表
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf
};
void delay(uint t) { // 延时函数
uint i;
while (t--) {
for (i = 0; i < 1000; i++);
}
}
void writeData(uchar dat) { // 向74LS164锁存器写入数据
uchar i;
for (i = 0; i < 8; i++) {
DATA = (dat & 0x80) >> 7;
CLK = 1;
CLK = 0;
dat <<= 1;
}
}
void display(uchar dig, uchar seg) { // 数码管动态显示函数
writeData(seg); // 先写入段码
writeData(digTable[dig]); // 再写入位码
LATCH = 1; // 上升沿锁存
LATCH = 0;
}
int main() {
uchar i = 0, j = 0;
uchar digit[] = { // 待显示的数字
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d
};
uchar num[] = { // 待显示的数字的位数
0x00, 0x00, 0x00, 0x01, 0x00, 0x00
};
while (1) {
for (i = 0; i < 6; i++) { // 循环显示6位数字
for (j = 0; j < 50; j++) { // 每个数字显示50ms
display(i, digit[num[i]]); // 显示当前数字的当前位
delay(1);
}
}
}
return 0;
}
```
其中,`writeData()` 函数用于向74LS164锁存器写入数据,`display()` 函数用于数码管动态显示,`digit[]` 数组存储待显示的数字的段码,`num[]` 数组存储待显示的数字的位数,循环显示6位数字,每个数字显示50ms。
阅读全文