用汇编语言实现八段数码管显示

合集下载

八位数码管动态显示程序

八位数码管动态显示程序

八位数码管动态显示程序这个是51hei 开发板专区里转来的一个程序,注释很详细,运行也没有问题,原文地址:51hei/bbs/dispbbs.asp?boardid=10id=4140/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间的问题了,设计步骤如下,如果要让八个数码管静态显示1 到8,我们可以修改中断时间,如把50000 改成100 或更低*/#includereg52.h #includeintrins.h#define uint unsigned int#define uchar unsigned charsbit duan=P2;sbit wei=P2;uchar a,numw,numd;uchar code tabled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9 数值.如果要显示1~8 数值,最好多加前后两位数0 跟9,因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/ uchar code tablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111110~01111111,是0 的为八位数显管的位置void main(){a=0; //定义个时间函数numw=0; //附位显初值为0 位numd=0; //附段显初值为0 位TMOD=0X01;//第四步骤,附中断暂存器初值TH0=(65535-50000)/256; //附中断请求时间初值,高8 位TL0=(65536-50000)%256; //附中断请求时间初值,低8 位EA=1; //开启总中断ET0=1; //开启定时中断TR0=1; //启动定时中断while(1){ if(a==10) //第三步骤,执行速度,如果等20 差不多是1 秒,则往下执行,相当于单位数值亮的时间{a=0; //重新附值初值0 numd++; //段显值++ if(numd==9) //如果段值在对码表第9 位则转下执行numd=1; /*重新附值段显值对应对码表第1 位,因为++所以0位并不在数码管中显示. 如果要显示,也会因为++而在第二轮中显示出*/ duan=1;//开启段显端P0=tabled[numd];//附段显P0 值对应段显值对码表duan=0; //锁存wei=1; //开启位显端P0=tablew[numw];//附位显P0 值对应位显值对码表wei=0; //锁存numw++; //相当于位显移位if(numw==8) //如果位显值到对应位显对码表第八位则转下执行numw=0; //重新附值位显值对应对码表第0 位起/*下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内#include”reg52.h”#include”intrins.h”sbit duan=P2;//段显端口sbit wei=P2;//位显端口void main(){//P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示, 可以不写duan=1; //开启段显端口P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表duan=0; //锁存,保持上一步段显状态,硬件说明请查阅74HC573 功能wei=1; //开启位显端口P0=0xfe; //附值位显位置,01111111,左边第一位,为0 的显示wei=0; //锁存,保持上一步位显状态,硬件说明请查阅74HC573 功能}*/ } } }void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度, 速度够快,人眼就会有余辉效应, 感觉8 位数显一直在亮着,相当于正在播放的电影胶卷*/{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;}/*以上有什么地方还需要改进的还请老师明示*/tips:感谢大家的阅读,本文由我司收集整编。

8个数码管动态显示

8个数码管动态显示

8个数码管动态显示南昌大学实验报告学生姓名:王崇伙学号:6103413026专业班级:生医131实验类型:□验证□综合设计□创新实验日期:2022/10/9实验成绩:实验二、8个数码管动态显示1~8一、实验目的1、掌握汇编查表法实现动态数码管显示。

2、熟练使用proteu仿真工具。

二、实验工具1、PC机2、keil程序编辑工具3、proteu仿真工具三、实验原理八路七段数码管动态显示原理其实和一个数码管显示0~F原理相同,不同在于显示数字的数码管有一个一次变成八个显示0~8,P0控制段选,P1控制位选,由本次实验使用八路共阴极数码管(如下图),当P0=0某7F(8)时,位码P1=0某fe既选通第八个数码管其余位选高电平不导通,结果就为第八个数码管显示8,依次P0段选‘1’时P1位选第一个数码管结果就为第一个数码管显示‘1’,延时0.2再依次循环输入1~8位选依次选一~八达到八位数码管循环显示1~8。

四、实验程序框图开始初始化端口设置断码表、位码表设定i=0,i++N显示i指向的内容Yi<8五、实验程序#include#include#include#defineucharunignedcharbitP_HC595_SER=P0^0;bitP_HC595_RCLK=P 2^4;bitP_HC595_SRCLK=P0^3;ucharcodeSEG7[]={0某3F,0某06,0某5B,0某4F,0某66,0某6D,0某7D,0某07,0某7F,0某6F,0某77,0某7C,0某39,0某5E,0某79,0某71,0某00};ucharcodeScon_bit[]={0某fe,0某fd,0某fb,0某f7,0某ef,0某df,0某bf,0某7f};uchardataDi_buf[]={16,16,16,16,16,16,16,0};voidDelay1m(){ unignedchari,j;_nop_();_nop_();_nop_();i=11;j=190;do{while(--j);}while(--i);}voidF_Send_595(uchar某){uchari;for(i=0;i<8;i++){某=某<<1;P_HC595_SER=CY;P_HC595_SRCLK=1;P_HC595_SRCLK=0;}}voiddiplay(void){uchari;for(i=0;i<8;i++){F_Send_595(Scon_bit[i]);F_Send_595(SEG7[Di_buf[i]]);P_HC595_RCLK=1;P_HC595_RCLK=0;De lay1m();}}六、实验结果六、实验总结延时0.2S,8个数码管动态显示1~8通过本次实验让我加深了对数码管显示功能的理解,并进一步也掌握了使用proteu仿真。

PLC课程设计:八 段 数 码 显 示

PLC课程设计:八 段 数 码 显 示
2、改进措施
四、工程预算
五、设计反思
六、参考文献
八段数码显示课程设计
一、八段数码显示课程设计
(一)可编程控的概述
可编程控制器是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用了可编程序的存储器,用来在其内部存储和执行逻辑运算、顺序控制、定时、计数和算术运算等操作命令,并通过数字式和模拟式的输入和输出,控制各种类型的机械或生产过程。可编程控制器及其有关外围设备,都按易于与工业系统联成一个整体、易于扩充其功能的原则设计。”
A
A段
3
Q0.2
B
B段
4
Q0.3
C
C段
5
Q0.4
D
D段
6
Q0.5
E
E段
7
Q0.6
F
F段
8
Q0.7
G
G段
(三)接线图
1、按图3.1进行实验台面板接线。
图3.2.2八段数码显示实验接线图
(四)程序(含梯形图、语句表)
1、绘出系统梯形图
参考程序见“天塔之光.MWP”。
2、语句表
(五)调试
1、故障分析
硬件调试:接通电源,检查可编程控制器是否可以正常工作,接头是否接触良好,然后把其与电脑的通信口连接。
(二)实现的功能
实现的功能是:任一组抢先按下按键后,八段码显示器能及时显示该组的编号并使蜂鸣器发出响声,同时锁住抢答器,使其它组按键无效,只有按下复位开关后方可再次进行抢答。图3.2.1为抢答器仿真图
图3.2.1
图2.1
(三)所选设备及功能
序号
名称
数量
功能
1
YSXK-PLC8型PLC高级电工综合实训考核装置

