基于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扩展接口。

基于8255的LCD显示频率计设计

基于8255的LCD显示频率计设计

2013 /2014 学年第一学期课程设计II实验报告模块名称基于8255LCD频率计专业通信工程学生班级学生学号学生姓名指导教师需要程序和仿真电路图请联系QQ:643233819报告内容实验原理图及程序代码1.硬件部分电路设计由于本次实验设计的是一个单片机的基于8255的LCD的频率计实验,通过使用定时器T0产生1s钟的定时,同时测量T1口输入的方波的低电平的次数,就可以得出所输入信号的频率,然后将测得的频率由锁存器连接到8255,再通过8255扩展连接到LCD液晶显示器。

完整电路原理图如下:2.软件部分设计#include <reg52.h>#include <intrins.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define PA XBYTE[0x007c]#define PB XBYTE[0x007d]#define COM XBYTE[0x007f]uchar code tab1[]="F:";uchar code tab2[]="C:";uchar disp1[]="0000HZ";uchar disp2[]="0.00ms";sbit key1=P1^6;sbit key2=P1^7;uchar count,i;uchar time;unsigned long freq;sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit lcden=P1^2;void delay(uchar z) //延时函数{uchar x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}void write_com(uchar com) //写命令{lcdrs=0;PA=com;delay(5);lcden=1;delay(2);lcden=0;}void write_dat(uchar dat) //写数据{lcdrs=1;PA=dat;delay(5);lcden=1;delay(5);lcden=0;}void init_lcd() //lcd初始化{lcden=0;// lcdrs=0;lcdrw=0;write_com(0x38);/****工作方式设置***/write_com(0x0c);/****显示状态设置***/write_com(0x06);/****输入方式设置***/write_com(0x01);/****清除屏幕显示***/write_com(0x80);}void display() //显示函数{if(freq>0&&freq<10000){disp1[0]=freq/1000+'0';disp1[1]=freq/100%10+'0';disp1[2]=freq/10%10+'0';disp1[3]=freq/2%10+'0';if(freq<1000){disp2[0]=1000/freq+'0';disp2[2]=10000/freq%10+'0';disp2[3]=100000/freq%10+'0';}else{disp2[0]=1000/freq+'0';disp2[2]=10000/freq+'0';disp2[3]=100000/freq%10+'0';}write_com(0x82);for(i=0;i<6;i++){write_dat(disp1[i]);delay(2);}write_com(0x80+0x42);for(i=0;i<6;i++){write_dat(disp2[i]);delay(2);}}}void main(){COM=0x80;init_lcd();write_com(0x80);for(i=0;i<2;i++){write_dat(tab1[i]);delay(5);}write_com(0x80+0x40);for(i=0;i<2;i++){write_dat(tab2[i]);delay(5);}write_com(0x80+0x49);TMOD=0x51; //T0定时,T1计数TH1=0;TL1=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;ET1=1;EA=1;while(1){if(key2==0){delay(5);if(key2==0){TR1=TR0=1;}}else{display();}}}void timer0() interrupt 1 //T0中断,定时1s {TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;TR1=0;TR0=0;freq=(TH1*256+TL1);// display();TH1=0;TL1=0;}}仿真测试1.开始阶段输入第一组数据:输入第二组数据:1.按下按钮以后第一组数据:第二组数据:实验小结和体会本次的课程设计是基于8255的LCD显示的频率计的设计。

[转载]基于8255的LCD动态显示器设计

[转载]基于8255的LCD动态显示器设计

基于8255的LCD动态显示器设计一、设计要求能够学会利用Proteus软件的MCS51单片机仿真学习,根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的电气原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取、原理图的电气连接、程序的编写编译以及运行,并能查出其错误等。

二、实验内容设计一基于8255的LCD动态显示器三、实验要求1.用数码管或LCD正常显示数字“12345678”。

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

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

另注,实验发挥部分:1.设计所有动作的联合效果。

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

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

动态显示格式:1.静止2.整体闪烁3.单字闪烁4.整体向前、向后滚动5.单字移动6.两边向中间压缩7.中间向两边扩张8.上下压缩9.文字上下滚动10.组合动作(每一字符执行上述一个动作,并同时运动)四、实验过程本次课程设计是在理论课程的基础上,目的在于培养我们的动手能力,通过电路设计、理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,并可能结合实际的实验板进行下载测试。

