基于8255的8LED显示的动态显示器

合集下载

利用8255A实现LED的流水点亮实验

利用8255A实现LED的流水点亮实验
moval,00000100b
outdx,al
;-
movdx,211h
moval,00000000b
outdx,al
movdx,210h
moval,40h
outdx,al
movdx,211h
moval,00000010b
outdx,al
;A
movdx,211h
moval,00000000b
outdx,al
moval,7fh
outdx,al
movdx,211h
moval,00100000b
outdx,al
;2
movdx,211h
moval,00000000b
outdx,al
movdx,210h
moval,5bh
outdx,al
movdx,211h
moval,00010000b
outdx,al
;5
movdx,211h
movdx,210h
moval,77h
outdx,al
movdx,211h
moval,00000001b
outdx,al
loop lp ;转至lp
jmplop ;跳至lop
hlt ;使处理器处于暂时停机状态.
codeends
end start
在数码管上显示“8255-A”。
三、实验分析
实验要求利用8255芯片8个开关来控制8个LED灯的开关。我们在课堂上学过8255有ABC三个口,可以输入和输入。因此首先可以想到的就是,把PA口A0-A7接8个波动开关K1-K7,并将A口调整为读入。同时将A口读入的信号用B口输出,这样就可以通过拨动开关来控制LED灯的明灭。为了让灯亮的时间足够人眼分辨出来,需要在程序里加入延时语句,其中加零语句就可以实现延时。

用8255设计LED显示器接口实验

用8255设计LED显示器接口实验

用8255设计LED显示器接口实验本文结合实验教学需要,介绍了用8255设计LED显示器接口实验的过程。

关键词:微机原理及应用;8255;LED;接口“微机原理及应用”是工科类专业的基础课,该课程比较抽象,因此实验教学起着至关重要的作用。

通过实验学生可以对比较抽象的命令、程序、输入输出接口电路加深理解。

现在仍有许多高校使用北京理工达盛科技有限公司的8086实验箱,但由于受到实验条件的限制,往常的做法是在有限的课堂时间内安排一些旨在验证理论知识的实验内容,较少涉及运用理论知识去解决实际问题。

这样的实验教学不利于发挥学生的学习主动性,不利于培养学生解决实际问题的能力。

如何改革传统的实验教学,如何培养学生的实际应用能力,本文举一个实例,需要教师利用现有的条件设计一些综合实验,让学生独立地去解决这些问题,从中培养能力。

希望本文能起到穿针引线的作用。

1设计LED显示器接口实验8086实验指导书显示器接口实验使用的是8279的显示输出功能,实验内容是在6位LED上循环显示8。

8086实验指导书8255并行口实验使用的是8255芯片,读开关量、输出、LED灯显示,实验讲义上都给出了电路原理图以及参考程序,学生往往是照着实验指导书上连接好线路,输入参考程序,进行程序调试。

大部分时间花在了实验的验证上,这样缺乏主动性和创新性,什么都是现成的。

能否在此基础上拓展一下,用8255芯片来实现显示器接口实验,这样既可取代8279,又可加深对8255的理解和使用。

实验任务:使用8255芯片的PA口作为段寄存器,PB口做为位寄存器,使用6位数码管从右向左逐位显示0~G,即显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G。

连线编程:由学生自己独立连接并独立编程实现,在编程过程中加深对硬件的理解、命令以及涉及的技巧。

2LED 显示器接口实验程序代码code segmentorg 100haa1: mov dx,04a6h ‘8255控制端口地址,大于255用dx做桥梁,小于255直接由端口地址传值mov al,80h ‘8255工作方式控制字out dx,allea bx,data ‘取偏移地址与bx相加aa3: mov ch,0‘显示数字0-------9 ,其中ch内容在变aa4: mov ah,0feh‘即1111 1110 为0时亮,须注意PB0与led接法,灯旋转方向mov si,6‘6个ledaa2: mov al,chxlat ‘查表地址转换指令:=MOV AL,[BX+AL]mov dx,04a0h ‘A口送字形,注意其端口地址out dx,almov al,ahmov dx,04a2h‘B口控制哪一位亮out dx,alrol ah,1 ‘1111 1110 循环左移mov di,0ffffhaa5: dec dijnz aa5 ‘延时,不为0,则decdi ,为0,则dec sidec sijnz aa2 ‘si不为0,则aa2——decsi ,为0,则inc chinc chcmp c h,12‘ch的值从0-18jnz aa4 ‘循环jmp aa3‘又从0开始到Fdata db 3fh,06h,5bh,4fh,66h,6dhdb 7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,73h,88h,00hcode endsend aa1说明:在实验教学中如何培养能力?首先设计出较好的题目。