8段数码管动态显示详解

8段数码管动态显示详解

原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。

相关原理:数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。

我们分别把他命名为A,B,C,D,E,F,G,H。

搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。

也就是把B,E,H(小数点)不亮,其余全亮。

根据硬件的接法我们编出以下程序。

当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。

LOOP:CLR P2.7 ;选中最后的数码管SETB P0.7 ;B段不亮SETB P0.5 ;小数点不亮SETB P0.1 ;C段不亮CLR P0.2 ;其他都亮CLR P0.3CLR P0.4CLR P0.6CLR P0.0JMP LOOP ;跳转到开始重新进行END把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字2。

也许你会说:显示1个2字就要10多行程序,太麻烦了。

显示数字2则是C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为0(低电平)是亮为1(高电平)是灭。

从高往低排列,(p0.7_p0.0)写成二进制为01111110, 把他转化为16进制则为A2H。

我们可以根据硬件的接线把数码管显示数字编制成一个表格, 以后直接调用就行了。

有了这个表格上面显示一个2的程序则可简化为:LOOP:CLR P2.7 ;选中左边的数码管MOV P0,#0A2H ;送数字2的代码到P0口JMP LOOP ;跳转到开始重新进行END原理图中把所有数码管的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。

CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,由8个PNP的三极管,来控制这8位哪一位工作,例如上面的例子中我们选中的是P2.7.就是最后的一位亮了. 同样的如果要第一位亮, 只需要把程序CLR P2.7改为CLR P2.0即可。

数码管显示程序(汇编语言)

数码管显示程序(汇编语言)

实验三数码显示一、实验目的了解LED数码管动态显示的工作原理及编程方法。

二、实验内容编制程序,使数码管显示“DJ--88”字样。

三、实验程序框图四、实验步骤联机模式:(1)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM文件夹,点击S6.ASM文件,单击“确定”即可装入源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。

(2)数码管显示“DJ--88”字样。

脱机模式:1、在P.态下,按SCAL键,输入2DF0,按EXEC键。

2、数码管显示“DJ--88”字样。

五、实验程序清单CODE SEGMENT ;S6.ASM display "DJ--88"ASSUME CS:CODEORG 2DF0HSTART: JMP START0PA EQU 0FF20H ;字位口PB EQU 0FF21H ;字形口PC EQU 0FF22H ;键入口BUF DB ?,?,?,?,?,?data1:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1hdb 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH,0F0H START0: CALL BUF1CON1: CALL DISPJMP CON1DISP: MOV AL,0FFH ;00HMOV DX,PAOUT DX,ALMOV CL,0DFH ;显示子程序 ,5msMOV BX,OFFSET BUFDIS1: MOV AL,[BX]MOV AH,00HPUSH BXMOV BX,OFFSET DATA1ADD BX,AXMOV AL,[BX]POP BXMOV DX,PBOUT DX,ALMOV AL,CLMOV DX,PAOUT DX,ALPUSH CXDIS2: MOV CX,00A0HLOOP $POP CXCMP CL,0FEH ;01HJZ LX1MOV AL,0FFH ;00HMOV DX,PAOUT DX,ALINC BXROR CL,1 ;SHR CL,1JMP DIS1LX1: MOV AL,0FFHMOV DX,PBOUT DX,ALRETBUF1: MOV BUF,0DHMOV BUF+1,19HMOV BUF+2,17HMOV BUF+3,17HMOV BUF+4,08HMOV BUF+5,08HRETCODE ENDSEND START。

4任务四 用PLC实现八段码显示控制

4任务四  用PLC实现八段码显示控制