在此基础上根据实验大纲的要求,我们以两人一组的形式在“51单片机课程设计选题表”中任选一空(各组间不能重题),实现其功能。

鉴于我们组对于8255通用可编程器件的了解,我们选择基于8255的LCD显示的动态显示器设计这一课题。

在考虑本次设计过程中,依据设计基本要求,并且基于8255通用可编程器件等条件,我们把8255器件用来扩展I/O口,以备外接一4X4键盘,以满足通过10个按键来控制10种动态显示,以及通过该I/O口外接一LCD显示器(当然,实验中我们发现不用8255扩展I/O口,单片机AT89C51的四个I/O端口已能满足该实验需要)。

实验四 8255与LED数码管的显示

实验四 8255与LED数码管的显示

实验四8255a与LED数码管的显示一. 实验目的掌握8255A的编程原理与LED数码管的显示方法。

二. 实验环境硬件环境:奔3以上处理器,512MB以上内存空间软件环境:windowsXP以上操作系统,emu8086编译环境,Proteus7.5sp3。

三.实验内容与完成情况1.仿真电路图2.实验原理(1)8255A可编程I/O接口芯片具有三种工作方式:方式0(简单的输入输出方式)、方式1(选通式输入/输出方式)和方式2(双向数据传送方式)。

它分别能够控制把CPU的控制命令或输出数据送至相应的端口,也可以控制把外设的状态信息或输入的数据通过相应端口送至CPU。

(2)8255芯片具有三个数据端口A、B和C。

每个端口都为8位,可以由编程来选择作为输入端口或输出端口。

在一般情况下,常利用A、B两个端口来完成与外设之间的数据交换过程,而利用C端口来完成与外设的状态控制信息的交换过程。

3.实验过程首先打开电源,由8086向8255a发出指令,选定8255的工作方式,然后,读A口数据,高四位清零,取LED灯偏移地址。

当4个按钮的开关情况发生变化时,电信号的变化被读入8255a,经一系列的信号处理,从B口输出到LED灯显示数字。

4.编程调试程序data segment; add your data here!PORTD EQU 66H ;CPU-8255控制寄存器PORTA EQU 60H ;8086 A1接8255 A0;A2 接8255A1PORTB EQU 62HPORTC EQU 64HREGIS EQU 10010000B ;A IN, B OUT,AB口工作方式0LED DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H data endsstack segmentdw 128 dup(0)stack endscode segmentASSUME CS:code, DS:dataBEGIN:MOV DX,PORTD ;设置8255工作方式MOV AL,REGIS ;control byteOUT DX,ALG1: MOV DX,PORTAIN AL,DX ;读A口数据AND AL,00001111B ;高四位清零;数码管译码MOV BX,OFFSET LEDXLAT ;取LED表;-------------PUSH CXMOV CX,40H ;延时DELAY:LOOP DELAYPOP CX;-------------MOV DX,PORTBOUT DX,ALJMP G1code endsend BEGIN ; set entry point and stop the assembler.四.出现的问题1.不知道如何选定8255a的A,B,C三个端口的工作状态;2.对74ls183的电信号处理机制不清楚。

8位动态LED数码管显示实验(精)

8位动态LED数码管显示实验(精)

8位动态LED数码管显示实验(精)8位动态LED数码管显示实验2008-03-18 18:048.1 实物图与原理图本实验仪配置带8位动态扫描显示模块一个。

实物图如下:为减少IO的使用,我们采用串入并出芯片CD4094来扩展了IO 口,即采用3个IO来实现数据的传输。

原理图如下:所以,我们占用3个IO来传输数据,8个IO来进行8个LED数码管的位选。

在本实验仪中链接管教分布如下:STK-----P2.5DAT-----P2.6CLK-----P2.7B0、B1、B2、B3、B4、B5、B6、B7接P0口(P0.0 P0.1 P0.2 P0.3 P0.4 P0.5P0.6 P0.7)由于上一节已经讲述了CD4094驱动一位LED数码管的问题,这里我们讲如何来扫描8位数码管。

8.2 LED动态显示原理根据原理图管脚连接,我们知道P0口控制了8个LED数码管的位选中,所以如果想让8个数码管都亮起来,我们可以逐位扫描8位数码管。

动态显示原理:原理上同一时刻只有一位LED是点亮的,但只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是常说的动态扫描显示。

动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。

