数码管显示程序

合集下载

02实验二数码管动态显示程序设计

02实验二数码管动态显示程序设计

02实验二数码管动态显示程序设计数码管是一种常见的数字显示器件,通常由七段LED组成。

通过控制不同的LED亮灭状态,可以显示出0到9的数字和一些字母。

数码管通常被广泛应用于计时器、温度显示器等设备中,用于显示数字和一些特定的符号。

数码管的动态显示是指通过快速切换数码管显示的内容,从而实现多个数码管连续显示不同的数字。

这种显示方式使得数字的显示看起来像是连续变化的,给人一种流动的感觉。

在进行数码管动态显示的程序设计时,需要考虑以下几个方面:1.数码管的接口:数码管通常使用共阴极或共阳极的接口方式,需要根据实际的硬件接口进行相应的程序设计。

2.显示内容的切换:数码管需要显示不同的数字,需要通过程序控制数码管的显示内容。

可以通过数组或者其他数据结构来存储需要显示的数字,并通过循环,依次将不同的数字输出到数码管上。

3.显示周期的控制:数码管动态显示的关键是控制显示的刷新速度。

数码管的刷新速度通常以帧率进行表示,即每秒显示的帧数。

常见的数码管帧率为50Hz或60Hz,即每秒刷新50次或60次。

程序需要根据帧率来控制数码管显示的频率。

4.数码管的亮度控制:数码管的亮度通常通过PWM(脉宽调制)来控制,即快速开关数码管的亮灭状态,通过调整开关的占空比来控制数码管的亮度。

程序需要实现相应的PWM控制函数,可以通过改变PWM的占空比来控制数码管的亮度。

下面是一个简单的数码管动态显示的程序设计示例:```c++#include <arduino.h>//数码管引脚定义const int digitPins[] = {2, 3, 4, 5};const int segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; //数码管显示的数字const int numbers[] =// abcdefg};//数码管显示的当前数字int currentNumber = 0;// 数码管显示的刷新速度,单位为msconst int refreshRate = 10;void setu//设置数码管引脚的模式for (int i = 0; i < 4; ++i)pinMode(digitPins[i], OUTPUT);}for (int i = 0; i < 7; ++i)pinMode(segmentPins[i], OUTPUT);}void loo//刷新数码管显示refreshDisplay(;//数码管显示的数字切换currentNumber = (currentNumber + 1) % 10; //延时delay(refreshRate);//刷新数码管显示的函数void refreshDispla//显示当前数字for (int i = 0; i < 4; ++i)digitalWrite(digitPins[i], LOW); setSegments(numbers[currentNumber]); delayMicroseconds(500);digitalWrite(digitPins[i], HIGH);}//设置数码管的段void setSegments(int segments)for (int i = 0; i < 7; ++i)digitalWrite(segmentPins[i], (segments >> i) & 1);}```该程序通过设置数码管引脚的模式来控制数码管的显示。

数码管动态显示程序编写步骤

数码管动态显示程序编写步骤

数码管动态显示程序编写步骤一、准备工作在编写数码管动态显示程序之前,我们需要准备以下工作:1. 硬件设备:数码管、开发板等;2. 开发环境:Arduino IDE等;3. 相关库函数:例如“TM1637.h”库。

二、引入库函数在编写数码管动态显示程序之前,我们首先需要在代码中引入相应的库函数。

在Arduino IDE中,可以通过“库管理器”来搜索并安装需要的库函数。

三、初始化设置在开始编写程序之前,我们需要先对数码管进行初始化设置。

这包括设置数码管的引脚连接方式、亮度等参数。

四、定义变量在程序中我们需要定义一些变量来保存要显示的数字、字符等信息。

可以根据需要定义不同类型的变量,例如整型、字符型等。

五、编写显示函数编写一个显示函数来控制数码管的显示效果。

该函数可以接收一个参数,用来指定要显示的内容。