五、PLC的选择 的选择
2.存储容量的选择 用户程序所需的存储容量大小不仅与PLC 系统的功能有关,而且还与功能实现的方 法、程序编写水平有关。一个有经验的程 序员和一个初学者,在完成同一复杂功能 时,其程序量可能相差25%之多,所以对 于初学者应该在存储容量估算时多留裕量。
五、PLC的选择 的选择
图4-1 八段数码管实物外形图
图4-2 八段码显示阿拉伯数字“1”、“2”、“3”的示意图
【任务描述】 任务描述】
设计要求如下: 设计要求如下: 请用PLC实现输出控制对象 八段码显示器从 实现输出控制对象----八段码显示器从 请用 实现输出控制对象 0~2三个阿拉 伯数字的升序连续显示,要求升序 三个阿拉 伯数字的升序连续显示, 时间间隔为1s,并且用两 显示的阿拉伯数字间的时间间隔为 显示的阿拉伯数字间的时间间隔为 ,并且用两 个按钮分别实现数字显示的启动与停止 分别实现数字显示的启动与停止。 个按钮分别实现数字显示的启动与停止。
三、熔断器的选择
(1)一般负载。 一般负载。如照明负载、电阻炉、电 热器具等,可选择熔体的电流等于电路中 的额定电流。 (2)单台电动机 单台电动机:
(23A~ (23A~ 38A)
(3)多台电动机 多台电动机共用一个熔断器保护: 选择型号: 选择型号:RT18-32/6A
四、热继电器的选择
热继电器的型号含义:
任务四
用PLC实现八段 PLC实现八段 码显示控制
主讲:胡敏 金浙良
【任务目标】 任务目标】
一、进一步熟练运用取指令LD/LDI、触点串联指令 进一步熟练运用取指令 、触点串联指令AND/ ANI、触点并联指令 、触点并联指令OR/ORI、线圈输出指令 、线圈输出指令OUT、程序 、 结束指令END等基本指令进行本任务的四步法程序设计。 等基本指令进行本任务的四步法程序设计 结束指令 等基本指令进行本任务的四步法程序设计。 熟练应用定时器 和计数器C进行延时功能的程序设计 定时器T和计数器 进行延时功能 二、熟练应用定时器 和计数器 进行延时功能的程序设计 。 掌握PLC的编程方法 的编程方法、 三、掌握PLC的编程方法、编程规则或程序设计的基本原则 和步骤,通过本任务的训练逐步建立程序设计的基本思路 和步骤,通过本任务的训练逐步建立程序设计的基本思路 和方法。 和方法。 能独立、熟练完成【思考练习】的内容。 四、能独立、熟练完成【思考练习】的内容。 提高自我学习、信息处理、数字应用、解决问题等方法 五、提高自我学习、信息处理、数字应用、解决问题等方法 能力及与人交流 与人合作等社会能力 自查6S执行力 与人交流、 等社会能力; 能力及与人交流、与人合作等社会能力;自查 执行力 。

单片机课程设计-8位8段LED数码管动态扫描显示

单片机课程设计-8位8段LED数码管动态扫描显示

8位8段LED数码管动态扫描一、内容要求:在8位8段LED数码管显示“8.8.8.8.8.8.8.8.”持续500ms,之后灭显示器200ms;然后显示“WELCOM-1”(由于8位8段LED数码管显示不能显示字母W 和M,所以改为显示“HELLO-93”)二、目的和意义1、掌握数码管动态扫描显示原理及实现方法。

2、掌握动态扫描显示电路驱动程序的编写方法。

三、总体方案设计思路LED数码动态显示的基本做法在于分时轮流选通数码管的公共端,使得各数码管轮流导通,再选通相应的数码管后,即显示字段上得到显示字形码。

这种方式数码管的发光效率,而且由于各个数码管的字段线是并联使用的,从而大大简化了硬件线路。

动态扫描显示接口是单片机系统中应用最为广泛的一种显示方式。

其接口电路是把所有显示器的8个笔画段A-DP同名端并联在一起,而每个显示器的公共极COM各自独立地接受I/O线控制,CPU向字段输出口送出字段形码是,所有显示器由于同名端并连接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。

而所谓动态扫描是指采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。

再轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上个位显示器并非同时点亮,但只要扫描的速度足够快,给人的影响就是一组稳定的显示数据,不会有闪烁感。

采用总线驱动器74HC245提供LED数码管的段驱动,输出高电平时点亮相应段;采用集电极开路的BCD-十进制译码器/驱动器完成LED数码管位驱动,输出低电平时选通相应位。

P2口每个口线输出灌电流不足以驱动一个数码管显示器的位-公共极,所依通过集电极开路的BCD-十进制译码器/驱动器7445驱动,即节约P2口线,又增加驱动能力。

四、仿真电路设计(电路原理图及关键单元说明)8位8段LED数码管动态扫描显示实验电路元件清单(1)A T89C52AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。

用汇编语言实现八段数码管显示

用汇编语言实现八段数码管显示

⽤汇编语⾔实现⼋段数码管显⽰⽤汇编语⾔实现⼋段数码管显⽰⼀、实验要求利⽤实验仪提供的显⽰电路,动态显⽰⼀⾏数据.⼆、实验⽬的1. 了解数码管动态显⽰的原理。

2. 了解⽤总线⽅式控制数码管显⽰三、实验线路及连线四、实验说明1.本实验仪提供了6 位8段码LED 显⽰电路,只要按地址输出相应数据,就可以实现对显⽰器的控制。

显⽰共有6位,⽤动态⽅式显⽰。

8位段码、6位位码是由两⽚74LS374输出。

位码经MC1413或ULN2003倒相驱动后,选择相应显⽰位。

本实验仪中 8位段码输出地址为0X004H ,位码输出地址为 0X002H 。

此处X 是由KEY/LED CS 决定,参见地址译码。

做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。

以便⽤相应的地址来访问。

例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。

位选通信号 (0x002H)段码输出 (0x004H)数据总线七段数码管的字型代码表如下表:五、程序框图程序代码OUTBIT equ 08002h ; 位控制⼝OUTSEG equ 08004h ; 段控制⼝LEDBuf equ 60h ; 显⽰缓冲Num equ 70h ; 显⽰的数据DelayT equ 75h ;ljmp StartLEDMAP: ; ⼋段管显⽰码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ;mov r7, #0djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED:mov r0, #LEDBuf mov r1, #6 ;mov r2, #00100000b ; Loop:mov dptr, #OUTBIT mov a, #0movx @dptr, a ;mov a, @r0mov dptr, #OUTSEG movx @dptr,amov dptr, #OUTBIT mov a, r2movx @dptr, a ;mov r6, #01call Delaymov a, r2 ;rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBIT mov a, #0movx @dptr, a ;retStart:mov sp, #40hmov Num, #0 MLoop:inc Nummov a, Nummov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ;mov @r0,a ;inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#0DispAgain:call DisplayLED ;djnz DelayT,DispAgain ljmp MLoop end。

DS1302汇编数码管显示8位

DS1302汇编数码管显示8位

/*****************************************电路P1口接74HC573锁存4位数码管位远,P0接4位数码管段选。

P2.5,p2.6,p2.7接DS1302. *****************************************/ORG 0000HAJMP STARTORG 000BHAJMP TIM0SCLK EQU P2^7IO EQU P2^6RST EQU P2^5ALL_FLAG EQU 31H ;标志位SEC EQU 32H ;秒MIN EQU 33H ;分HOUR EQU 34H ;时DAY EQU 35H ;日MON EQU 36H ;月WEEK EQU 37H ;星期YEAR EQU 38H ;年DS_DAT EQU 39HDS_ADD EQU 3AHDS_DATA EQU 3BHS1 EQU r7ORG 70HSTART:MOV TMOD ,#00000001BMOV TH0 ,#HIGH(65536-1000);HIGH和LOW写反了会错MOV TL0 ,#LOW(65536-1000)SETB EASETB ET0SETB TR0LCALL DS_INITLOOP2:CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYLCALL DS_R_TIMEsjmp LOOP2DELAY:MOV R1,#10 ;1ms延时子程序D0: MOV R2,#248DJNZ R2,$DJNZ R1,D0RET/***************************************** DS1302写字节函数*****************************************/ DS_W_BYTE:MOV R0,#08MOV A,DS_DATDS_W1:RRC AMOV IO,CNOPSETB SCLKnopCLR SCLKDJNZ R0,DS_W1RET/***************************************** DS1302读字节函数*****************************************/ DS_R_BYTE:SETB IOMOV A,#00HMOV R0,#08DS_R1:MOV C,IORRC ASETB SCLKNOPCLR SCLKNOPDJNZ R0,DS_R1MOV DS_DA T,ARET/***************************************** DS1302读数据函数入口地址存至DS_ADD;读取到的数据存入DS_DA T *****************************************/ DS_R_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTELCALL DS_R_BYTESETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOPCLR IONOPNOPsetb IONOPNOPRET/***************************************** DS1302写数据函数入口地址DS_ADD,入口数据DS_DA TA*****************************************/ DS_W_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTEMOV DS_DA T,DS_DATALCALL DS_W_BYTEMOV DS_DA T,ASETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOP ;加了延时CLR IONOPNOPsetb IONOPNOPRET/*****************************************DS1302读时间函数入口地址DS_ADD,*****************************************/DS_R_TIME:MOV DS_ADD,#81HLCALL DS_R_DATMOV SEC,DS_DATMOV DS_ADD,#83HLCALL DS_R_DATMOV MIN,DS_DATMOV DS_ADD,#85HLCALL DS_R_DATMOV HOUR,DS_DATMOV DS_ADD,#87HLCALL DS_R_DATMOV DAY,DS_DATMOV DS_ADD,#89HLCALL DS_R_DATMOV MON,DS_DATMOV DS_ADD,#8BHLCALL DS_R_DATMOV WEEK,DS_DATMOV DS_ADD,#8DHLCALL DS_R_DATMOV YEAR,DS_DATRET/*****************************************DS1302写时间函数入口地址DS_ADD,入口数据*****************************************/DS_W_TIME:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;语序写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,SECLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,MINLCALL DS_W_DA TMOV DS_ADD,#84HMOV DS_DATA,HOURLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,DAYLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,MONLCALL DS_W_DA TMOV DS_ADD,#8AHMOV DS_DATA,WEEKLCALL DS_W_DA TMOV DS_ADD,#8CHMOV DS_DATA,YEARLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRET/*****************************************DS1302初始化*****************************************/DS_INIT:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;允许写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#90HMOV DS_DATA,0xa5LCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,#00HLCALL DS_W_DATMOV DS_ADD,#84HMOV DS_DATA,#23HLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,#16HLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,#12HLCALL DS_W_DA TMOV DS_ADD,#8aHMOV DS_DATA,#02HLCALL DS_W_DA TMOV DS_ADD,#8cHMOV DS_DATA,#14HLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRETTIM0:PUSH ACCPUSH PSWPUSH DPHPUSH DPLPUSH BMOV TH0 ,#HIGH(65536-1000) MOV TL0 ,#LOW(65536-1000) MOV A ,SECMOV B,#16DIV ABMOV 50H ,BMOV 51H, AMOV A,MINMOV B,#16DIV ABMOV 52H,BMOV 53h,AMOV A,HOURMOV B ,#16DIV ABMOV 54H,BMOV 55H,AINC S1MOV DPTR,#TABMOV P1,#0HCJNE S1,#1H,Z1NOPNOPMOV A ,50HMOVC A,@A+DPTRMOV P0,ASETB P1.0SJMP LOOPZ1:CJNE S1,#02H,Z2MOV A,51H MOVC A,@A+DPTRMOV P0,ASETB P1.1SJMP LOOPZ2:CJNE S1,#03H,Z3MOV P0,#0BFH SETB P1.2SJMP LOOPZ3:CJNE S1,#04H,Z4MOV A,52H MOVC A,@A+DPTRMOV P0,ASETB P1.3SJMP LOOPZ4:CJNE S1,#05H,Z5MOV A,53H MOVC A,@A+DPTRMOV P0,ASETB P1.4SJMP LOOPZ5:CJNE S1,#06H,Z6MOV P0,#0BFHSETB P1.5SJMP LOOPZ6:CJNE S1,#07H,Z7MOV A,54HMOVC A,@A+DPTRMOV P0,ASETB P1.6SJMP LOOPZ7:CJNE S1,#08H,Z8MOV A,55HMOVC A,@A+DPTRMOV P0,ASETB P1.7MOV S1,#0HSJMP LOOPZ8:LJMP 00HLOOP:POP BPOP DPLPOP DPHPOP PSWPOP ACCRETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFHEND。

单片机 1个八段数码管循环显示0-f 汇编语言

单片机 1个八段数码管循环显示0-f 汇编语言

【概述】单片机是一种集成了微处理器、存储器和输入输出设备的微型计算机系统,广泛应用于电子产品中。

八段数码管是一种常见的显示器件,可以显示0-9和A-F共16个字符。

本文将以汇编语言为例,介绍如何利用单片机控制一个八段数码管循环显示0-F的过程。

【正文】1. 了解八段数码管八段数码管是由8个LED灯组成,可以显示16种不同的字符。

每个LED代表一个数码,通过控制LED的亮灭来显示相应的字符。

在汇编语言中,我们可以通过控制单片机的输出引脚来实现对八段数码管的控制。

2. 开发环境准备我们需要准备好单片机的开发环境,包括单片机开发板、编程软件等。

常用的单片机有51系列、AVR系列等,在使用之前需要熟悉其指令集和寄存器等相关知识。

3. 控制八段数码管在汇编语言中,我们可以通过对单片机的输出引脚进行控制来操作八段数码管。

具体的操作包括设置引脚状态、发送数据等。

通过编写相应的汇编语言程序,我们可以实现循环显示0-F的功能。

4. 编写汇编语言程序我们需要定义八段数码管每个数字对应的LED亮灭状态。

在主程序中编写循环语句,通过不断改变LED的状态来实现循环显示的效果。

在编写程序时,需要考虑到八段数码管的工作原理和时序要求,以确保程序的稳定性和准确性。

5. 调试和优化在编写完汇编语言程序后,我们需要进行调试和优化。

通过单步调试等手段来检查程序的运行情况,找出可能存在的问题。

可以根据实际情况对程序进行优化,提高程序的执行效率和稳定性。

6. 实际应用完成汇编语言程序的编写和调试后,我们可以将程序烧录到单片机中进行测试。

通过连接八段数码管和单片机的引脚,我们可以观察到八段数码管循环显示0-F的效果。

这个简单的实例展示了如何利用汇编语言控制八段数码管,为我们进一步深入了解单片机的应用奠定了基础。

【总结】通过本文的介绍,我们了解了如何利用汇编语言控制单片机实现八段数码管的循环显示。

汇编语言作为一种底层语言,对于理解单片机的工作原理和功能有着重要的作用。

八段数码管显示

八段数码管显示

实验一八段数码管显示1、实验目的:(1)了解数码管动态显示的原理。

(2)了解74LS164扩展端口的方法。

2、实验要求:利用实验仪提供的显示电路,动态显示一行数据.3、实验电路图LED1LED2LED3LED4LED5LED64、实验器材:(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)计算机 1 台5、实验连线无 6、实验说明:(1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,用动态方式显示。

8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。

6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。

向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。

本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。

(2)七段数码管的字型代码表显示字形g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h2 1 0 1 1 0 1 1 6bh3 1 0 0 1 1 1 1 4fh4 1 1 0 0 1 1 0 66h5 1 1 0 1 1 0 1 6dh6 1 1 1 1 1 0 1 7dh7 0 0 0 0 1 1 1 07h8 1 1 1 1 1 1 1 7fh9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 0 5eh E 1 1 1 1 0 0 1 79h F1111 71hab c def g dp7、程序框图8、实验步骤1.将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。

汇编数字钟-8位数码管显示

汇编数字钟-8位数码管显示

汇编数字钟(8位数码管显示)这款数字钟是笔者亲自试验过的作品,电路图和程序都经过优化,供爱好者制作参考。

显示格式依然是23-59-59(同样是小时十位如果为0则不显示),调整时间增加了一只按钮,通过调整选择键SET_KEY选择调整位,选中位开始闪烁,此时再按增加键ADD_KEY或减少键DEC_KEY调整选中位,如果长按ADD_KEY或DEC_KEY,系统识别后则进行调时快进,此时停止闪烁,方便人眼观察。

同时还增加了调秒功能:如果选中位是秒,则按增加键或减少键都是将秒清零。

汇编程序设计:/**************************************************************程序名称:51单片机8位数码管数字钟汇编程序简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒显示格式:23-59-59(小时十位如果为0则不显示)通过3只按键来调整时间调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁增加键ADD_KEY:P1.1;按一次使选中位加1减少键DEC_KEY;P1.2;按一次使选中位减1如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁如果选中位是秒,则按增加键或减少键都是将秒清零P0口输出数码管段选信号,P2口输出数码管位选信号。

晶振12M编写:最后更新:08/12/31晚**************************************************************/ ORG 0000H ;程序入口地址LJMP STARTORG 000BH ;定时器0中断入口地址LJMP TIMER_0ORG 0300H/*****程序开始,初始化*****/START:SETB 48H ;使用一个bit位用于调时闪烁标志SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒MOV 20H,#00H ;用于控制秒基准时钟源的产生MOV 21H,#00H ;清零秒寄存器MOV 22H,#00H ;清零分寄存器MOV 23H,#00H ;清零时寄存器MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生MOV IP,#02H ;IP,IE初始化MOV IE,#82HMOV TMOD,#01H ;设定定时器0工作方式1MOV TH0,#3CHMOV TL0,#0B0H ;赋定时初值,定时50msSETB TR0 ;启动定时器0MOV SP,#40H ;重设堆栈指针/*****主程序*****/MAIN:LCALL DISPLAY ;调用显示子程序LCALL KEY_SCAN ;调用按键检测子程序JZ MAIN ;无键按下则返回重新循环LCALL SET_KEY ;调用选择键处理子程序JB 46H,MAIN ;如果已进行长按调整(调时快进),则不再执行下面的单步调整LCALL ADD_KEY ;调用增加键处理子程序,加一LCALL DEC_KEY ;调用减少键处理子程序,减一LJMP MAIN ;重新循环/*****定时器中断服务程序*****/TIMER_0:PUSH ACCPUSH PSW ;保护现场MOV TH0,#3CHMOV TL0,#0B0H ;重新赋定时初值CPL 47H ;产生脉冲用于调时快进时基INC 24HMOV A,24HCJNE A,#10,ADD_TIME ;产生0.5秒基准时钟,用于调时闪烁CPL 48H ;取反调时闪烁标志位MOV 24H,#00HADD_TIME: ;走时INC 20HMOV A,20HCJNE A,#20,RETI1 ;产生1秒基准时钟MOV 20H,#00H ;一秒钟时间到,清零20H MOV A,21HADD A,#01HDA A ;作十进制调整MOV 21H,ACJNE A,#60H,RETI1MOV 21H,#00H ;一分钟到MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETI1MOV 22H,#00H ;一小时到MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETI1MOV 23H,#00H ;到24点,清零小时RETI1:POP PSWPOP ACC ;恢复现场RETI ;中断返回/*****显示处理*****/DISPLAY:MOV A,21H ;秒ANL A,#0FHMOV 2FH,A ;转换出秒个位,存入2FHMOV A,21HANL A,#0F0HSWAP AMOV 2EH,A ;转换出秒十位,存入2EHJB 46H,MIN ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#3,MIN ;如果R1为3,闪烁秒位待调整JB 48H,MINMOV 2FH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2EH,#0AHMIN:MOV A,22H ;分ANL A,#0FHMOV 2DH,A ;转换出分个位,存入2DHMOV A,22HANL A,#0F0HSWAP AMOV 2CH,A ;转换出分十位,存入2CHJB 46H,HOUR ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#2,HOUR ;如果R1为2,闪烁分位待调整JB 48H,HOURMOV 2DH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2CH,#0AHHOUR:MOV A,23H ;时ANL A,#0FHMOV 2BH,A ;转换出时个位,存入2BHMOV A,23HANL A,#0F0HSWAP AMOV 2AH,A ;转换出时十位,存入2AHJB 46H,DISP ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#1,DISP ;如果R1为1,闪烁时位待调整JB 48H,DISPMOV 2BH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2AH,#0AH/*****数码管动态扫描显示*****/DISP:MOV DPTR,#TABLEMOV A,2FHMOVC A,@A+DPTRMOV P0,ACLR P2.7LCALL DELAYSETB P2.7 ;显示秒个位MOV A,2EHMOVC A,@A+DPTRMOV P0,ACLR P2.6LCALL DELAYSETB P2.6 ;显示秒十位MOV A,#0BFHMOV P0,ACLR P2.5LCALL DELAYSETB P2.5 ;显示“-”MOV A,2DHMOVC A,@A+DPTRMOV P0,ACLR P2.4LCALL DELAYSETB P2.4 ;显示分个位MOVC A,@A+DPTRMOV P0,ACLR P2.3LCALL DELAYSETB P2.3 ;显示分十位MOV A,#0BFHMOV P0,ACLR P2.2LCALL DELAYSETB P2.2 ;显示“-”MOV A,2BHMOVC A,@A+DPTRMOV P0,ACLR P2.1LCALL DELAYSETB P2.1 ;显示时个位MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0MOV A,2AHMOVC A,@A+DPTRMOV P0,ACLR P2.0LCALL DELAYSETB P2.0 ;显示时十位RET/*****按键检测子程序*****/KEY_SCAN:CLR 46H ;关闭长按调整(调时快进)标志MOV P1,#0FFH ;将P1口设置成输入状态MOV A,P1CPL AANL A,#07H ;P1口低3位连接3个按键,只判断该3位JZ EXIT_KEY ;无键按下则返回LCALL DELAY ;延时去抖动MOV A,P1 ;重新判断CPL AJZ EXIT_KEY ;键盘去抖动MOV R5,A ;临时将键值存入R5MOV R4,#00H ;用于控制调时快进速度;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进LOOP: ;进入长按处理LCALL DISPLAY ;使长按时显示正常MOV A,P1CPL AANL A,#07HJB 47H,LOOP1INC R4 ;调时快进间隔时间基准加1LOOP1:CJNE R1,#03H,LOOP2 ;如果调秒时长按,则不处理LJMP LOOP3LOOP2:CJNE R4,#99H,LOOP3MOV R4,#70H ;确认用户长按后,重新设定起始值,加快调时快进速度SETB 46H ;长按调整(调时快进)标志LCALL ADD_KEYLCALL DEC_KEYLOOP3:JNZ LOOP ;等待键释放MOV A,R5 ;输出键值RETEXIT_KEY:RET/*****延时子程序*****/DELAY:MOV R7,#150DJNZ R7,$RET/*****选择键处理子程序*****/SET_KEY:CJNE R5,#01H,EXIT ;选择键键值INC R1 ;调整选择功能标志加一CJNE R1,#4,EXITMOV R1,#0MOV 24H,#00H ;调时闪烁基准清零RET/*****增加键处理子程序*****/ADD_KEY:CJNE R5,#02H,EXIT ;增加键键值CJNE R1,#01H,NEXT1 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,EXITMOV 23H,#00HNEXT1:CJNE R1,#02H,NEXT2 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,EXITMOV 22H,#00HNEXT2:CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如增加键按下直接清零秒RET/*****减少键处理子程序*****/DEC_KEY:CJNE R5,#04H,EXIT ;减少键键值CJNE R1,#01H,NEXT3 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#99HDA AMOV 23H,ACJNE A,#99H,EXITMOV 23H,#23HNEXT3:CJNE R1,#02H,NEXT4 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#99HMOV 22H,ACJNE A,#99H,EXIT MOV 22H,#59HCJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如较少键按下直接清零秒RET/*****万用返回子程序*****/EXIT:RET/*****数码管字形编码表*****/TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形显示编码TABLE1:DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小时位的十位数编码,该位如果为0则不显示END ;程序结束(注:可编辑下载,若有不当之处,请指正,谢谢!)。

硬件实验6 八段数码管显示实验

硬件实验6 八段数码管显示实验

硬件实验6 八段数码管显示实验1.实验目的1)了解数码管实现显示字符的7段码编制方法;2)掌握查表法获得0-F的7段码的方法;3)掌握静态显示和动态显示的原理,硬件连接方式和程序编写方法。

