51单片机汇编语言例子,涵盖数码管显示,流水灯,串口,外拓,电子钟,频率计,DA、AD转换等实例

;数码管显示
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV 30H,#2
;MOV 31H,#0
;MOV 32H,#2
;MOV 33H,#1

;MAIN:
;ACALL DISPLAY
;AJMP MAIN

;DISPLAY:
;MOV R0,#30H
;MOV R1,#0
;MOV R2,#7FH
;L1: MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R2
;RL A
;MOV R2,A
;MOV P2,A
;ACALL DELAY
;MOV P2,#0FFH
;INC R0
;INC R1
;CJNE R1,#4,L1
;RET
;DELAY:
;MOV R3,#250
;DJNZ R3,$
;RET

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H
;END

;双流水灯和数码管同时显示
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV A,#0FCH
;L1: MOV P1,A
;PUSH ACC
;PUSH PSW
;ACALL DELAY
;POP PSW
;POP ACC
;RL A
;AJMP L1

;DELAY:
;MOV 30H,#2
;MOV 31H,#0
;MOV 32H,#2
;MOV 33H,#1

;DISPLAY:
;MOV R0,#30H
;MOV R1,#0
;MOV R2,#7FH
;L2: MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R2
;RL A
;MOV R2,A
;MOV P2,A
;MOV P2,#0FFH
;INC R0
;INC R1
;CJNE R1,#4,L2
;RET

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H

;END

;按键控制流水灯的几种状态按一下:左流水;2下:右流水;3下:灭;4下:重新开始循环
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV R3,#7FH
;MOV R4,#0FEH

;MAIN:
;ACALL KEY_TEST
;ACALL LIGHT_DISPLAY
;AJMP MAIN

;KEY_TEST:
;/按键的逻辑的就是,按下之后去判断是否按下成功,若按下成功成功一次,则去执行相应的逻辑;在执行完
;以后一定要去判断按键是否弹起,若没有弹起,则一定要去设定程序死等,直到它弹起来为止;按下成功的逻辑
;一定要依据题意想清楚是什么,为什么要这样做,还要在脑海中想这样是否合理,另外,在子程序中,切忌出现
;死循环;若没有按下,则退出按键检测程序、、、、、按下—执行逻辑—检测是否弹起-退出按键检测程序
/
;JB P3.2,OUT
;INC R0
;CJNE R0,#3,UP
;MOV R0,#0
;UP:
;JB P3.2,OUT
;AJMP UP
;OUT:
;RET

;LIGHT_DISPLAY:
;CJNE R0,#0,LEFT
;MOV P1,#0FFH

;LEFT:
;CJNE R0,#1,RIGHT
;MOV A,R3
;RL A
;MOV R3,A
;MOV P1,A
;ACALL DELAY

;RIGHT:
;CJNE R0,#2,EXIT
;MOV A,R4
;RR A
;MOV R4,A
;MOV P1,A
;ACALL DELAY

;EXIT:
;RET

;DELAY:

;MOV	R2,#250

;L3: MOV R1,#250
;DJNZ R1,$
;DJNZ R2,L3
;RET
;END

;数码管的滚动循环显示
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV 30H,#0
;MOV 31H,#1
;MOV 32H,#2
;MOV 33H,#3
;MOV 34H,#4
;MOV 35H,#5

;MAIN:
;MOV R6, #2
;L0: MOV R4, #250;相当于同一组数进行显示500次,然后再刷新,去显示另外一组数
;L1: ACALL DISPLAY
;DJNZ R4, L1
;DJNZ R6, L0
;ACALL CHANGE;一组数显示500次后,进行一次移位
;AJMP MAIN

;CHANGE:
;;定义显存,让每一组数显示完一段时间以后,进行左移移动显示,必须确保一组数能够显示一段时间
;MOV R7,30H;此处一定为地址,而不是立即数,因为要实现这些数的循环交换,
;;而不是去通过改变地址去找要显示的数
;MOV 30H,31H
;MOV 31H,32H
;MOV 32H,33H
;MOV 33H,34H
;MOV 34H,35H
;MOV 35H,R7
;RET