基于8255的8LED显示的动态显示器

基于8255的8LED显示的动态显示器

南京邮电大学学年第学期课程设计实验报告题目基于8255的8LED显示的动态显示器专业通信工程学号姓名指导老师实验日期年月日题目:基于8255的8LED显示的动态显示器一,实验目的和要求1,Proteus软件的MCS51单片机仿真学习2,根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的电器原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取,原理图的电气连接,程序的编写编译以及运行,并能查出其错误等。

基本要求:1. 用数码管正常显示数字“12345678”。

2. 通过按键可改变显示方式。

3. 设计显示屏的动态效果,用10个按键,每键对应一种滚动技术。

4. 基于8255口是指显示和键盘都由8255的IO口控制发挥部分:1 设计所有动作的联合效果。

2 设计二个变速按键,可多级改变滚动速度。

3 设计一台魔术电子钟,采用自动变换,随机组合,数据每10秒变换一次。

动态显示格式:1 静止2 整体闪烁3 单字闪烁4 整体向前、向后滚动5 单字移动6 两边向中间压缩7 中间向两边扩张8 上下压缩9 文字上下滚动10组合动作(每一字符执行上述一个动作,并同时运动)二,实验仪器微型计算机三,实验原理基于8255的8LED显示的动态显示器,是由8255a做键盘控制口连接c51,并驱动8位7段数码管实现相应显示功能。

具体的,c51,p1口直接进行led数码管的位控制;p2口经74HC573译码后控制8255a的片选与内部奇存器选择;p0口连接8255a的D端口,并由它的PA口驱动7段led, PB口连接键盘,并做为I/O口与c51通信,以实现相应显示变化。

四,基本原件及其原理单片机微型计算机简称单片机,是指在一块芯片体上集成了中央处理器CPU、随机存储器RAM、程序存储器ROM或EPROM、定时器/计数器、中断控制器以及串行和并行I/O接口等部件,构成一个完整的微型计算机。

8255与多位LED数码管的显示

8255与多位LED数码管的显示
A组控制 部件 A组端口 A(8) I/O PA7~PA0
双向数据总线 D7~D0
8位内部 数据总 线缓冲 器 数据总线
A组端口 C上半部 (4)
I/O PC7~PC4
B组端口 C上半部 下半部 (4) RD WR A1 A0 RESET
I/O PC3~PC0
读/写控 制部件
B组控制 部件
B组端口 B(8)
2、编程并全速或单步运行。 3、全速运行时按动键盘,观察数码管的变化。 4、编写实验报告。
七、实验程序流程图 初始化8255
取字形码
显示输出
九、实验程序
assume cs:code code segment org 100h start: nop nop start1: mov cx,08h ;设置循环次数 mov bx,00feh ;bh=0000 0000,bl=1111 1110B mov dx, 04a6h ;控制寄存器地址 mov ax,80h ;设置为A口输出,B口输出 out dx, ax ;8255的初始化 disp: mov di, offset segcod ;取偏移地址送入di寄存器 mov dx, 04a0h ;A口地址 mov al, bh ;aL=0000 0000 mov ah, 00h ;ah=0000 0000 add di, ax ;得到第一个变量(字形码)3fh的偏移地址 mov al, cs:[di] ;将3fh送入al寄存器 out dx, al ;将字形码从A口输出
本实验中8255的地址分配如下: 端口A 04A0H 端口B 04A2H 端口C 04A4H 控制口 04A6H
mov dx, 04a2h ;B口地址 mov al, bl ;al=1111 1110B out dx, al ; al的内容从B口输出,使LED1有效 push cx ; 循环次数入栈保护 call delay pop cx ; 循环次数出栈 inc bh ;bh内容加1,指向第二个字形码 rol bl,1 ; bl=1111 1110B循环左移,使下个位控有效 loop disp jmp start1 delay: mov cx,43h ;延时程序,将此数改为最大观察结果 delay1: nop nop loop delay1 ret segcod db 3fh,06h,5bh,4fh,66h,77h code ends end start

8位LED数码管动态显示电路的仿真测试