六、主函数在主函数中,我们可以通过调用显示函数来控制数码管的显示效果。

可以根据需要设置循环次数、延时时间等参数,来实现不同的显示效果。

七、编译与上传在编写完程序后,我们需要将代码进行编译,并将程序上传到开发板中进行运行。

在Arduino IDE中,可以点击“编译”按钮进行代码的编译,然后点击“上传”按钮将代码上传到开发板。

八、调试与优化在程序运行过程中,可能会出现一些问题,例如数码管显示异常、数字错误等。

这时候我们需要对程序进行调试,并进行相应的优化。

可以通过添加调试信息、查看变量的值等方式来进行调试。

九、总结通过以上步骤,我们可以编写出一个简单的数码管动态显示程序。

通过调整不同的参数和函数,我们可以实现不同的显示效果。

读者可以根据自己的需求进一步扩展和优化程序,实现更加复杂的功能。

编写数码管动态显示程序并不复杂,只需要按照上述步骤进行操作即可。

希望本篇文章对读者有所帮助,能够让大家更好地理解和掌握数码管动态显示程序的编写方法。

祝大家编程愉快!。

c语言数码管显示多位数字的程序

c语言数码管显示多位数字的程序

标题:C语言实现数码管显示多位数字的程序一、引言在嵌入式系统中,数码管是一种常见的数字显示设备,常用于显示温度、湿度、时间等信息。

本文将介绍如何使用C语言编写程序,实现数码管显示多位数字的功能。

二、基本原理数码管是由许多LED灯组成的,每一个LED代表一个数字或者一个字母。

常见的数码管有共阴极数码管和共阳极数码管两种。

在本文中,我们以共阴极数码管为例进行讲解。

1. 共阴极数码管共阴极数码管的基本构造是共阴极和若干个LED管组成的显示器。

共阴极数码管的特点是:所有LED管的阴极是公用的,阳极分别接到每一位数字的引脚上。

通过控制每个数字管的阳极输入信号,可以实现控制数码管显示不同的数字和字符。

2. 显示多位数字要实现显示多位数字,首先需要确定每一个数码管的数据输入引脚,根据接线原理将对应的引脚连接到单片机的IO口。

然后通过C语言编写程序,控制每个数码管显示对应的数字。

三、C语言实现多位数字显示程序示例下面以8051单片机为例,展示一个简单的C语言程序,实现数码管显示多位数字的功能。

```c#include <reg52.h>// 定义控制数码管的引脚sbit DIG1 = P1^0;sbit DIG2 = P1^1;sbit DIG3 = P1^2;sbit DIG4 = P1^3;// 定义数码管显示的数字unsigned char code smgduan[16]={0x3f, //00x06, //10x5b, //20x4f, //30x66, //40x6d, //50x7d, //60x07, //70x7f, //80x6f, //90x77, //A0x7c, //B0x39, //C0x5e, //D0x79, //E0x71 //F};// 数码管扫描函数void display(unsigned char *dat) {DIG1 = 0;P0 = dat[0];DIG1 = 1;DIG2 = 0;P0 = dat[1];DIG2 = 1;DIG3 = 0;P0 = dat[2];DIG3 = 1;DIG4 = 0;P0 = dat[3];DIG4 = 1;}void main(){while(1){unsigned char num[4] = {0, 1, 2, 3}; // 要显示的数字数组 display(smgduan[num[3]]);delay(1);display(smgduan[num[2]]);delay(1);display(smgduan[num[1]]);delay(1);display(smgduan[num[0]]);delay(1);}}```在上述示例中,我们先定义了数码管的引脚和显示的数字所对应的编码。

实验三 数码管动态显示程序设计1综述

实验三 数码管动态显示程序设计1综述