;DISPLAY:
;MOV R0,#30H
;MOV R1,#7FH
;MOV R2,#0
;MOV DPTR,#NUM

;L2: MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R1
;RL A
;MOV R1,A
;MOV P2,A
;ACALL DELAY
;MOV P2,#0FFH
;INC R0
;INC R2
;CJNE R2,#4,L2
;RET

;DELAY:
;MOV R5,#200
;DJNZ R5,$
;RET

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H

;END

;独立按键控制数码管的显示
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV R0,#98;切忌写成16进制的形式

;MAIN:

;ACALL	KEY1
;ACALL	KEY2
;ACALL	DISPLAY
;AJMP	MAIN

;KEY1:
;JB P3.2,KEY1_OUT
;INC R0
;CJNE R0,#100,KEY1_UP
;MOV R0,#0
;KEY1_UP:
;JB P3.2,KEY1_OUT
;AJMP KEY1_UP
;KEY1_OUT:
;RET

;KEY2:
;JB P3.3,KEY2_OUT
;DEC R0
;CJNE R0,#-1,KEY2_UP
;MOV R0,#99
;KEY2_UP:
;JB P3.3,KEY2_OUT
;AJMP KEY2_UP
;KEY2_OUT:
;RET

;DISPLAY:
;MOV A,R0
;MOV B,#10
;DIV AB
;MOV 30H,A
;MOV 31H,B
;MOV R1,#30H
;MOV R2,#7FH
;MOV R3,#0
;;写数码管显示,明确要显示的数是由什么构成的,每一次要显示一轮要几个周期,显示完一轮
;;之后又要干什么(重复显示下一轮)
;L1: MOV A,@R1
;MOV DPTR,#NUM
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R2
;RL A
;MOV R2,A
;MOV P2,A
;MOV P2,#0FFH
;INC R1
;INC R3
;CJNE R3,#2,L1
;RET

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H,7CH
;DB 39H, 5EH, 79H,71H
;END

;中断相关程序编写1:中断控制流水灯的流向
;ORG 0000H
;AJMP START
;ORG 0003H
;AJMP EX_INT0

;START:
;SETB IT0
;SETB EX0
;SETB EA
;FLAG BIT 20H.1
;CLR FLAG
;MOV R0,#7FH
;MOV R1,#0FEH
;MAIN:
;ACALL LIGHT
;ACALL DELAY
;AJMP MAIN

;LIGHT:
;JNB FLAG,UP

;DOWN: MOV A,R0
;RR A
;MOV R0,A
;MOV P1,A

;UP: JB FLAG,OUT
;MOV A,R1
;RL A
;MOV R1,A
;MOV P1,A
;OUT:
;RET

;EX_INT0:
;CPL FLAG
;RETI

;DELAY:
;MOV R3,#250
;L1: MOV R2,#250
;DJNZ R2,$
;DJNZ R3,L1
;RET
;END

;ORG 0000H
;AJMP START
;ORG 0003H
;AJMP EX_INT0

;START:
;SETB IT0
;SETB EX0
;SETB EA
;FLAG BIT 20H.1
;CLR FLAG
;MAIN:
;ACALL LIGHT
;AJMP MAIN

;LIGHT:
;JNB FLAG,UP
;SETB P2.7
;ACALL DELAY
;CLR P2.7
;ACALL DELAY

;UP: JB FLAG,LIGHT
;CLR P2.7
;OUT:
;RET

;EX_INT0:
;CPL FLAG
;RETI

;DELAY:
;MOV R3,#250
;L1: MOV R2,#250
;DJNZ R2,$
;DJNZ R3,L1
;RET
;END

;ORG 0000H
;AJMP START
;ORG 0003H
;AJMP EX_INT0

;START:
;SETB IT0
;SETB EX0
;SETB EA
;FLAG BIT 20H.1
;CLR FLAG
;MOV R0,#7FH
;MOV R1,#0FEH
;AJMP $

;LIGHT:
;JNB FLAG,UP

;DOWN: MOV A,R0
;RR A
;MOV R0,A
;MOV P1,A