8位LED数码管动态显示电路的仿真测试

数字电子技术仿真实验实验题目:8位LED数码管动态显示电路院系:电子与信息工程学院专业:电子信息工程班级:2010级X班老师:XXX姓名:XXX学号:XXXXXXXXXX8位LED数码管动态显示电路的仿真测试一,实验目的:(1)掌握LED数码管动态显示的工作原理。

(2)掌握BCD—七段显示译码器74LS48,3—8线译码器74LS138的应用。

(3)掌握MultiSIM中LED数码管的应用。

二,实验原理:LED数码管有静态显示和动态显示2种显示方式。

LED数码管工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地,且使用一片译码驱动芯片驱动一位七段LED数码管进行数码显示。

LED数码管工作于动态显示方式时,使用一片译码驱动芯片驱动多位七段LED数码管,有控制电路控制各位显示器分别进行数码显示,即每个显示器按照不同的时间轮流使用这片译码驱动芯片,从而是电路更加简单。

三,实验设配及元器件:四,仿真结果:1,显示相同数码电路的仿真测试:2,显示不同数码电路的仿真实验:(1)当频率为100HZ时:LED数码管显示的数码及显示的顺序:(2)当频率为100KHZ时:LED数码管显示的数码及显示的顺序:五,实验总结:通过此次实验,不仅让我对仿真更加熟悉,也加深了我对数字电子电路的理解。

在仿真过程中,我遇到了很多困难,经过思考和尝试,终于将实验做成功了。

例如刚开始我不知道字符信号发生器再那里,于是就在原件中一个一个的试,很快就在工具栏上的图标中找到了。

还有数码管,在元件库中找了很久,终于在Indicators下面的HEX_DISPLAY中才找到。

电路图连接完后,因为字符信号发生器没有接地,数码管始终不能显示。

改正后,刚开始又始终只有一位数码管显示,经过思考,原来是频率低了,当我把频率变大后,循环扫描的速度变得足够快,就可以看到8位LED数码管的持续发光。

交通灯设计-8255-8254(附连线图和源代码)

交通灯设计-8255-8254(附连线图和源代码)

西安郵電學院硬件课程设计报告题目:微机原理与接口课程设计;^院系名称:计算机学院专业名称:软件工程班级:软件0802学生姓名:王晶晶学号(8位): 04085047指导教师:刘军设计起止时间:2011年05月23日~2011年05月27日[一、设计目的通过可编程并行接口芯片8255A和可编程定时器/计数器芯片8253/8254以及中断控制器 8259实现十字路口交通灯的模拟控制,进一步掌握并行接口和定时器/计数器及数码管控制的实际应用。

二、设计内容1.用试验台提供的发光二极管(红绿黄各两支,共六支)作为南北路口(红绿黄各一支)和东西路口(红绿黄各一支)的模拟交通灯。

2.用可编程并行接口芯片8255A控制模拟交通灯的亮与灭和数码管的倒计时显示。

3.用可编程定时器/计数器芯片8253实现模拟交通灯亮与灭的时间延迟控制。

4.用数码管作为模拟交通灯亮与灭的时间延迟控制的倒计时显示。

'5.用汇编语言编程使六个灯按交通灯变化规律“亮/灭”。

交通灯变化规律要求:① 南北路口的绿灯,东西路口的红灯同时亮30秒,且数码管30秒倒计时显示。

② 南北路口的黄灯闪烁3秒(三亮三灭),同时东西路口的红灯继续亮,且数码管3秒倒计时显示。

③ 南北路口的红灯,东西路口的绿灯同时亮20秒,且数码管20秒倒计时显示。

④ 南北路口的红灯继续亮,同时东西路口的黄灯闪烁3秒(三亮三灭),且数码管3秒倒计时显示。

⑤ 转①重复⑥按压“东西紧急键”,则东西方向绿灯,南北方向红灯;再次按压“东西紧急键”,解除东西紧急通行状态。

(“东西紧急键”可是键盘键,亦可是逻辑开关键)⑦按压“南北紧急键”,则南北方向绿灯,东西方向红灯;再次按压“南北紧急键”,解除南北紧急通行状态。

(“南北紧急键”可是键盘键,亦可是逻辑开关键)"⑧按 <ESC>键退出程序。

备注:1、按键用 8255A 芯片的 PC 口实现或用键盘模拟实现。

2、8253定时到可以通过8259,用中断的方式实现定时器。

基于8255的8LED显示录音回放机设计报告

基于8255的8LED显示录音回放机设计报告

通信与信息工程学院2016/2017学年第二学期软件设计实验报告模块名称51单片机的软件设计专业通信工程学生班级学生学号学生姓名指导教师梅霆林建中叶玲报告内容一、设计要求本软件课程设计是在理论课程的基础上,重点培养学生的动手能力,通过理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作。

在此基础上根据实验大纲提供的题目,任选一题,实现其功能。

有能力的同学可以超出题目要求发挥设计。

根据提供的参考工程,在proteus平台自己重新画出实验所需要的电气原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取、原理图的电气连接、程序的编写编译以及运行,并能查出其错误等。

发挥部分在完成本人选题的前题下,具有新内容的自主发挥,并取得良好效果。

录音机类实验中需要录取的信源,可以用单片机或者信号发生器产生。

基本要求:1 把需要录取的信号用AD转换器采样并存储在SRAM中。

2 在一组数码管或LCD上显示采样速率和录音时间(秒),以及信号相关参数。

3 用D/A转换器回放录音信号,通过喇叭过模拟示波器显示。

4 在一组数码管或LCD上显示回放的播放时间或信号强度。

发挥部分:1 用功能键可分别设定录音和放音的采样速率。

2 多段录音管理。

3 任意组合播放。

动态显示格式:自定二、设计流程图键盘流程图三、设计原理(一)Proteus以及Keil软件使用方法(1)ProteusProteus提供了30多个元器件库、7000余种元器件。

可以实现数字电路、模拟电路及微控制器系统与外设的混合电路系统的电路仿真、软件仿真、系统协同仿真和PCB设计等功能。

(2)Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

应用Keil进行软件仿真开发的主要步骤为:①编写源程序并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;②选择菜单Project-New Project…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);③工程保存后会立即弹出一个设备选择对话框,选择CPU(89c51)后点确定返回主界面;④工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开;⑤选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group ‘Source Group1’”;⑥出现一个对话框,加入之前编写好的源文件,点close返回主界面;⑦展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件;⑧选择工程管理窗口的Target1,再选择Project-Option for Target‘Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框;⑨在Output选项卡中选中“Creat Hex Fi”;⑩工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。

