模拟数字显示管

本文介绍了如何使用七段数码管进行数字模拟显示,通过控制二极管的点亮状态来呈现数字图像。由于无法直接驱动实物数码管,文章提出了将数码管的显示内容存储到缓冲区中,每个缓冲区可以描绘一个数字,以7x4的像素格式表示。缓冲区中的数据如3和5的显示示例,并指出不同数码管在模拟位置上的轻微重叠不影响整体效果。文中还定义了三个二维字符数组 BUF1, BUF2, BUF3 用于表示三位数的数码管显示。" 37503673,3142583,Ambari 1.4.4 安装指南:OpenSUSE 11,"['开源软件', '集群管理', 'Hadoop', 'SUSE', '操作系统']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

七段数码管模拟演示


码管如下:

                       

用下面的二位数组 每行表示一个数字,每个数字用七段数码管描述,通过控制某几个二极管点亮,拼成一个数字的图像。

int MX[10][7] = 
{
	{1,1,1,0,1,1,1},//0
	{0,0,1,0,0,1,0},//1
	{1,0,1,1,1,0,1},//2
	{1,0,1,1,0,1,1},//3
	{0,1,1,1,0,1,0},//4
	{1,1,0,1,0,1,1},//5
	{1,1,0,1,1,1,1},//6
	{1,0,1,0,0,1,0},//7
	{1,1,1,1,1,1,1},//8
	{1,1,1,1,0,1,1}//9
};

因为无法驱动真正的数码管,我们把要驱动的数码管所在的位置“描绘”到缓冲区中每个缓冲区只能描绘1个数字,缓冲区“像素”数为:7x4

比如,3号数码管在缓冲区中的描绘为:

....

....

....

@@@@

....

....

....

再比如,5号管描述为:

....

....

....

...@

...@

...@

...@

注意,不同数码管所占据的模拟位置稍有重叠,这并不影响效果。

char BUF1[7][4];  //每个二维数组表示一个数字,三个数组表示一个三位数。

char BUF2[7][4];  //输出时,取每个数组的第一行一起输出,依次类推,因为输出是

char BUF3[7][4];  //从上到下,从左到右进行的,不能倒退


具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MX[10][7] = 
{
	{1,1,1,0,1,1,1},//0
	{0,0,1,0,0,1,0},//1
	{1,0,1,1,1,0,1},//2
	{1,0,1,1,0,1,1},//3
	{0,1,1,1,0,1,0},//4
	{1,1,0,1,0,1,1},//5
	{1,1,0,1,1,1,1},//6
	{1,0,1,0,0,1,0},//7
	{1,1,1,1,1,1,1},//8
	{1,1,1,1,0,1,1}//9
};
void init_buf(char p[][4])//初始化
{
	for (int i = 0; i < 7; i++)
		for (int j = 0; j < 4; j++)
			p[i][j] = '.';
}
void Fill(int data[],char buf[7][4])//填充缓冲区
{
	int i;
	for (i = 0; i < 7; i++)
		if (data[i])
			{
				switch(i)
				{
				case 0:
					buf[0][0] = buf[0][1] = buf[0][2] = buf[0][3] = '@';
					break;
				case 1:
					buf[0][0] = buf[1][0] = buf[2][0] = buf[3][0] = '@';
					break;
				case 2:
					buf[0][3] = buf[1][3] = buf[2][3] = buf[3][3] = '@';
					break;
				case 3:
					buf[3][0] = buf[3][1] = buf[3][2] = buf[3][3] = '@';
					break;
				case 4:
					buf[3][0] = buf[4][0] = buf[5][0] = buf[6][0] = '@';
					break;
				case 5:
					buf[3][3] = buf[4][3] = buf[5][3] = buf[6][3] = '@';
					break;
				case 6:
					buf[6][0] = buf[6][1] = buf[6][2] = buf[6][3] = '@';
					break;
				}
			}
}
int main()
{
	char BUF1[7][4],BUF2[7][4],BUF3[7][4]; 
	char can[5];
	init_buf(BUF1);
	init_buf(BUF2);
	init_buf(BUF3);
	printf("请输入要显示的3位整数(100-999),输入exit退出:");
	gets(can);
	while (strcmp(can,"exit"))
	{
		Fill(MX[can[0] - '0'],BUF1);
		Fill(MX[can[1] - '0'],BUF2);
		Fill(MX[can[2] - '0'],BUF3);
		for (int i = 0; i < 7; i++)//输出
		{
			int j;
			for (j = 0; j < 4; j++)
				printf("%c",BUF1[i][j]);
			printf("   ");
			for (j = 0; j < 4; j++)
				printf("%c",BUF2[i][j]);
			printf("   ");
			for (j = 0; j < 4; j++)
				printf("%c",BUF3[i][j]);
			printf("\n");
		}
		init_buf(BUF1);
		init_buf(BUF2);
		init_buf(BUF3);
		system("pause");
		printf("请输入要显示的3位整数(100-999),输入exit退出:");
		gets(can);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值