;UP: JB FLAG,OUT
;MOV A,R1
;RL A
;MOV R1,A
;MOV P1,A
;OUT:
;RET

;EX_INT0:
;CPL FLAG
;MAIN:
;ACALL LIGHT
;ACALL DELAY
;AJMP MAIN;在中断里面写入死循环就没法去触发执行下一次中断了,因为此次中断在一直执行,除非有更高级别的中断
;RETI

;DELAY:
;MOV R3,#250
;L1: MOV R2,#250
;DJNZ R2,$
;DJNZ R3,L1
;RET
;END

;定时器计数器编程
;定时器计数器编程主要就是要通过题意准确设定定时器计数器应该工作在哪个工作方式,
;然后计算初值设置为多少

;ORG 0000H
;AJMP START
;ORG 000BH
;AJMP T0_IN
;ORG 0100H

;START:
;MOV TMOD,#01H
;MOV TH0,#HIGH(-1000)
;MOV TL0,#LOW(-1000)
;SETB ET0
;SETB EA
;SETB TR0
;SETB P3.4
;AJMP $

;T0_IN:
;INC R0
;CJNE R0,#5,L1
;CLR P3.4
;L1:
;CJNE R0,#17,OUT
;SETB P3.4
;MOV R0,#0
;OUT:
;MOV TH0,#HIGH(-1000)
;MOV TL0,#LOW(-1000)
;RETI
;END

;串口编程,单片机回复给PC小写字母
;ORG 000H
;AJMP START
;ORG 0100H

;START:
;CLR SM0
;SETB SM1
;SETB REN
;ORL PCON,#80H
;MOV TMOD,#20H
;MOV TH1,#-6
;MOV TL1,#-6
;SETB TR1;注意一定要打开定时器,还有定时器一定要选用定时器1
;;SETB TI

;RECEIVE:
;JNB RI,$
;CLR RI
;MOV A,SBUF
;CJNE A,#‘A’,JUDGE0

;JUDGE0:
;JC SEND
;CJNE A,#‘Z’+1,JUDGE1
;JUDGE1:
;JNC SEND

;CLR	C
;SUBB	A,#'A'
;ADD	A,#'a'

;SEND:
;;JNB TI, ; 此 处 可 以 有 两 种 位 置 , 与 具 体 的 逻 辑 相 关 , 看 是 否 初 始 化 T I 来 决 定 ; ; C L R T I ; M O V S B U F , A ; J N B T I , ;此处可以有两种位置,与具体的逻辑相关,看是否初始化TI来决定 ;;CLR TI ;MOV SBUF,A ;JNB TI, ;TI;;CLRTI;MOVSBUF,A;JNBTI,
;CLR TI
;AJMP RECEIVE
;END

;先发送一个数字,然后PC发什么,单片机回什么
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;CLR SM0
;SETB SM1
;SETB REN
;MOV TMOD,#20H
;MOV TH1,#-24
;MOV TL1,#-24
;SETB TR1
;SETB TI
;MOV DPTR,#NUM

;POWER:
;JNB TI,$;每发送一次必定会去判断一次,发完一个字符必须做这一步骤,
;;不然发送完一个字符后,TI就会一直为1,一直处于发送成功的状态,
;;有些字符可能没发送成功都会导致发送成功,从而出错
;CLR TI
;CLR A
;MOVC A,@A+DPTR
;;JZ RECEIVE;这句话为什么就无法发送数给PC
;MOV SBUF,A;执行完这句话为什么看不见TI被置位为1??
;INC DPTR
;JNZ POWER
;;AJMP POWER

;;方式二,发送一个16进制数
;;JNB	TI,$;每发送一次必定会去判断一次
;;CLR	TI
;;MOV	SBUF,#'8'
;;JNB	TI,$;这样去调试是无法判断PC是否接受到数,发送成功那些在调试过程中都不可预测,所以是会停止在这句话的
;;CLR	TI
;;MOV	SBUF,#'8'
;;JNB	TI,$
;;CLR	TI
;;MOV	SBUF,#'H'