2.预习要求1)了解数码管静态显示和动态显示接口电路的设计方法和特点;2)了解数码管动态显示的程序设计方法;3)理解运用串行口工作方式0扩展I/O连接数码管的方法;4)认真预习本节实验内容,设计实验硬件连接电路,编写实验程序。

3.实验说明1)LED数码管显示原理8段LED数码管有共阴极和共阳极两种结构。

对于共阴数码管,其8个LED的阴极连接在一起作为公共COM端;而共阳数码管中8个LED的阳极连接在一起作为公共COM端。

共阴数码管显示的必要条件是其COM端接地或接具有较大灌电流能力的输入端口,此时当某个发光二级管的阳极为高电平时,该发光二极管点亮;共阳数码管显示的必要条件是共阳极接电源或具有较强电流输出能力的输出端口,此时当某个发光二极管的阴极接低电平时,该发光二级管被点亮。

2)LED数码管显示方式A.静态显示方式静态显示的特点是每个数码管需要一个具有锁存功能的8位输出口,用来锁存待显示的段码。

将要显示数的7段码输出到端口,数码管就会显示并一直保持到接收到新的显示段码为止。

静态显示的优点:显示程序简单,占用CPU时间少。

但当数码管数量较多时,就需要外扩较多的输出端口,因此静态显示的缺点是占用硬件资源多,成本较高。