如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,所以一般均取几个ms左右为宜。

8.3 DG3000 动态显示头文件display_s.h//----------------------------------------------------------//程序作用:显示头文件display_s.h//----------------------------------------------------------#ifndef _display_#define _display_#includesbit SDA=P2^6; //定义显示管脚sbit CLK=P2^7;unsigned char data display_bit;unsigned char codeled[20]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x 89,0x8C };//定义段码//延时程序void delay(unsigned int k){ unsigned int i,j;for(i=0;i<k;i++)< bdsfid="131" p=""></k;i++)<>for(j=0;j<100;j++);}//数据传输void send(unsigned char a){unsigned char i;for(i=0;i<8;i++){if(_crol_(a,i)&0x80)SDA=1;elseSDA=0;CLK=0;CLK=1;}}//显示程序 8位LED数码管扫描void display(unsigned chardisplay_buffer[8]){unsigned char i,k;display_bit=0xfe;for(i=0;i<8;i++){k=led[display_buffer[i]];send(k);P0=display_bit;delay(0x01);P0=0xff;display_bit=_crol_(display_bit,1);}display_bit=0xfe;8.4 8位数码管动态显示01234567(C51程序)//----------------------------------------------------------//程序作用:动态扫描显示01234567//---------------------------------------------------------- #include#include //调用显示头文件main(){unsigned chara[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6, 0x7};//显示01234567 while(1){display(a); //显示数据}}。

基于8255的LCD显示简易电压表设计

基于8255的LCD显示简易电压表设计

AU瑯唸上唆2013/2014学年第一学期课程设计II 实验报告模块名称关于51单片机设计(proteus)专业通信工程学生班级学生学号学生姓名指导教师报告内容第一部分实验目的与要求本课程设计就是在理论课程的基础上,重点培养学生的动手能力,通过理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,为下一部结合实际的硬件系统设计准备条件。

实验要求:数字电压表(AC/DC)设计基本要求:了解电压表的工作原理。

设计一个直流电压测量器,测量范围0、01V-3V,用LED数码管/LCD屏显示测量值,显示精度0、001用键盘选择测量范围(分档)发挥部分:交流电压测量,被测频率1KHz-10KHz (0、1-3V)考虑交流测量的附加电路。

显示格式:LED 数码管/LCD屏显示参数基于8255 口就是指显示与键盘都由8255的10 口控制根据提供的参考工程,在proteus平台自己重新画出实验所需要的电气原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取、原理图的电气连接、程序的编写编译以及运行,并能查出其错误等。

第二部分实验工具及实验器件1. Proteus 软件Proteus 就是英国Labcenter 公司开发的电路及单片机系统设计与仿真软件。

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

Proteus就是目前唯一能对各种处理器进行实时仿真、调试与测试的EDA工具,真正实现了在没有目标原型时就可对系统进行调试、测试与验证。

Proteus 软件大大提高了企业的产品开发效率,降低了开发风险。

由于Proteus 软件逼真、真实的协同仿真功能,它也特别适合于作为配合单片机课堂教学与实验的学习工具。

Proteus 软件提供了30多个元器件库、7000余种元器件。

单片机扩展8255控制LED数码管动态显示仿真教学