;RECEIVE:
;JNB RI,$
;CLR RI
;MOV A,SBUF

;SEND:
;JNB TI,$
;CLR TI
;MOV SBUF,A
;AJMP RECEIVE

;NUM:
;DB “88H”,0;只能通过发送字符去表达发送的信息,不能够直接去发送数字
;END

/单片机与PC机进行串行通信,要求单片机接收PC发送过来的数据,统计数据中大写A字母的个数,
显示在数码管上,当A的个数超过20个时,数码管上显示“- - EE”,
同时发送字符串“Number Warning”给PC机。通信速率为4800bps,单片机外接晶振频率为22.1184MHz。
/
;目前还有问题,但自己没找出来?????
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;ACALL URIT_INIT
;MOV R1,#0;字符A的个数

;MAIN: ACALL DISPLAY
;ACALL URIT
;AJMP MAIN

;DISPLAY:

;MOV	R2,#0;判断一轮显示是否完成标志
;MOV	R3,#7FH;位选起始标志位
;CJNE	R1,#21,JUDGE

;JUDGE:
;JC DISPLAY1;CY位为1,说明A的个数小于20个,执行display1
;AJMP DISPLAY2;CY位为0,说明A的个大于20个,执行display2

;DISPLAY1:
;MOV A,R1
;MOV B,#10
;DIV AB
;MOV 30H,#16
;MOV 31H,#16
;MOV 32H,A
;MOV 33H,B
;MOV R0,#30H;显示开始
;AJMP DISPLAY3

;DISPLAY2:
;MOV 30H,#16
;MOV 31H,#16
;MOV 32H,#14
;MOV 33H,#14
;MOV R0,#30H

;DISPLAY3:
;MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R3
;RL A
;MOV R3,A
;MOV P2,A
;ACALL DELAY
;MOV P2,#0FFH
;INC R0
;INC R2
;CJNE R2,#4,DISPLAY3
;RET

;URIT:
;RECEIVE:
;JNB RI,$
;CLR RI
;MOV A,SBUF
;CJNE A,#‘A’,OUT
;INC R1
;CJNE R1,#21,OUT
;SEND:
;MOV DPTR,#STR
;L1: JNB TI,$
;CLR TI
;CLR A
;MOVC A,@A+DPTR
;MOV SBUF,A
;INC DPTR
;JNZ L1
;OUT:
;RET

;URIT_INIT:
;CLR SM0
;SETB SM1
;SETB REN
;MOV TMOD,#20H
;MOV TH1,#-12
;MOV TL1,#-12
;SETB TR1
;SETB TI
;RET

;DELAY:
;MOV R5,#100
;DJNZ R5,$
;RET

;STR:
;DB “Number Warning”,0

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H,40H
;END

;总线拓展程序设计
;1:AD转换程序设计
;*************************************************************
;程序实现将外部的一个电压采样,将其数字量的值显示在数码管上。
;ADC0804的器件地址为B0000H
;共阴数码管段码端地址为8000H,位选端地址为9000H
;*************************************************************
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;ACALL AD_EXCHANGE
;ACALL DISPLAY
;AJMP START

;AD_EXCHANGE:
;MOV DPTR,#0B000H
;MOVX @DPTR,A
;JB INT0,$
;MOVX A,@DPTR
;RET

;DISPLAY:
;MOV B,#100
;DIV AB
;MOV 31H,A
;MOV A,B
;MOV B,#10
;DIV AB
;MOV 32H,A
;MOV 33H,B
;MOV R0,#30H
;MOV R1,#0FEH
;MOV R2,#0

;L1: MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV DPTR,#8000H;操作外部拓展单元每一次操作,必定先锁定要操作的单元,
;而每一个芯片都有其自己的功能
;当我们向该单元传输某个数据时,其自然会按照其对应的功能区执行相关操作
;MOVX @DPTR,A
;MOV DPTR,#9000H
;MOV A,R1
;MOVX @DPTR,A
;RL A
;MOV R1,A
;MOV A,#0FFH
;MOVX @DPTR,A
;INC R0
;INC R2
;CJNE R2,#4,L1
;RET
;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H,40H
;END

