题目:用两个动态数码管从0显示到60,由89C51的P1口输出,不加译码器,直接连接数码管,注意是动态数码管,不是两个单独的静态数码管。
;=====================================
程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: ;开始初始化
MOV DPTR,#TAB ;表首址送DPTR
MOV R1, #0
MOV R2, #0
;-------------------------------------------------------
M1:
MOV R0, #50
LOOP:
CALL DIS
DJNZ R0, LOOP ;循环显示80遍,约用1.6s
;-------------------------------------------------------
MOV A, R3 ;这是计数值
ADD A, #1
DA A ;变成 BCD 码,即:00~99H
CJNE A, #60H, SSS
CLR A
SSS:
MOV R3, A ;计数值分解.
MOV B, #16
DIV AB ;分成高、低四位
MOV R2, A ;准备去显示
MOV R1, B
SJMP M1 ;转到前面,显示80遍
;-------------------------------------------------------
DIS: ;显示程序.
MOV A, R2 ;显示十位.
MOVC A, @A+DPTR
CLR P2.1
MOV P1, A
SETB P2.0 ;十位的位选.
CALL DLY
MOV A, R1 ;个位显示.
MOVC A, @A+DPTR
CLR P2.0 ;关闭十位的显示.
MOV P1, A
SETB P2.1 ;个位的位选.
CALL DLY
RET
;------------------------------
TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99 ;共阳极段码 0~4
DB 0x92,0x82,0xf8,0x80,0x90 ;共阳极段码 5~9
;-------------------------------------------------------
DLY: MOV R6, #20 ;10ms延时.
D1: MOV R7, #248
DJNZ R7, $
DJNZ R6, D1
RET
;-------------------------------------------------------
上述程序运行的效果图如下:
关键字:数码管 动态显示 汇编
引用地址:
数码管动态显示 汇编 60进制
推荐阅读最新更新时间:2024-03-16 16:02
分享一下嵌入式编程的感受
个人认为在嵌入式编程领域掌握三门语言应该就无敌了,汇编,C,C++,精力有限掌握前两个也凑合,再不行C一定要精通,否则只有当老大了,呵呵,进入这个行业一年多时间了,有些感受,学到了很多,也走了不少弯路,在这里想跟大家分享一下,主要是帮助初学者。 嵌入式编程最难的两部分就是interrupt和MM(memory manage),有些人可能感觉不到,那是因为太多数情况下芯片制造商都帮你写好了,但是如果你本身就在为芯片制造商工作,那你就必须自己会写配置文件了,这两个东西之所以比较难是因为要用汇编或类C来写,属于比较低层的东西,中断有外部中断和内部中断,外部中断有两种实现模式,硬件中断模式和软件中断模式,相对来说比较简单,属于应用层面的,相
[单片机]
AVR数码管扫描
#include avr/io.h #define uchar unsigned char #define uint unsigned int uchar display = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar slice = { 0x70,0xb0,0xd0,0xe0}; int main(void) { uchar temp=0,tempb; uint i; DDRD &= ~(1 7); PORTD |= (1 7);//打开上啦电阻 D
[单片机]
跑马灯实验用汇编语言和C51语言做出的不同效果
当前开发单片机应用系统程序主要应用汇编语言和C51语言,采用汇编语言编写可直接操纵系统的硬件资源,能编写出高效运行的程序代码,程序运行速度快。而采用C51语言编写可改善程序的可读性和可移植性,利于产品的更新换代,大大加快了单片机应用程序的开发速度。下面通过一个简单的实验--跑马灯实验来分析一下这两种语言的差别。用AT89C5l实现的跑马灯实验的原理图如xia 图所示。 跑马灯实验的原理图用汇编语言编写程序来实现,程序如下: ORG 0 000H LJP START//转入主程序 ORG 0040H START:MOV SP,#60H//设置 堆栈指针 OV A,# 0 F EH / /送A 11111110 ROTATE =
[单片机]
STC12C5410AD单片机的AD程序两位数码管显示
/*用的是主程序中转换AD,在以后的使用中要用中断的方法才能节约CPU的使用率,本程序中是用P1.0为输入,用的是单片机本身的10位AD,最大1024分辨率,除以10后最大为102,用两位的数码管,所以只能在99以内,在程序中大于99的数,就只能显示99,也可用三位数码管显示.*/ #include reg52.h #define uchar unsigned char #define uint unsigned int #define duan P1 //数码管段码输出端 sfr ADC_CONTR = 0xc5; sfr ADC_DATA = 0xc6; sfr ADC_LOW2 = 0xbe; sfr P1M0 =0x
[单片机]
串行口通信 单片机在数码管显示AD采集值
一. 程序功能 单片机上电后等待从上位机串口发送来的命令(波特率为9600bps),同时在数码管的前三位以十进制显示 AD采集来的数值。 1)当收到以十六进制发送来的01后,向上位机发送字符串 Turn on ad! ,同时间隔 一秒读取AD的值,然后把AD转换过来的数表示成实际电压值(浮点数),并且从串口发 送给上位机,形式如 The voltage is 3.398438V 发送周期也是一秒一次。 2)当收到02时,向上位机发送 Turn off ad! 并停止发送电压值 3)收到其他数时显示 Error! 二. 程序源码 1)法1 #include reg52.h #include intrins.h
[单片机]
单片机0-9数字秒表实验汇编程序
用一条8芯线,一端连接到P1口上,另一端连接到数码管的字段A-DP上(A连接p1.0,B连接p1.1, .),将第一个数码管的公共端X1接地GND 用T0定时50MS,定时初始值为3CB0H T0中断定时,中断20次,约一秒 ORG 0000H AJMP START ORG 000BH AJMP QQ1 START:MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH MOV R4,#14H SETB EA SETB ET0 SETB TR0 MOV 50H,#00H ACALL DISP QQ1:MOV 20H
[单片机]
单片机中级项目13丨矩阵按键数码管移位显示
单片机中级项目13丨矩阵按键数码管移位显示 /******************************************************************************* * 实 验 名 : 动态显示数码管实验 * 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4键盘使用P1 * 实验效果 : 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。 * 注 意 : *******************************************************************************/ #include reg51.h #def
[单片机]
第11章 栈(X86汇编教程)
栈,是什么呢?其实啊,栈,就是一种数据放进内存和从内存读取出来的方法.用栈来操作数据,几乎无需自己操心数据会被保存在内存的什么地方(不出意外的话.....) 栈操作内存的方法是写入的时候把数据一个一个推进去,写一次推一个数据.而提取数据当然也是一个一个提取出来.注意:提取过的数据就会消失(实际上没有消失,可以再次提取,但....那还不如直接用正常方式操作内存呢..).不像普通内存操作可以反复读取.栈提供了一种 后进先出 的数据操作方法.把最后放进内存的数据最先拿出来.这种内存操作方法在某些方面会有巨大的用处. 使用栈来操作内存,先在内存中定义一个位置,作为 栈顶 ,这个定义的方法也没啥,直接把你要作为栈顶的内存地址写进
[单片机]