B.动态显示方式动态显示的特点是将多个数码管的相应段码线连在一起,接到一个8位输出端口,该端口称为段码输出口;同时将各个(如8个)数码管的COM端连接到一个8位输出端口,该端口称为位控输出口。

这样的连接使得8个数码管只要2个输出端口就可以实现控制,大大简化硬件电路。

但是由于多个数码管的段码是连在一起的,所以需要结合位控信号,分时输出不同数码管上显示的7段码,即需要采用动态显示扫描,轮流向段码输出口输出段码和向位控输出口输出位选信号,并进行1~2ms的短时延时;8个数码管轮流输出一遍后,约20ms后,就要进行一次显示刷新,这样才能利用发光管的余辉和人眼视觉暂留作用,得到全部数码管同时稳定显示的效果。

八段数码管显示实验

八段数码管显示实验

实验一 八段数码管显示实验一、实验目的:1、了解数码管动态显示的原理。

2、了解74LS164扩展端口的方法。

二、实验要求:利用实验仪提供的显示电路,动态显示一行数据。

三、实验电路:这里只是显示草图,详细原理参见第一章的1.1.15 “8155键显模块”。

四、实验说明:1、本实验仪提供了8段码数码管LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,采用动态方式显示。

8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。

6位位码由8155的PA0口输出,经uA2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。