;利用DA输出一个3V的三角波,DA转化器的器件地址为A000H
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV DPTR,#0A000H
;CLR A
;L1: MOVX @DPTR,A
;INC A
;CJNE A,#154,l1

;L2: MOVX @DPTR,A
;DEC A
;CJNE A,#0,L2
;AJMP L1
;END

;利用8255A实现一个流水灯,
;由图可得A\C口应该作为输出口(写)来使用,B口应该作为输人口(读)使用,器件地址为C000H
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;MOV DPTR,#0C003H;先对控制寄存器发出相关控制,设定8255A的工作方式
;MOV A,#82H
;MOVX @DPTR,A
;MOV DPTR,#0C000H

;MOV	A,#0FEH

;L1: MOVX @DPTR,A
;ACALL DELAY
;RL A
;AJMP L1
;DELAY:

;MOV	R2,#250

;L3: MOV R1,#250
;DJNZ R1,$
;DJNZ R2,L3
;RET
;END

/利用T0产生40ms的中断,并由此得到秒技术,且通过按键在数码管上显示秒数,
左三位固定为123,右边从0-9开始变化,按键k1接在INT0上,K2接在INT1上,按下一个分别加一减一
/

;ORG 0000H
;AJMP START
;ORG 0003H
;AJMP EX0_IN
;ORG 000BH
;AJMP T0_IN
;ORG 0013H
;AJMP EX1_IN
;ORG 0100H

;START:
;MOV R5,#0;初始化秒数
;MOV R6,#0;初始化40ms计数单位
;ACALL INTERRUPT_INIT

;MAIN:
;ACALL DISPLAY
;AJMP MAIN

;T0_IN:
;INC R6
;CJNE R6,#25,OUT
;MOV R6,#0
;INC R5
;OUT:
;MOV TH0,#HIGH(-40000)
;MOV TL0,#LOW(-40000)
;RETI

;EX0_IN:
;INC R5
;RETI

;EX1_IN:
;DEC R5
;RETI

;DISPLAY:
;MOV A,R5
;MOV B,#10
;DIV AB
;MOV 30H,#1
;MOV 31H,#2
;MOV 32H,#3
;MOV 33H,B
;MOV R0,#30H
;MOV R3,#0FEH
;MOV R4,#0

;L1: MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R3
;MOV P2,A
;NOP
;MOV P2,#0FFH
;RL A
;MOV R3,A
;INC R0
;INC R4
;CJNE R4,#4,L1
;RET
;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H,40H

;INTERRUPT_INIT:
;SETB IT0
;SETB IT1
;MOV TMOD,#01H
;MOV TH0,#HIGH(-40000)
;MOV TH1,#LOW(-40000)
;SETB EX0
;SETB EX1
;SETB ET0
;SETB EA
;SETB TR0
;RET
;END

;开始时等待pc发送来的单个数据,然后将片外RAM从200H开始的七个单元地址发送给PC
;ORG 0000H
;AJMP START
;ORG 0100H

;START:
;CLR SM0
;SETB SM1
;SETB REN
;SETB TI
;ORL PCON,#80H

;MOV	TMOD,#20H
;MOV	TH1,#-24
;MOV	TL1,#-24
;MOV	DPTR,#0200H
;MOV	A,#'A'
;MOVX	@DPTR,A
;SETB	TR1

;MAIN:
;JNB RI,$
;CLR RI
;MOV A,SBUF

;SEND:
;JNB TI,$
;CLR TI
;MOVX A,@DPTR
;MOV SBUF,A
;INC R0
;INC DPTR
;CJNE R0,#7,SEND
;AJMP $
;END

;频率计程序编写(即统计一秒钟外部信号波形出现的次数)
;ORG 0000H
;AJMP START
;ORG 001BH
;AJMP T1_IN
;ORG 0100H

;START:
;MOV R4,#0;统计频率值
;MOV R5,#0;初始化定时
;ACALL TIMER_INIT

;MAIN:
;ACALL DISPLAY
;AJMP MAIN