实验三数码管动态显示程序设计实验目的1、理解数码管动态显示原理2、理解数码管动态显示电路的设计方法3、掌握数码管动态显示程序的设计方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验内容1、动态扫描显示程序2、特征位小数点控制显示程序实验电路图实验步骤及调试信息1、新建实验项目2、输入实验程序并补充完整;------------------------------------------------------;数码管动态显示程序;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;; 2009-08-20;-------------------------------------------------------LEDCLK bit P3.4LEDDIN bit P2.3LEDDATA data P0dseg at 30hdispbuf: ds 8 ;显示缓冲区8字节disppoint: ds 1 ;小数点控制数据maincode SEGMENT CODECSEG at 0LJMP StartRSEG maincodeStart: CLR E Amov sp,#0c0hmov dispbuf ,#08hmov dispbuf+1, #04hmov dispbuf+2, #00hmov dispbuf+3, #08hmov dispbuf+4, #02hmov dispbuf+5, #00hmov dispbuf+6, #02hmov dispbuf+7, #07hmov disppoint,#02h ;第2位小数点亮LCALL dispSJMP $-3;------------------------------------------------------;数码管动态显示程序;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;; 2009-08-20;-------------------------------------------------------Disp: MOV R7,#8MOV R0,#dispbufCLR LEDCLKSETB L EDDINDisp1: MOV A,@R0MOV DPTR,#DispTabMOVC A,@A+DPTRcpl a; LCALL Dispdot ;显示小数点程序MOV LEDDA TA,A ;在输出之前加入显示小数点程序LCALL DispSelection1 ;输出位选择信号,DispSelection2是第二种; lcall dispsel3LCALL Delay1msmov p2,#0ffhINC R0DJNZ R7,Disp1mov p2,#0ffhRET;-------------------------------------------------;位选码以一次一位方式输出;-------------------------------------------------dispsel3:mov dptr,#DispSTabmov a,r7movc a,@a+dptrcpl a; swap amov p2,aretDispSelection1:CJNE R7,#8,DispSelection11CLR L EDDINDispSelection11:SETB LEDCLKNOPCLR L EDCLKSETB LEDDINRET;-------------------------------------------------;位选码以一次一字节方式输出;-------------------------------------------------DispSelection2:MOV B,#8MOV DPTR,#DispSTabMOV A,R7MOVC A,@A+DPTRCPL ADispSelection21:RLC AMOV LEDDIN,CSETB LEDCLKNOPCLR L EDCLKDJNZ B,DispSelection21RETDispSTab: DB 00H,80H,20H,40H,10H,08H,04H,02H,01H;位选码数据表dispa equ 80h ;数码管各段数据定义dispb equ 40hdispc equ 20hdispd equ 10hdispe equ 08hdispf equ 04hdispg equ 02hdisph equ 01hdisp8 equ 0ffh-disphDispTab: db disp8-dispg,dispb+dispc,dispa+dispb+dispg+dispd+dispe ;0,1,2 db disp8-dispe-dispf,disp8-dispa-dispd-dispe,disp8-dispb-dispe;3,4,5db disp8-dispb,dispa+dispb+dispc,disp8,disp8-dispe ;6,7,8,9db disp8-dispd,disp8-dispa-dispb,disp8-dispb-dispc-dispg ;a,b,cdb disp8-dispa-dispf,disp8-dispb-dispc,disp8-dispb-dispc-dispd;d,e,fdb disp8-dispb-dispc,0ffh,00h,dispg ;H,全亮,全暗,-;--------------------------------------------------------------------;特征位小数点控制显示程序;把小数点显示程序加到显示码输出之前;输入:A : 显示译码值; R7:当前正在显示的LED编号;输出:无;--------------------------------------------------------------------Dispdot:MOV B,AMOV A,R7MOV DPTR,#DispSTabMOVC A,@A+DPTRANL A,disppointSETB C ;本行及以下4行可改成MOV C,PJZ Dispdot1CLR C;点亮小数点Dispdot1:CPL C ;本行根据情况增减MOV A,BCPL AMOV ACC.7,C ;小数点由D7控制; MOV LEDDA TA,A ;本行可以删除RETDelayNms:LCALL Delay1msDJNZ R7, $-3RETDelay1ms:PUSH 07MOV R7,#250 ;1msNOPNOPDJNZ R7, $-2POP 07RETEND3、编译下载实验程序,并修改错误(按附录说明)4、全速运行程序,查看实验现象。

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

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