单片机扩展8255控制LED数码管动态显示仿真教学
可 以直接 接地 ;8 2 5 5的读 写控制 引脚 分 别接 5 1 单 片机 的 面 和 一 WR;8 2 5 5的 P A、P B、P C 口按 照使
个位选 引脚分 别连接 数码管 的公共端 ,位选 引脚 以
足够快 的扫描速 度配 合段码 引脚控制 若干个数 码管
逐个循 环显 示 ,给人 的感觉是 这若干 个数码 管 同时
9 6期 )
济 南 职 业 学 院 学 报
F e b . 2 0 1 3 No . 1( S e r i a l N o . 9 6
单 片机扩展 8 2 5 5 控制 L E D 数码管动态 显示 仿真教学
刘 文 光 张 铭 铭
( 1 . 济 南职 业 学院 ,山东 济 南 2 5 0 1 0 3 ; 2 . 青岛 市 中心医 院 ,山东 青岛 2 6 6 0 4 2 )
8 2 5 5 数据 线 D O — D 7与 5 l 单片机 P 0口相 连 ;8 2 5 5 两根地 址 线 Al 和A 0 可 通过 7 4 L S 3 7 3 与5 l 单 片机
眼的视 觉暂 留现 象和数码 管 的余辉效 应 n ,用 若干
P O . 1 和P 0 . 0相 连 ;8 2 5 5片选 信 号 引脚 低 电平 有 效
关键词 :8 2 5 5 ;时序 图 ;动态显示 ;仿 真教 学 中图分类号 i G7 1 文献标识码 :A 文章编号 i 1 6 7 3 -4 2 7 0( 2 0 1 3) 0 1 —0 0 8 2 —O 3


引言
用需要与外 设相连 ;8 2 5 5的复位 引脚 高 电平有 效 、 VC C接 电源 、G N D接地 。教师在讲解这部分内容时 需要着重阐明如何通过寻址设定 8 2 5 5的控制 字和读

汇编语言实现通过8255A和4个开关控制实现8个LED灯全亮、全灭、从左至右、从右至左跑马灯式点亮

汇编语言实现通过8255A和4个开关控制实现8个LED灯全亮、全灭、从左至右、从右至左跑马灯式点亮

汇编语⾔实现通过8255A和4个开关控制实现8个LED灯全亮、全灭、从左⾄右、从右⾄左跑马灯式点亮汇编代码及解释如下:1 .MODEL TINY2 .STACK 1003 .DATA4 .CODE5 start:6 ; set segment registers:7 mov bl,0feh ;先将bl通⽤寄存器的值置为1111 1110(实验室的实验箱中电路没有设置反相器,故设为7个1,1个0)8 mov dx,273h ;将273h送⼊地址寄存器dx,根据课本P169中8255A的端⼝操作表,由于273h中3对应0011,故A1A0=11,对应数据总线->控制寄存器,即为写⼊控制字做准备9 mov al,10000010b ;将1000 0010写⼊al通⽤寄存器中10out dx,al ;将1000 0010设为8255A的控制字,根据课本P171中8255A的⽅式选择控制字可知D7...D1D0=1...10,故B⼝输⼊C⼝输出(以上四⾏为8255A的初始化程序)11 go: mov al,0ffh ;初始化al通⽤寄存器,初始化其值为1111 111112 mov dx,272h ;将272h送⼊地址寄存器dx,根据课本P169中8255A的端⼝操作表,由于272h中2对应0010,故A1A0=10,对应C⼝13out dx,al ;将al中的数据写⼊dx对应端⼝(即将al中数据写⼊C⼝)14 mov dx,271h ;将271h送⼊地址寄存器dx,根据课本P169中8255A的端⼝操作表,由于271h中1对应0010,故A1A0=01,对应B⼝15in al,dx ;将al中的数据读⼊dx对应端⼝(即将al中数据读⼊B⼝)16 and al,0fh ;对al寄存器中的8位值进⾏and(与)运算,只取后4位17 cmp al,0eh ;cmp⽐较al中的值和0e,若相等,则zf标志位为1,执⾏jz指令18 jz st119 cmp al,0dh20 jz nd121 cmp al,0bh22 jz rd123 cmp al,07h24 jz th125 jmp go26 st1: mov bl,0feh27 mov dx,272h28 mov al,00h29out dx,al30 jmp go31 nd1: mov bl,0feh32 mov dx,272h33 mov al,0ffh34out dx,al35 jmp go36 rd1: mov dx,272h37 mov al,bl38out dx,al39 rol bl,1 ;rol中的l代表left,rol为循环左移指令,移位后经过ffff次loop再次jmp到go段重新执⾏,下同40 mov cx,0ffffh41 lo1:loop lo142 jmp go43 th1: mov dx,272h44 mov al,bl45out dx,al46 ror bl,147 mov cx,0ffffh48 lo2:loop lo249 jmp go50 end start。

毕业设计基于单片机的led显示屏的动态显示[管理资料]

毕业设计基于单片机的led显示屏的动态显示[管理资料]

目录1 绪论 (4)LED显示屏的发展背景及国内外研究现状 (4)设计目标及采取的方案 (4)本设计的目标 (4)本设计采取的方案 (5)文章的结构安排 (5)2 系统总体分析 (7)显示部分 (7)驱动电路的选择 (8)电源模块选择 (8)工作原理 (8)总体设计 (9)3 系统硬件设计 (10)AT89C51芯片的介绍 (11)时钟电路 (15)复位电路 (15)驱动电路设计 (16)2N5551与2N5401三极管的主要参数 (16)8255芯片的介绍 (17)键盘模块设计 (19) (20)LED的特点以及常用的参数 (20)LED电子显示屏 (22)LED电子显示屏显示字符原理 (23)汉字显示的原理 (25)整体电路 (30)4 系统软件设计 (32)主程序设计 (32)子程序设计 (38)5 结论 (42)6 致谢 (43)参考文献 (44)1 绪论LED显示屏的发展背景及国内外研究现状在大型商场、车站、码头、地铁站以及各类办事窗口等越来越多的场所需要用LED点阵显示图形和汉字。

LED行业已成为一个快速发展的新兴产业,市场空间巨大,前景广阔。

随着信息产业的高速发展,LED 显示作为信息传播的一种重要手段,已广泛应用于室内外需要进行服务内容和服务宗旨宣传的公众场所,例如户内外公共场所广告宣传、机场车站旅客引导信息、公交车辆报站系统、证券与银行信息显示、餐馆报价信息豆示、高速公路可变情报板、体育场馆比赛转播、楼宇灯饰、交通信号灯、景观照明等。

显然,LED显示已成为城市亮化、现代化和信息化社会的一个重要标志。

LED点阵设计主要应用于显示屏,它是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。

由于它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内室外环境适应能力强等优点,自20世纪80年代后期开始,随着LED制造技术的不断完善,在国外得到了广泛的应用。

在我国改革开放之后,特别是进入90年代国民经济高速增长,对公众场合发布信息的需求日益强烈,LED显示屏的出现正好适应了这一市场形势,因而在LED显示屏的设计制造技术与应用水平上都得到了迅速的提高。

基于8255的8LED显示电子码表设计

基于8255的8LED显示电子码表设计

基于8255的8LED显示电子码表设计通达学院实验报告(2010/2011学年第一学期)题目:基于8255的8LED显示电子码表设计专业通信工程学生姓名班级学号授课教师林建中授课单位南京邮电大学日期 2011年11月第一部分实验目的及要求:1.实验目的本课程设计在理论课程的基础上,重点培养学生的动手能力,通过理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,为下一步结合实际的硬件系统设计准备条件2. 实验要求基本要求:1设计秒表功能,精度为0.01秒。

2可同时记录和存储10个秒表数据(连续记录并显示已存储记录数)。

3秒表记录数据查询和清除功能。

发挥部分:1 可根据速度误差用D/A转换器输出DC 信号。

2 可设定速度偏差范围,当超范围时通过蜂鸣器能发出提示音。

3 有静音功能。

动态显示格式:自定第二部分实验工具及实验器件1.Proteus7.4以及Keil 2软件的使用Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

8255例题与实验

8255例题与实验
பைடு நூலகம்
mov dx, TIM_CTL mov al, 76h out dx, al mov dx, TIMER1 mov al, 19h out dx, al mov al, 0 out dx, al
;Init 8255 mov dx, 8255CON mov al, 92h;10000010b out dx, al
mov dx, 8255A mov al, 0 out dx, al
mov bl, 01h mov dx, 8255B in al, dx testlow: test al, 80h jz testlow mov dx, 8255A;rising edge mov al, bl out dx, al shl bl, 1 cmp bl, 80h jnz in8255 mov bl, 01h in8255 mov dx, 8255B in al, dx testhigh: test al, 80h jnz testhigh jmp testlow

利用8255和8253控制八个LED循环点亮的 电路如图所示,任何时候仅有一个LED 亮,每一个亮0.5秒,0.5秒后切换,即 LED0亮LED1亮 LED2亮 ……LED7亮LED0亮…,如此循环。

程序
TIM_CTL equ 27BH TIMER0 equ 278H TIMER1 equ 279H 8255A equ 258H 8255B equ 259H 8255CON equ 25BH stacks segment stack 'stack' sta db 512 dup(?) top equ length sta stacks ends
8255实验

8255的A口接8个LED发光二极管。利用 按钮开关K控制指示灯LED0~LED7。初 始状态为LED0~LED7全暗,第一次按K, 使LED0亮,其它暗,第二次按K,使 LED1亮,其它暗……,第八次按K,使 LED7亮,其它暗,第九次按K,全暗, 如此循环不断亮灯,编写程序段。
  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语言的相关知识。

相关文档
最新文档