本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。

2六、实验步骤:1、将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。

2、进入KEIL软件界面,点击项目/打开项目在C:\KEIL\UV2\次1配套实验例程中选择实验一,内有ASM和C51两种程序,进入ASM 文件夹打开LED项目文件进入如图所示界面点击“调试/启动/停止调试”,进入调试界面,点击“调试/运行”可看到8段数码管交替显示0—F七、实验程序:OUTBIT equ 0e101h ; 位控制口CLK164 equ 0e102h ; 段控制口(接164时钟位)DAT164 equ 0e102h ; 段控制口(接164数据位)IN equ 0e103h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;org 0000hljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #00hmovx @dptr, a ; 关所有八段管mov a, @r0mov B, #8 ; 送164DLP:rlc amov r3, amov acc.0, cANL A, #0FDHmov dptr, #DAT164movx @dptr, amov dptr, #CLK164orl a,#02hmovx @dptr, aanl a,#0fDhmovx @dptr, amov a, r3djnz B, DLPmov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart: mov dptr,#0e100hmov a,#03hmovx @dptr,amov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲 inc r0inc bcjne r0, #LEDBuf+6, FillBuf mov DelayT,#30 DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopEND。

八段数码管滚动显示程序设计

八段数码管滚动显示程序设计

八段数码管滚动显示程序设计实验三八段数码管滚动显示程序设计一、实验目的1.掌握数码管动态显示的原理;2.掌握74LS164扩展端口的方法;3.掌握数码管滚动显示的方法。

