欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

点阵显示

程序员文章站 2024-03-15 14:05:47
...

点阵显示

最终效果:

51点阵显示

硬件连接:

点阵显示

(软件为Proteus)

  • 经测试:

    • P0口 控制行(从左往右为76543210,高电平有效)

    • P1口 控制每一行上的点 (从上往下为01234567,低电平有效)

    • 按键SW2/SW3按下后读取为低电平

  • 点阵显示 25:

点阵显示

二进制 十六进制
第0列 1100 0101 0xc5
第1列 1101 0101 0xd5
第2列 1101 0001 0xd1
第3列 1111 1111 0xff
第4列 1101 0001 0xd1
第5列 1101 0101 0xd5
第6列 1100 0101 0xc5
第7列 1111 1111 0xff
uchar code rowpoint[]={0xc5,0xd5,0xd1,0xff,0xd1,0xd5,0xc5,0xff};

通过一个数组储存每一列的输出。

  • 动态显示:

    通过每一行的后移实现,但单纯的后移会使最后的一个索引溢出,可以通过取余实现循环;

程序编写:

  • 程序整体:
/*点阵*/
#include<reg51.h>
#define uchar unsigned char 
uchar code column[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code rowpoint[]={0xc5,0xd5,0xd1,0xff,0xd1,0xd5,0xc5,0xff};

sbit key1=P1^0;
sbit key2=P1^1;

void delayms(uchar x)	//延时 x (ms)
{	uchar y;
	for (;x>0;x--)
 	{	for(y=0;y<128;y++);
 	}
}


void static_display()		//静态显示
{	unsigned int i;
	unsigned int k;
	for(k=0;k<100;k++)
	{	for(i=0;i<8;i++)
		{	P0 = column[i];
 			P2 = rowpoint[i];
			delayms(6);
		}
	}
}


void dynamic_display()		//动态显示
{	unsigned int j;
	unsigned int i;
	unsigned int k;
	for(j=0;j<8;j++)
	{	for(k=0;k<100;k++)
		{	for(i=0;i<8;i++)
			{	P0 = column[(i+j)%8];
	 			P2 = rowpoint[i];
				delayms(6);
			}
		}	
	}
}


void main()
{	while(1)
	{	if(key1 == 0)
		{	static_display();	
		}
		if(key2 == 0)
		{	dynamic_display();
		}
		P0 = 0x00;		//熄屏	
	}
}
  • 通过k循环控制每个状态显示时长
相关标签: 单片机