使用8255A控制led

使用8255A控制led

单片机第五周任务一.实验要求8255A的A口作为输出功能,连接8盏LED灯。

8255A的B口作为输入功能,连接8个按钮。

当B口的某一按钮按下,对应的LED灯就点亮同时。

同时,数码管上显示对应的按键号。

如B口按钮1按下,1号LED灯就点亮,8段数码管显示1.二.硬件分析三.代码分析#include<reg52.h> //单片机头文件#include<absacc.h> //扩展地址解析头文件#define PAC XBYTE[0x7FFF] //控制地址定义#define PA XBYTE[0x7CFF] //A口地址定义#define PB XBYTE[0x7DFF] //B口地址定义#define PC XBYTE[0x7EFF] //C口地址定义#define uint unsigned int#define uchar unsigned charsbit RST=P1^0; //复位引脚定义sbit RD1=P3^7; //读引脚定义sbit RW=P3^6; //写引脚定义unsigned char codeTab[]={0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//共阳数码管码表void main(void) //主函数{RST=1; //复位置1RST=0; //复位置0PAC=0x82; //设控制字PB=0xff;PA=0xff;P1=0xff;while(1){switch(PB){case 0xfe:{P1=Tab[0];PA=0xfe;break;}case 0xfd:{P1=Tab[1];PA=0xfd;break;}case 0xfb:{P1=Tab[2];PA=0xfb;break;}case 0xf7:{P1=Tab[3];PA=0xf7;break;case 0xef:{P1=Tab[4];PA=0xef;break;}case 0xdf:{P1=Tab[5];PA=0xdf;break;}case 0xbf:{P1=Tab[6];PA=0xbf;break;}case 0x7f:{P1=Tab[7];PA=0x7f;break;}case 0xff:{P1=0xff;PA=0xff;break;}}}}四.我对8255A的理解8255A是一种可编程的I/O接口芯片,可以与MCS-51系统单片机以及外设直接相连,广泛用作外部并行I/O扩展接口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京邮电大学学年第学期课程设计实验报告题目基于8255的8LED显示的动态显示器专业通信工程学号姓名指导老师实验日期年月日题目:基于8255的8LED显示的动态显示器一,实验目的和要求1,Proteus软件的MCS51单片机仿真学习2,根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的电器原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取,原理图的电气连接,程序的编写编译以及运行,并能查出其错误等。