二、实验内容1.验证参考程序中的实验(显示数字0-5);2.修改程序:(1)使6个数码管从左到右重复滚动的显示一定的信息,比如:日期2008-3-20;(2)滚动显示的速度可以修改。

三、实验器材PC机一台, 仿真器一台, 实验箱一台, 导线若干。

四、实验原理图显示共有6位,采用动态显示,8段数码管是由8155的PB0、PB1经过74LS164串转并后输出得到,6位位码由8155的PA0口输出,经UA2003反向驱动后,选择相应的显示位。

实验中数据输出口地址为0e102h,时钟为输出地址为0e102h,位选通输出地址位0e101h。

实验原理图见图4-1。

图4-1 实验原理图五、实验步骤1.按照实验一中的建立工程的步骤,建立本实验内容相应的工程;2.运用调试工具,调试软件,观察现象;3.调试修改程序观察现象。

六、参考程序/* “验证式"?实验十一八段数码管显示 */#include#define LEDLen 6 //6个数码灯//以下定义8155为PA、PB为基本I/o模式,PC为输出模式#define mode 0x03;/* 8155的命令状态口寄存器地址 */#define CAddr XBYTE[0xe100]/* 8155的PA口地址,用于数码灯的位控制 */#define OUTBIT XBYTE[0xe101]/* 8155的PB口地址,其PB0和PB1用于74Ls164串行输入,控制数码管的段 */#define CLK164 XBYTE[0xe102]#define DAT164 XBYTE[0xe102] /* 段控制口(接164数据位) */ /* 键盘读入口 */#define IN XBYTE[0xe103]/* 显示缓冲 */unsigned char LEDBuf[LEDLen];/* 八段管显示码共阴极字符显示*/code unsigned char LEDMAP[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i, j;unsigned char Pos;unsigned char LED;/* 6个数码管从左边开始显示,0010 0000 */Pos = 0x20;for (i = 0; i < LEDLen; i++){/* 六个数码管位控制为零,实现关所有八段管 */OUTBIT = 0;//数码管需要显示的段数据LED = LEDBuf[i];//8155通过PB0和PB1向74Ls164送段数据,串行输入,74Ls164并行输出到数码管段for (j = 0; j < 8; j++){//每个数据有8位,开始检测每一位的情况,先检测高位if(LED & 0x80) DAT164 = 1;else DAT164 = 0;//必须PB1(CLK164)由低位向高位跳变,才能PB0(DAT164)发送一位数据CLK164 = CLK164|0x02;//CLK164置0CLK164 = CLK164&0xfd;//为下一位发送做准备LED <<= 1;}OUTBIT = Pos; /* 显示一位八段管 */ Delay(1);Pos >>= 1; /* 显示下一位 */}OUTBIT = 0; /* 关所有八段管 */}void main(){unsigned char i = 0;unsigned char j;CAddr = mode;while(1){//保证数组里面的数据在0~15中间循环 LEDBuf[0] = LEDMAP[ i & 0x0f]; LEDBuf[1] = LEDMAP[(i+1) & 0x0f]; LEDBuf[2] = LEDMAP[(i+2) & 0x0f]; LEDBuf[3] = LEDMAP[(i+3) & 0x0f];LEDBuf[4] = LEDMAP[(i+4) & 0x0f];LEDBuf[5] = LEDMAP[(i+5) & 0x0f];i++;for(j=0; j<30; j++)DisplayLED(); /* 延时 */}}七、实验现象当程序正常烧入并全速运行后,发现数码管的显示是从左到右滚动显示,并且显示的值是“0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f”轮流显示,通过延时可以调节滚动的快慢。

八段数码管显示实验

八段数码管显示实验

八段数码管显示实验实验一八段数码管显示实验一、实验目的:1、介绍数码管动态显示的原理。

2、介绍74ls164拓展端口的方法。

二、实验要求:利用实验仪提供更多的表明电路,动态显示一行数据。

三、实验电路:这里只是表明草图,详尽原理参看第一章的1.1.15“8155键显出模块”。

四、实验说明:1、本实验仪提供更多了8段码数码管led表明电路,学生只要按地址输入适当数据,就可以同时实现对显示器的掌控。

表明共计6十一位,使用动态方式表明。

8段数码管就是由8155的pb0、pb1经74ls164“串转并”后输入获得。

6十一位位码由8155的pa0口输入,经ua2021逆向驱动后,挑选适当表明位。

74ls164是串行输入并行输出转换电路,串行输入的数据位由8155的pb0控制,时钟位由8155的pb1控制输出。

写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74ls164中,向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输入地址为0e102h,时钟位输入地址为0e102h,位选通输入地址为0e101h。

本实验牵涉至了8155i0/ram拓展芯片的工作原理以及74ls164器件的工作原理。

六、实验步骤:1、将keil仿真器上40芯排线一端和实验箱上51cpu板上的40芯排针连接起来,将仿真器相连接的usb或串口线与pc机对应的usb或串口连接起来,关上实验箱电源。

