因为两个都用到了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的十进制数据。
设计思路:
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<reg51.h> //7段数码管 #include<absacc.h> #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<reg51.h> #include<absacc.h> #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]; }完了