基本要求:1. 用数码管正常显示数字“12345678”。

2. 通过按键可改变显示方式。

3. 设计显示屏的动态效果,用10个按键,每键对应一种滚动技术。

4. 基于8255口是指显示和键盘都由8255的IO口控制发挥部分:1 设计所有动作的联合效果。

2 设计二个变速按键,可多级改变滚动速度。

3 设计一台魔术电子钟,采用自动变换,随机组合,数据每10秒变换一次。

动态显示格式:1 静止2 整体闪烁3 单字闪烁4 整体向前、向后滚动5 单字移动6 两边向中间压缩7 中间向两边扩张8 上下压缩9 文字上下滚动10组合动作(每一字符执行上述一个动作,并同时运动)二,实验仪器微型计算机三,实验原理基于8255的8LED显示的动态显示器,是由8255a做键盘控制口连接c51,并驱动8位7段数码管实现相应显示功能。

具体的,c51,p1口直接进行led数码管的位控制;p2口经74HC573译码后控制8255a的片选与内部奇存器选择;p0口连接8255a的D端口,并由它的PA口驱动7段led, PB口连接键盘,并做为I/O口与c51通信,以实现相应显示变化。

四,基本原件及其原理单片机微型计算机简称单片机,是指在一块芯片体上集成了中央处理器CPU、随机存储器RAM、程序存储器ROM或EPROM、定时器/计数器、中断控制器以及串行和并行I/O接口等部件,构成一个完整的微型计算机。

目前,新型单片机内还有A/D及D/A 转换器、高速输入/输出部件、DMA通道、浮点运算等特殊功能部件。

由于它的结构和指令功能都是按工业控制设计要求设计的,特别适用于工业控制及其数据处理场合,因此,确切的称谓是微控制器,单片机只是习惯称呼。

51单片机引脚图如下:(1)单片机的特点1)有优异的性能价值比。

2)集成度高、体积小、有很高的可靠性。

单片机把各个功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。

另外,其体积小,对于强磁场环境易于采取措施,适合于恶劣环境下工作;也易于产品化。

3)控制功能强。

为了满足工业控制的要求,一般单片机的指令系统中均有及其丰富的转移指令、I/O口逻辑操作及位处理指令。

一般来说,单片机的逻辑控制功能及运行速度高于同意档次的微机。

4)单片机的系统扩展和系统配置都比较典型、规范,而且非常容易构成各种规模的应用系统。

(2)单片机并行I/O接口的扩展单片机与外部交换信息是通过I/O接口电路来实现的。

A T89C51单片机本身有4个8位的并行I/O口P0-P3,但实际使用时往往再增加些I/O口,以便与外部设备交换数据。

AT89C51单片机外部RAM和扩展I/O接口是统一编址的。

用户可以把外部64KB RAM空间的一部分作为扩展I/O接口地址空间,每一个I/O接口相当于一个RAM存储单元,访问外部RAM 存储单元就像访问外部I/O 接口,即用“MOVX ”指令对扩展I/O 接口进行输入输出操作。

查询式键盘的接口电路 查询式键盘属于独立式键盘,键盘的各个按键之间彼此是独立的且是最简单的键盘电路。

每个键地接入一根数据输入线。

如图所示。

注意:由于每一个按键均需要一根I/O 口线 ,当键盘按键数量比较多时,需要的I/O 口线也较多,因此独立式键盘只适合于按键较少的应用场合。

一般情况下,按键数等于占用I/O 端口数。

查询式键盘的结构图如图所示:D3D430D529D628D727RD 5WR 36A09A18RESET 35CS6PA3PA440PA539PA638PA737PB018PB119PB220PB321PB422PB523PB624PB725PC014PC115PC216PC317PC413PC512PC611PC7108255A查询式键盘的接口电路查询式键盘可以工作在多种方式下,中断方式、程序查询方式、定时查询发送和中断查询方式。

在中断模式下,按键的数量受到外部中断源的限制。

在有特殊需要的场合,还可以借用内部的定时器中断。

所以在这种模式下,按键的数目小于外部中断源和单片机定时器数量之和。