实验三数码显示一、实验目的了解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。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

数码管的显示与程序

数码管的显示与程序

项目3:数码管的显示专业:应用电子技术班级:092 学号:06号姓名:郑升一、思考题完成两个十进制数的加法,并在数码管上显示相加的结果。

提示:(1)完成BCD码的十进制相加;(2)将相加后的BCD码进行拆分;(3)生成ASCII码并显示二、设计思路老师给的要求是让我们把程序调试出来,然后修改一下,在数码管上显示出来,至于延时的长短可以做相应的改变,不过思考题让我是一阵头疼,平时没多上机练习一些,一时之间不知该怎么做。

三、接线图四、程序框图位选通信号(8002H)数据位(0FE06H)时钟位(8004H)五、参考程序OUTBIT equ 0FE02h ; 位控制口CLK164 equ 0FE04h ; 段控制口(接164时钟位) DAT164 equ 0FE06h ; 段控制口(接164数据位) IN equ 0FE00h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲 Num equ 70h ; 显示的数据 DelayT equ 75h ; 0000 020055 ljmp StartLEDMAP: ; 八段管显示码 0003 3F065B 0006 4F666D0009 7D07 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h 000B 7F6F77 000E 7C395E0011 7971 db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序 0013 7F00 mov r7, #0 DelayLoop:0015 DFFE djnz r7, DelayLoop 0017 DEFC djnz r6, DelayLoop 0019 22 retDisplayLED:001A 7860 mov r0, #LEDBuf001C 7906 mov r1, #6 ; 共6个八段管 001E 7A20 mov r2, #00100000b ; 从左边开始显示 Loop:0020 90FE02 mov dptr, #OUTBIT 0023 7400 mov a, #00025 F0 movx @dptr, a ; 关所有八段管0026 E6 mov a, @r0开始 初始化显示参数关所有位显示 取显示数据数据移位输出到164 输出时钟脉冲到1648段码完成输出位选通信号延时位选通信号移位指向下一个显示数据返回6位完成0027 75F008 mov B, #8 ; 送164DLP:002A 33 rlc a002B FB mov r3, a002C 92E0 mov acc.0, c002E 90FE06 mov dptr, #DAT1640031 F0 movx @dptr, a0032 90FE04 mov dptr, #CLK1640035 D2E0 setb acc.00037 F0 movx @dptr, a0038 C2E0 clr acc.0003A F0 movx @dptr, a003B EB mov a, r3003C D5F0EB djnz B, DLP003F 90FE02 mov dptr, #OUTBIT0042 EA mov a, r20043 F0 movx @dptr, a ; 显示一位八段管0044 7E01 mov r6, #10046 1113 call Delay0048 EA mov a, r2 ; 显示下一位0049 03 rr a004A FA mov r2, a004B 08 inc r0004C D9D2 djnz r1, Loop004E 90FE02 mov dptr, #OUTBIT0051 7400 mov a, #00053 F0 movx @dptr, a ; 关所有八段管0054 22 retStart:0055 758140 mov sp, #40h0058 757000 mov Num, #0MLoop:005B 0570 inc Num005D E570 mov a, Num005F F5F0 mov b, a0061 7860 mov r0, #LEDBufFillBuf:0063 E5F0 mov a, b0065 540F anl a, #0fh0067 900003 mov dptr, #LEDMap006A 93 movc a, @a+dptr ; 数字转换成显示码006B F6 mov @r0,a ; 显示在码填入显示缓冲006C 08 inc r0006D 05F0 inc b006F B866F1 cjne r0, #LEDBuf+6, FillBuf0072 75751E mov DelayT,#30DispAgain:0075 111A call DisplayLED ; 显示0077 D575FB djnz DelayT,DispAgain007A 02005B ljmp MLoopend六、程序调试过程中的问题这次的实验相对以前难了很多,基本上就是我们按照老师给的程序,在硬件上运行显示,然后做小范围的改动,比如延时的长短,数码管显示的顺序之类的,根本无法在本质上给予改变和修改。

