用AT89C51编写C语言程序,采用8255和8个数码管,要求循环动态显示数字19491001。
时间: 2023-12-17 21:02:12 浏览: 207
基于89C51的计算器C语言代码
思路:
1. 首先需要设置8255芯片的模式,将其设置为模式0,即将其三个端口均设置为I/O端口。
2. 将8255的端口A连接到8个数码管的控制引脚,将端口B连接到数码管的段选引脚。
3. 通过AT89C51的定时器中断,定时更新数码管的显示内容。
4. 在定时器中断服务程序中,将要显示的数字19491001依次存储到一个数组中,然后在循环中将数组中的数值依次输出到数码管上。
下面是具体的代码实现:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 数码管段码表
uchar code duanma[17] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
uchar code weima[8] = {
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
// 要显示的数字
uchar code num[8] = {1, 9, 4, 9, 1, 0, 0, 1};
uchar cnt = 0; // 数码管计数器
uchar display[8]; // 存储要显示的数字
void delay(uint x)
{
uint i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
// 定时器0中断服务程序
void timer0_isr() interrupt 1
{
cnt++;
cnt %= 8;
P0 = weima[cnt];
P2 = duanma[display[cnt]];
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1,16位定时器
TH0 = 0xfc; // 定时1ms
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
display[0] = num[0];
display[1] = num[1];
display[2] = num[2];
display[3] = num[3];
display[4] = num[4];
display[5] = num[5];
display[6] = num[6];
display[7] = num[7];
// 设置8255芯片为模式0
P3 = 0x00;
P1 = 0x00;
P2 = 0x00;
P0 = 0x00;
P3 = 0x80;
while (1)
{
delay(1000); // 延时1s
// 更新要显示的数字
display[0] = num[0];
display[1] = num[1];
display[2] = num[2];
display[3] = num[3];
display[4] = num[4];
display[5] = num[5];
display[6] = num[6];
display[7] = num[7];
}
}
```
阅读全文