程序查询和定时查询类似,都是通过读I/O 状态,当有键被按下时相应的I/O 口线变为低电平,而未被按下的键对应的I/O 口线保持为高电平,这样通过读I/O 口状态可判断是否有键按下和哪一个键被按下。

7SEG-MPX8-CA-BLUE 的基本参数7SEG-MPX8-CA-BLUE 为蓝色共阳极8位七段数码管五,仿真软件的使用1.Keil软件的使用:首先正确安装keil软件—>打开keil—>project—>new Uvision project—>为工程取名字,并选择工程要保存的路径,建议每个工程新建一个文件夹,方便文件管理—>出来一个对话框,是选择芯片的,你根据你的芯片公司和型号来选择就行了,比如:最常用的at89c51,点atmel,找到at89c51,点OK后会出来一个对话框,问你是否添加启动文件,点“是”—>这样就建好了一个工程,点File菜单下New新建文件—>先保存文件,点保存按钮后出来路径框,取名字后缀是.c或者.h,点保存—>接下来在左边project下把Target1点开,在Source Group 1上右键,点击Add File to Group 'Source Group 1'—>在弹出的框中点刚刚保存的文件,然后点Add,关闭对话框,左边project框中可以看到文件已经添加—>在开始之前还是先来配置一下keil环境,点击工具栏品字图标左边像魔棒一样的按钮—>接下来的配置比较复杂,我用图来解释,Target项目下只改一个晶振的值,Output下要点击生产HEX文件,Debug下左边是keil仿真调试配置,右边是程序下载到芯片调试配置,看你是怎么用了。

—>完工,可以编程调试。

2.proteus软件的使用:新建文件,查找元件,并添加。

画好电路图后,添加用keil生成的hex文件,即可运行。