单片机指令编程实例数码管显示程序设计

单片机指令编程实例数码管显示程序设计

单片机指令编程实例数码管显示程序设计在单片机的开发中,数码管是一种常见的输出设备。

通过编程控制数码管的显示,我们可以实现各种功能,如计时、计数、温度显示等。

本文将介绍一个简单的单片机指令编程实例,用于设计一个数码管显示程序。

一、概述数码管是一种由七段LED组成的显示器件,每个数码管可以显示0-9的数字。

通过合理的控制,可以将多个数码管连接起来并显示多位数值。

在这个实例中,我们将使用AT89C51单片机和共阳数码管进行程序设计。

二、硬件连接将数码管的七段LED引脚依次连接到单片机的GPIO引脚,并将共阳极引脚连接到单片机的VCC。

为了方便控制,可以利用74HC595芯片实现数码管的级联连接,这样只需要使用三个IO口即可控制多个数码管。

三、程序设计程序设计的主要逻辑是通过编写一系列的指令来控制数码管的显示。

以下是一个简单的实例程序:```#include <reg51.h>sbit SDA = P1^0; // 74HC595芯片的串行数据引脚sbit SCK = P1^1; // 74HC595芯片的时钟引脚sbit RCK = P1^2; // 74HC595芯片的输出使能引脚unsigned char code num[10] = {0xC0, // 数字0的显示码0xF9, // 数字1的显示码0xA4, // 数字2的显示码0xB0, // 数字3的显示码0x99, // 数字4的显示码0x92, // 数字5的显示码0x82, // 数字6的显示码0xF8, // 数字7的显示码0x80, // 数字8的显示码0x90 // 数字9的显示码};void delay(unsigned int t) {unsigned int i;while (t--) {for (i = 0; i < 1000; i++);}}void writeByte(unsigned char dat) {unsigned char i;for (i = 0; i < 8; i++) {SDA = (dat & 0x80) ? 1 : 0;dat <<= 1;SCK = 0;SCK = 1;}}void display(unsigned char n) {unsigned char i;for (i = 0; i < 8; i++) {writeByte(num[n]);RCK = 1;RCK = 0;delay(1); // 延时一段时间,使数码管显示出来}}void main() {unsigned char i;while (1) {for (i = 0; i < 10; i++) {display(i);delay(500); // 每个数字显示的时间间隔为500ms}}}```以上程序通过将各个数字的显示码存储在一个数组中,然后通过控制74HC595芯片的串行数据引脚、时钟引脚和输出使能引脚,来实现数码管的动态显示。

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

