编码显示器和六位7段数码管

因为两个都用到了8255并行拓展芯片放一起搞定!

编码显示器

一、  任务

利用8255扩展并行端口(硬件电路参见CodeDisplay_8255.DSN)。当KEY按下时,利用8255的PC口输入二进制值编码(6位),将该值转换成十进制后显示在2位7段LED显示器上。

六位7段LED显示器动态显示

一、  任务

利用8255的PA口和PB口实现6位7段LED显示器动态显示(硬件电路参见6XLED_8255.DSN)。要求能够在显示器上显示任意000000~999999的十进制数据。

编码显示器和六位7段数码管_第1张图片

编码显示器和六位7段数码管_第2张图片

设计思路:

8255芯片:这个鬼芯片就是这两个实验的核心,也不难。程序通过单片机像控制外部存储器一样调戏这块芯片。ok一起调戏。

编码显示器和六位7段数码管_第3张图片

先看图中1,这个很明显了设置每个口口的功能通过这8位BIT,要啥功能就在第几位置个数,然后翻译成16进制数就可以了。控制字永远等于1就好了。工作方式永远0。

比如我要设置PA,PB,PC都是输出口那就是,           [D7:D0] 1000 0000   16进制就是 80

再来一发吧PA,PB设置为输出,PC设置为输入      [D7:D0] 1000 1001   16进制就是 89

这块小芯片就用输入输出就好了,其他功能就不多说了,反正我不会用。

然后看图中2,先学一个调戏外部存储的口令:XBYTE  关键字用来操作外部存储滴了解就好具体看百度

控制口就相当于初始化地址,PA,PB,PC就像51的IO一样,定义后直接拿来用。

编码显示器和六位7段数码管_第4张图片

编码显示器和六位7段数码管_第5张图片

直接上代码了,因为电路加了个2003反向装逼器设置输出数值和读取数值的时候取反一下。

#include         //7段数码管
#include
#define uchar unsigned char
//8255端口地址定义

#define Com8255 XBYTE [0x0C00]  //定义端口
#define PA8255 XBYTE [0x0000]
#define PB8255 XBYTE [0x0400]
#define PC8255 XBYTE [0x0800]
//位变量定义
long int num = 998890; //要显示的数

//变量定义

uchar code table_seg [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//
uchar code table_dig [6] = {0x80,0x40,0x20,0x10,0x08,0x04};
void	delay(void)
{	register int	i;
	for(i = 0; i < 250 ; i++);
}

void display ();  
/***********************************************************************
** 名  称:	main()
** 入  参:	无
** 返回值:	无
***********************************************************************/
void	main(void)
{	
	Com8255 = 0x80;//初始化8255
	while(1)
	{
display();	

}
}

/***********************************************************************
** 名  称:	display
** 功  能:	实现数码管显示
** 入  参:	num1:第一位数码管显示数值,num2:第一位数码管显示数值
** 返回值:	无
** 说  明:	无
***********************************************************************/
void display ()
{		
	//第1位数码管显示指令
	long int num1 = num;
	char i=0;
	for(i=0;i<6;i++)
	{
	PA8255=table_seg[num1%10];
           PB8255=table_dig[i]; 
		delay ( );
		PB8255=0x00;
	num1/=10;
	}
 	
}

#include
#include
#define uchar unsigned char
//8255端口地址定义

#define Com8255 XBYTE [0x0C00]
#define PA8255 XBYTE [0x0000]
#define PB8255 XBYTE [0x0400]
#define PC8255 XBYTE [0x0800]
//位变量定义
char num = 20; //要显示的数

uchar code table_seg [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//

void display ();
/***********************************************************************
** 名  称:	main()
** 入  参:	无
** 返回值:	无
***********************************************************************/
void	main(void)
{	
	Com8255 = 0x89;//初始化8255 PC设置为输入其他输出
	while(1)
	{
 num = ~PC8255;
display();	

}
}
/***********************************************************************
** 名  称:	display
** 功  能:	实现数码管显示
** 入  参:	num1:第一位数码管显示数值,num2:第一位数码管显示数值
** 返回值:	无
** 说  明:	无
***********************************************************************/
void display ()
{		
	//第1位数码管显示指令	
 PA8255=~table_seg[num/10];   
  PB8255=~table_seg[num%10]; 
}
完了




















你可能感兴趣的:(51单片机,Proteus仿真)