六,实验数据1.实验连接图2.实验结果图(初始状态)0U1U2RP1U7C111R51R2R3R4R51整体闪烁2偶数闪烁3循环左移4单字右移5消融6展开7快速左移8全功能0复位93.显示功能4.实验程序清单/*--------------------库文件--------------------------*/#include<reg52.h>#include<absacc.h>/*---------------------宏定义-------------------------*/#define uint unsigned int#define uchar unsigned char/*----------------芯片端口地址定义---------------------*/#define COM8255 XBYTE[0X7FFF] //8255的命令口#define PA8255 XBYTE[0X1FFF] //8255的PA#define PB8255 XBYTE[0X3FFF] //8255的PBuchar code du_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //8段共阳极数码管显示码值uchar code bit_code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管显示的位值/*--------------定义系统变量--------------------------------*/bit flag=0; //定义状态标志位uchar value=0,wei;uchar count;/*------------------------------------------*//*形式参数:void *//*返回值:void *//*函数描述:延时函数*//*------------------------------------------*/void delayms(uchar x) //ms延时函数{uchar y;for(;x>0;x--)for(y=150;y>0;y--) ;}void keyscan(){uchar i=0,j=0;PB8255=0xf0;if(PB8255!=0xf0){delayms(1);if(PB8255!=0xf0){switch(PB8255){case 0xe0:j=1; break;case 0xd0:j=2; break;case 0xb0:j=3; break;case 0x70:j=4; break;}PB8255=0x0f; //反转switch(PB8255){case 0x0e:i=0;break;case 0x0d:i=1;break;case 0x0b:i=2;break;case 0x07:i=3;break;}value=i*4+j-1;flag=1;if(value==2){wei++;if(wei>=9)wei=1;}while(PB8255!=0x0f); //按键弹起}}}/*************************状态一-静止****************************/ void state1(){uchar i;while(value==0) //判断是否为状态1{for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(1); //延时}}}/**************************状态二-整体闪烁***************************/ void state2(){uchar i=0,j=0;while(value==1) //判断是否为状态2{for(j=0;j<50;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}for(j=0;j<50;j++){P1=0x00;keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(20);}} //延时}/******************************状态三-单字闪烁***************************/ void state3(){uchar i=0,j=0;while(value==2) //判断是否为状态3{for(j=0;j<50;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}for(j=0;j<50;j++){for(i=1;i<9;i++){if(i==wei)P1=0x00;elseP1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}}}/*************************状态四-整体向前、向后滚动*************************/ void state4(){uchar i=0,j=0,z=0;while(value==3) //判断是否为状态4{for(z=0;z<8;z++){for(j=1;j<120;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[(i+z)%8+1]; //输入段选码值keyscan();if(flag==1) //扫描键盘{flag=0;return; //有键按下返回}delayms(2);} //延时}}}}/***************************状态五-单字移动*******************************/ void state5(){uchar i=0,j=0;while(value==4) //判断是否为状态5{for(j=1;j<9;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[j]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(1500); //延时}}}}/************************状态六-两边向中间压缩*************************/ void state6(){uchar i=0,j=0;;while(value==5) //判断是否为状态6 {for(j=1;j<100;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值delayms(3);keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}delayms(500); //延时for(j=1;j<100;j++){for(i=2;i<5;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i-1]; //输入段选码值delayms(3);keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}for(i=5;i<8;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i+1]; //输入段选码值delayms(3);keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}delayms(500); //延时for(j=1;j<100;j++){for(i=3;i<5;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i-2]; //输入段选码值delayms(3);keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}for(i=5;i<7;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i+2]; //输入段选码值delayms(3); //延时keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}delayms(500); //延时for(j=1;j<100;j++){P1=bit_code[4]; //输入位选码值PA8255=du_code[1]; //输入段选码值delayms(10);//输入位选码值P1=bit_code[5]; //输入段选码值PA8255=du_code[8];delayms(10); //延时keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}}/**************************状态七7-中间向两边扩张***************************/ void state7(){uchar i=0,j=0;;while(value==6) //判断是否为状态7{for(j=1;j<100;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值delayms(3); //延时keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}delayms(500); //延时for(j=1;j<100;j++){for(i=1;i<4;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i+1]; //输入段选码值delayms(3); //延时keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}for(i=6;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i-1]; //输入段选码值delayms(3); //延时keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}delayms(500); //延时for(j=1;j<100;j++){for(i=1;i<3;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i+2]; //输入段选码值delayms(3);keyscan(); //扫描键盘if(flag==1){flag=0; //有键按下返回return;}}for(i=7;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i-2]; //输入段选码值delayms(3); //延时keyscan();if(flag==1){flag=0;return; //有键按下返回}}}delayms(500);for(j=1;j<100;j++){P1=bit_code[1]; //输入位选码值PA8255=du_code[4]; //输入段选码值delayms(10); //延时P1=bit_code[8]; //输入位选码值PA8255=du_code[5]; //输入段选码值delayms(10);keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}}}}/*************************状态八函数-全功能**************************/ void state8(){uchar i=0,j=0,z=0;while(value==7) //判断是否为状态8{for(z=0;z<8;z++){for(j=0;j<50;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[(i+z)%8+1]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}P1=0x00;keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(1500); //延时}}}void state9(){uint i=0,j,z;while(value==8){for(j=0;j<200;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘delayms(2);if(flag==1){flag=0;return; //有键按下返回}}}for(z=1;z<8;z++){for(j=0;j<50;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘delayms(2);if(flag==1){flag=0;return; //有键按下返回}}}for(j=0;j<50;j++){P1=0x00;keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(20);}}for(z=0;z<8;z++){for(j=0;j<50;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}for(j=0;j<50;j++){for(i=1;i<9;i++){if(i==1)P1=0x00;elseP1=bit_code[i-1]; //输入位选码值PA8255=du_code[i]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(2); //延时}}}for(z=0;z<8;z++){for(j=1;j<120;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[(i+z)%8+1]; //输入段选码值keyscan();if(flag==1) //扫描键盘{flag=0;return; //有键按下返回}delayms(2);} //延时}}for(j=1;j<9;j++){for(i=1;i<9;i++){P1=bit_code[i-1]; //输入位选码值PA8255=du_code[j]; //输入段选码值keyscan(); //扫描键盘if(flag==1){flag=0;return; //有键按下返回}delayms(500); //延时}}}}void Initial(){COM8255=0x80; //输入输出方式设置定义8255的A口为输出BC 为标准IO PA8255=0XFF;P1=0X00;}void main(){Initial(); //系统初始化while(1){keyscan();state1(); //查询状态一state2(); //查询状态二state3(); //查询状态三state4(); //查询状态四state5(); //查询状态五state6(); //查询状态六state7(); //查询状态七state8();state9();}}七.实验小结:通过本次试验,我对proteus和keil软件的应用有了进一步认识,并且通过对c51的编程,复习巩固了c语言的相关知识。

相关文档
最新文档