;DISPLAY:
;MOV A,R4
;MOV B,#100
;DIV AB
;MOV 30H,#15
;MOV 31H,A
;MOV A,B
;MOV B,#10
;DIV AB
;MOV 32H,A
;MOV 33H,B

;MOV	R0,#30H
;MOV	R1,#0FEH
;MOV	R2,#0
;MOV	DPTR,#NUM

;L1: MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R1
;MOV P2,A
;NOP
;MOV P2,#0FFH
;RL A
;MOV R1,A
;INC R0
;INC R2
;CJNE R2,#4,L1
;RET

;TIMER_INIT:
;MOV TMOD,#16H
;MOV TH1,#HIGH(-50000)
;MOV TL1,#LOW(-50000)
;MOV TH0,#0
;MOV TL0,#0
;SETB ET1
;SETB EA
;SETB TR1
;SETB TR0
;RET
;T1_IN:
;INC R5
;CJNE R5,#20,OUT
;MOV R5,#0;此处必须将次清零,等待下一次统计频率,不然之后就无法统计了,要形成持续的一秒中断
;MOV R4,TL0
;MOV TL0,#0
;OUT:
;MOV TH1,#HIGH(-50000)
;MOV TL1,#LOW(-50000)
;RETI
;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H,40H
;END

;简易电子钟程序编写
;头脑中一定要清楚逻辑,不要混乱,明确每一步执行后会发生什么,
;自己定义的变量在每一步完了后会变成什么一定要明确
;ORG 0000H
;AJMP START
;ORG 000BH
;AJMP T0_IN
;ORG 0100H

;START:
;FLAG BIT 20H.1
;MOV R6,#0
;MOV R3,#0;一秒计时标志
;MOV 40H,#0;一分钟计时标志
;MOV R4,#59;初始化分钟数
;MOV 41H,#0;一小时及时标志
;MOV R5,#23;初始化小时
;MOV TMOD,#01H
;MOV TH0,#HIGH(-50000)
;MOV TL0,#LOW(-50000)
;SETB ET0
;SETB EA
;SETB TR0

;MAIN:
;ACALL DISPLAY
;AJMP MAIN

;T0_IN:
;INC R3
;CJNE R3,#20,OUT
;CPL FLAG
;MOV R3,#0
;INC 40H;一秒时间到,对秒计时标志加1
;MOV R6,40H
;CJNE R6,#60,OUT
;MOV 40H,#0
;INC R4;一分时间到,对分钟显示加1
;INC 41H;一分时间到,对分钟计时标志加1
;CJNE R4,#60,OUT
;MOV R5,#0
;MOV R4,#0
;MOV R6,41H
;CJNE R6,#60,OUT
;MOV 41H,#0;一小时时间到
;INC R5;一小时时间到,对小时显示加1
;CJNE R5,#24,OUT
;MOV R5,#0

;OUT:
;MOV TH0,#HIGH(-50000)
;MOV TL0,#LOW(-50000)
;RETI

;DISPLAY:
;MOV A,R5
;MOV B,#10
;DIV AB
;MOV 30H,A
;MOV 31H,B
;MOV A,R4
;MOV B,#10
;DIV AB
;MOV 32H,A
;MOV 33H,B

;MOV	R0,#30H
;MOV	R1,#07FH
;MOV	R2,#0

;L1:
;MOV DPTR,#NUM
;MOV A,@R0
;MOVC A,@A+DPTR
;MOV P0,A
;MOV A,R1
;RL A
;MOV R1,A
;MOV P2,A
;NOP
;MOV P2,#0FFH

;JB	FLAG,L2
;CJNE	R2,#1,L2
;MOV	A,#16
;MOVC	A,@A+DPTR
;MOV	P0,A
;MOV	P2,R3
;NOP
;MOV	P2,#0FFH

;L2:
;INC R0
;INC R2
;CJNE R2,#4,L1
;RET

;NUM:
;DB 3FH, 06H, 5BH, 4FH
;DB 66H, 6DH, 7DH, 07H
;DB 7FH, 6FH, 77H, 7CH
;DB 39H, 5EH, 79H, 71H,80H
;END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

authenticcc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值