2、进入keil软件界面,点击项目/打开项目在c:\keil\uv2\次1服务设施实验例程中挑选实验一,内有asm和c51两种程序,步入asm文件夹关上led项目文件进入如图所示界面页面“调试/启动/暂停调试”,步入调试界面,页面“调试/运转”可以看见8段数码管交错表明0—七、实验程序:outbitequ0e101h;位掌控口clk164equ0e102h;段控制口(接164时钟位)dat164equ0e102h;段控制口(接164数据位)inequ0e103h;键盘读入口ledbufequ60h;显示缓冲numequ70h;显示的数据delaytequ75h;org0000hljmpstartledmap:;八段管表明码db3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb7fh,6fh,77h,7ch,39h,5eh,79h,71hdelay:;延时子程序movr7,#0delayloop:djnzr7,delayloopdjnzr6,delayloopretdisplayled:movr0,#ledbufmovr1,#6;共6个八段管movr2,#00100000b;从左边已经开始表明loop:movdptr,#outbitmova,#00hmovx@dptr,a;第一关所有八段管mova,@r0movb,#8;送164dlp:rlcamovr3,amovacc.0,canla,#0fdhmovdptr,#dat164movx@dptr,amovdptr,#clk164orla,# 02hmovx@dptr,aanla,#0fdhmovx@dptr,amova,r3djnzb,dlpmovdptr,#outbitmova,r2movx@dptr,a;显示一位八段管movr6,#1calldelaymova,r2;表明下一位rramovr2,aincr0djnzr1,loopmovdptr,#outbitmova,#0movx@dptr,a;关所有八段管retstart:movdptr,#0e100hmova,#03hmovx@dptr,amovsp,#40hmovnum,#0mloop:incnummova,nummovb,amovr0,#ledbuffillbuf:mova,banla,#0fhmovdptr,#ledmapmovca,@a+dptr;数字转换成显示码mov@r0,a;显示在码填入显示缓冲incr0incbcjner0,#ledbuf+6,fillbufmovdelayt,#30dispagain:calldisplayled;显示djnzdelayt,dispagainljmpmloopend。

八段数码管滚动显示程序设计

八段数码管滚动显示程序设计

八段数码管滚动显示程序设计在设计八段数码管滚动显示程序时,首先需要明确程序的功能和要求。

根据题目要求,我们需要设计一个程序,能够实现八段数码管的滚动显示,并能够控制滚动的速度和显示的内容。

在程序设计的过程中,我们需要考虑以下几个方面:1.数码管的显示方式:八段数码管的显示是基于数码管的每个段的开关状态来控制的,我们需要明确每个数字在数码管上的显示方式。

2.滚动的实现方式:滚动的实现方式可以有多种,例如左滚动、右滚动、上下滚动等。

我们需要根据题目要求确定滚动的方式,并设计相应的算法实现。

3.滚动的速度控制:滚动的速度可以通过控制滚动的时间间隔来控制。

我们可以使用定时器或者延时函数来实现速度的控制。

下面是一个八段数码管滚动显示程序的示例代码:```c#include <reg51.h>sbit A = P2^0;sbit B = P2^1;sbit C = P2^2;sbit D = P2^3;sbit E = P2^4;sbit F = P2^5;sbit G = P2^6;sbit DP = P2^7;//数码管的段码定义unsigned char code digit[10] =0xC0,//00xF9,//10xA4,//20xB0,//30x99,//40x92,//50x82,//60xF8,//70x80,//80x90//9};//数码管滚动显示函数void display(unsigned char *num, unsigned char delay) unsigned char i, j;// 滚动显示num数组中的数字for(i = 0; i < 8; i++)for(j = 0; j < delay; j++)A=0;B=0;C=0;D=0;E=0;F=0;G=0;DP=0;P1 = digit[num[i]];P0=0x01<<i;//延时,控制滚动速度// 此处使用延时函数,delayms函数需要自行实现delayms(1);}}void maiunsigned char num[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // 显示的数字unsigned char delay = 100; // 滚动的速度while(1)display(num, delay);}```在上述代码中,我们使用了一个8位的数组来存储要显示的数字。

利用八位八段数码管显示I LOVE YOU

利用八位八段数码管显示I LOVE YOU

#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit A_138=P1^0;sbit B_138=P1^1;sbit C_138=P1^2;void Delay_ms(uint xms); //延迟函数void main() //主函数{while(1){A_138=0;B_138=0;C_138=0; //定义第一个数码管P2=0x06; //第一个数码管亮1Delay_ms(1); //数码管延时1秒A_138=1;B_138=0;C_138=0; //定义第二个数码管P2=0x06; //第一个数码管亮1 Delay_ms(1); //数码管延时1秒A_138=0;B_138=1;C_138=0; //定义第三个数码管P2=0x3f; //第一个数码管亮0 Delay_ms(1); //数码管延时1秒A_138=1;B_138=1;C_138=0; //定义第四个数码管P2=0x3e; //第一个数码管亮U Delay_ms(1); //数码管延时1秒A_138=0;B_138=0;C_138=1; //定义第五个数码管P2=0x79; //第一个数码管亮EDelay_ms(1); //数码管延时1秒A_138=1;B_138=0;C_138=1; //定义第六个数码管P2=0x6e; //第一个数码管亮YDelay_ms(1); //数码管延时1秒A_138=0;B_138=1;C_138=1; //定义第七个数码管P2=0x3f; //第一个数码管亮0Delay_ms(1); //数码管延时1秒A_138=1;B_138=1;C_138=1; //定义第八个数码管P2=0x3e; //第一个数码管亮UDelay_ms(1); //数码管延时1秒}}void Delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }。

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

用汇编语言实现八段数码管显示
一、实验要求
利用实验仪提供的显示电路,动态显示一行数据.
二、实验目的
1. 了解数码管动态显示的原理。

2. 了解用总线方式控制数码管显示
三、实验线路及连线
四、实验说明
1.本实验仪提供了6 位8段码LED 显示电路,只要按地址输出相应数据,就可以
实现对显示器的控制。

显示共有6位,用动态方式显示。

8位段码、6位位码是由两片74LS374输出。

位码经MC1413或ULN2003倒相驱动后,选择相应显示位。

本实验仪中 8位段码输出地址为0X004H ,位码输出地址为 0X002H 。

此处X 是由KEY/LED CS 决定,参见地址译码。

做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。

位选通信号 (0x002H)
段码输出 (0x004H)
数据总线
七段数码管的字型代码表如下表:
五、程序框图
程序代码
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
LEDBuf equ 60h ; 显示缓冲
Num equ 70h ; 显示的数据
DelayT equ 75h ;
ljmp Start
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ;
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ;
mov r2, #00100000b ;
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ;
mov a, @r0
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ;
mov r6, #01
call Delay
mov a, r2 ;
rr a
mov r2, a
inc r0
djnz r1, Loop
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ;
ret
Start:
mov sp, #40h
mov Num, #0
MLoop:
inc Num
mov a, Num
mov b, a
mov r0, #LEDBuf
FillBuf:
mov a, b
anl a, #0fh
mov dptr, #LEDMap
movc a, @a+dptr ;
mov @r0,a ;
inc r0
inc b
cjne r0, #LEDBuf+6, FillBuf
mov DelayT,#0
DispAgain:
call DisplayLED ;
djnz DelayT,DispAgain ljmp MLoop
end。

相关文档
最新文档