数码管显示程序
一、程序X1
1、程序X1的功能:最右边的数码管显示“0”
2、程序:
ORG 0
LJMP STR
ORG 0100H
STR: MOV P3, #0FEH ;送最低位有效的位码
MOV P0, #0C0H ;送“0”的段码“0C0H”
SJMP STR
END
二、程序X2: 用查表方式显示某个显示缓冲器中的数字
1、查表显示的预备知识
设从右到左各显示器对应的显示缓冲器为片内RAM79H~7EH
3、 实例:
例:已知(79H )= 0 7H , 查段码表在最右边的数码管显示79H 中的
“7”;
注:共阳极的段码表:
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
若:(A )= 0XH
则数字“X ”对应的段码在段码表中的表地址 = TAB + X
ORG 0
LJMP STR
ORG 0100H
① 各显示器与显示缓冲器地址对应关系
显示缓冲器: 7EH 7DH 7CH 7BH 7AH 79H
对应显示
器:
② 显示缓冲器的值与显示数字的关系:
显示缓冲器中的值 对应段码表地址 显示的数字
0XH
表首址+OXH X
STR: MOV P3, #11111110B ;送最低位有效的位码
MOV 79H , #07H ;送要显示的数据到显示缓冲器
MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTR
MOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0)
SJMP STR
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
END
例2:. 查段码表在最右边的数码管循环显示“0”~“F”
ORG 0
LJMP STR
ORG 0100H
STR: MOV P3, #11111110B ;送最低位有效的位码
LP0: MOV 79H , #0H ;送要显示的数据的初值到显示缓冲器MOV R3 , #6 ; 送要显示的数据的个数
LP: MOV A , 79H ;显示缓冲器的数作为查表变址送A MOV DPTR , #TAB ;表首址送DPTR
MOVC A , @A+ DPTR ;查表将数字转换为对应段码MOV P0, A ; 段码送段码口(P0)
LCALL SE19
INC 79H
DJMZ R3 ,LP
SJMP LP0
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
SE19: MOV R6 , #0A0H
LO36: MOV R7 , #0FFH
LO35: DJNZ R7 , LO35
DJNZ R6 , LO36
RET
END
3、修改程序查段码表在最左边的数码管循环显示“0”~“9”
三、对6个数码管的操作程序X3
四、功能:通过查表使6个数码管从右到左依次循环显示对应显示缓冲
器79H~7EH中的数字0~5
1.程序:
ORG 0
LJMP X3
ORG 0100H
X3: SETB RS1 ;选工作寄存器2
MOV SP , #40H ;设置堆栈指针
MOV R0 , #79H ;对79H~7EH单元送0~5
MOV R2 , #6 ;
CLR A ;
LP0: MOV @R0 , A
INC A
INC R0
DJNZ R2, LP0
LP1: M OV 30H , #11111110B ;对字位口送选择第一个数码管的位电平
;反相后得有效的位码01H(共阳极) MOV R2 , #6 ;送数码管个数,即重复操作的次数 MOV R0 , #79H ;送第一个数码管对应的显存地址LP: MOV A ,30H ;送位码
MOV P3 , A ;
MOV A , @R0 ;要显示的数字送A
MOV DPTR , #TAB ;送段码表的首地址
MOVC A , @A + DPTR ;查表将A中的数字转换为其对应的段码
MOV P0 , A ; 段码送段码口
LCALL SE19 ;调延时
MOV A , 30H ;位码左移一位,变为使下一个数码管的位
;电平有效的位码
RL A ;
MOV 30H , A ;位码存回30H,解放A
INC R0 ;显存地址加1,指向下一个显存地址
DJNZ R2 , LP ;(R2)- 1不为0(即没有使所有数码管都显
;示),转LP,继续使下一个数码管显示的操作。

LJMP LP1 ;所有数码管都已显示,从头开始让每个数码管显
;示的操作,以获取稳定的显示图像。

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
SE19: MOV R5 , #3
LO37: MOV R6 , #0FFH
LO36: MOV R7 , #0FFH
LO35: DJNZ R7 , LO35
DJNZ R6 , LO36
DJNZ R5 , LO37
RET
END
3.修改程序
①使6个数码管从右到左循环显示对应显示缓冲器79H~7EH中的
②使6个数码管从右到左同时显示对应显示缓冲器79H~7EH中的数
字0~5
③将程序X3改造为实用的显示程序“XS”。

该程序入口条件为:79H~7EH中已有形式为“0X1~0X6”内容,调用显示程序“XS”即可在对应数码管同时显示79H~7EH中的去掉0后的各字符X1~X6。

相关文档
最新文档