因为两个都用到了8255并行拓展芯片放一起搞定!
一、 任务
利用8255扩展并行端口(硬件电路参见CodeDisplay_8255.DSN)。当KEY按下时,利用8255的PC口输入二进制值编码(6位),将该值转换成十进制后显示在2位7段LED显示器上。
一、 任务
利用8255的PA口和PB口实现6位7段LED显示器动态显示(硬件电路参见6XLED_8255.DSN)。要求能够在显示器上显示任意000000~999999的十进制数据。
设计思路:
8255芯片:这个鬼芯片就是这两个实验的核心,也不难。程序通过单片机像控制外部存储器一样调戏这块芯片。ok一起调戏。
先看图中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一样,定义后直接拿来用。
直接上代码了,因为电路加了个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];
}
完了