汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx

上传人:b****9 文档编号:26162983 上传时间:2023-06-17 格式:DOCX 页数:11 大小:17.59KB
下载 相关 举报
汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx_第1页
第1页 / 共11页
汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx_第2页
第2页 / 共11页
汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx_第3页
第3页 / 共11页
汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx_第4页
第4页 / 共11页
汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx

《汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx》由会员分享,可在线阅读,更多相关《汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx(11页珍藏版)》请在冰豆网上搜索。

汇编语言在两个数码管上实现0099的循环显示之欧阳历创编.docx

汇编语言在两个数码管上实现0099的循环显示之欧阳历创编

;此法度为在两个数码管上实现0099的循环显示

时间:

2021.02.09

创作人:

欧阳历

;设置ram

DATA_INDATA20H;接收数据缓冲寄存器

DATA_OUTDATA21H;发送数据缓冲寄存器

BIT_COUNTDATA22H;数据位数寄存器

//HOURDATA23H

//MINITEDATA24H

//SECONDDATA25H

//MSECONDDATA26H

ORG0000H

LJMPINIT

ORG000BH

LJMPTIME0;按时器0中断入口

ORG0013H

LJMPKBHIT

;初始化

ORG0030H

INIT:

MOVDPTR,#4000H;HD7279A的地址

MOVA,#10011111B;HD7279A初始化CS、CLK、DATA

MOVX@DPTR,A

LCALLDELAY25MS;延时后进入工作状态

MOVDATA_OUT,#10100100B;HD7279A复位指令

LCALLSEND;发送指令

MOVA,#10011111B;设回CS为高电平

MOVX@DPTR,A

//MOVR4,#20;按时器一个周期内的中断数

MOVR2,#0

MOVR3,#0

MOVR4,#0

MOVR5,#0

//MOVMSECOND,#0

//MOVSECOND,#0

//MOVMINITE,#0

//MOVHOUR,#0;数字计数器

MOVR6,#0;个位寄存器

MOVR7,#0;十位寄存器

MOVTMOD,#1;设置按时器0工作模式为方法1

//MOVTH0,#3CH;设置按时器按时值

//MOVTL0,#0B0H

MOVTH0,#0FCH;设置按时器按时值

MOVTL0,#18H

SETBEA;开总中断

SETBET0;开按时器0中断

SETBEX1

SETBTR0;开始计时

;主法度

MAIN:

MOVA,R2;把数字转换为2个BCD码

MOVB,#10

DIVAB

MOVR6,B;个位放在R6

MOVR7,A;十位放在R7

MOVDATA_OUT,#11001000B;下载数据且按方法1译码,找到了第1个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R1;指令的数据部分,显示个位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

MOVDATA_OUT,#11001001B;下载数据且按方法1译码,找到了第2个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R2;指令的数据部分,显示个位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

MOVDATA_OUT,#11001010B;下载数据且按方法1译码,找到了第3个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R3;指令的数据部分,显示个位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

//LCALLDELAY1MS;显示延时

MOVA,R4;把数字转换为2个BCD码

MOVB,#10

DIVAB

MOVR6,B;个位放在R6

MOVR7,A;十位放在R7

MOVDATA_OUT,#11001011B;下载数据且按方法1译码,找到了第4个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R6;指令的数据部分,显示个位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

//LCALLDELAY1MS;显示延时

MOVDATA_OUT,#11001100B;下载数据且按方法1译码,找到了第5个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R7;指令的数据部分,显示十位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

//LCALLDELAY1MS;显示延时

MOVA,R5;把数字转换为2个BCD码

MOVB,#10

DIVAB

MOVR6,B;个位放在R6

MOVR7,A;十位放在R7

MOVDATA_OUT,#11001101B;下载数据且按方法1译码,找到了第6个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R6;指令的数据部分,显示个位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

//LCALLDELAY1MS;显示延时

MOVDATA_OUT,#11001110B;下载数据且按方法1译码,找到了第7个数码管

LCALLSEND

LCALLDELAY25;T4,指令与数据时间间隔

MOVDATA_OUT,R7;指令的数据部分,显示十位

LCALLSEND

MOVA,#10011111B

MOVX@DPTR,A

//LCALLDELAY1MS;显示延时

LJMPMAIN;下一循环

SJMP$

;发送子法度

SEND:

CLRET0;加锁

MOVBIT_COUNT,#8;无论指令还是数据,一次只发送8位

MOVA,#00011111B;设CS为低电平

MOVX@DPTR,A

LCALLDELAY50;T1,从CS下降沿至CLK脉冲时间

;发送循环,HD7279A采取串行方法与微处理器通讯,一次发送一位

SENDLOOP:

MOVA,DATA_OUT;取出发送的指令或数据

MOVC,ACC.7;串行发送从高位到低位发送,故先取最高位

MOVA,#00011111B;输出到DAT位

MOVACC.5,C

MOVX@DPTR,A

SETBC;设CLK为高电平

MOVACC.6,C

MOVX@DPTR,A

LCALLDELAY8;T2,传送指令时CLK脉冲宽度

CLRC;设CLK为低电平

MOVACC.6,C

MOVX@DPTR,A

LCALLDELAY8;T3,字节传送中CLK脉冲时间

MOVA,DATA_OUT;移位待发送的指令或数据,为下一位的发送作准备

RLA

MOVDATA_OUT,A

DJNZBIT_COUNT,SENDLOOP;发送不到8位,继续循环

MOVA,#00011111B;发送完毕,恢复DAT

MOVX@DPTR,A

SETBET0;释放锁

RET

;接收子法度(本法度中用不到,但在添加按键操纵的时候用于读取键值)

RECEIVE:

CLRET0;加锁

MOVBIT_COUNT,#8;接收8位数据

MOVDATA_IN,#0;清空接收数据缓冲寄存器

MOVA,#00111111B;设CS为低电平,同时包管DAT为高电平(输入状态)

MOVX@DPTR,A

LCALLDELAY25;T5,读键盘指令中指令与数据时间间隔

;接收循环,HD7279A采取串行方法与微处理器通讯,一次接收一位

RECEIVELOOP:

SETBACC.6;设CS为高电平

MOVX@DPTR,A

LCALLDELAY8;T6,输出键盘数据建立时间

MOVA,DATA_IN;接收数据缓冲寄存器向左移位,准备接收一位数据,数据的高位会先发送

RLA

MOVDATA_IN,A

MOVXA,@DPTR;读取数据

MOVC,ACC.5;取出数据位DAT

MOVA,DATA_IN

MOVACC.0,C

MOVDATA_IN,A;数据放进接收数据缓冲寄存器

MOVA,#00111111B;设CS为低电平,同时包管DAT为高电平(输入状态)

MOVX@DPTR,A

LCALLDELAY8;T7,读键盘数据是CLK脉冲宽

DJNZBIT_COUNT,RECEIVELOOP;接收不到8位,继续循环

MOVA,#00011111B;接收完毕,恢复DAT

MOVX@DPTR,A

SETBET0;释放锁

RET

;按时器0中断法度

TIME0:

//DJNZR4,NEXT;按时器一个周期内中断数不敷就继续计时

INCR2;数字加1

//MOVR4,#20;重置按时器一个周期内中断数

CJNER2,#100,NEXT;数字不敷100继续加1

MOVR2,#0;数字达到100就清零

INCR3

CJNER3,#10,NEXT

MOVR3,#0

INCR4

CJNER4,#60,NEXT

MOVR4,#0

INCR5

CJNER5,#60,NEXT

MOVR5,#0

NEXT:

MOVTH0,#0FCH;按时器方法1中断后需要重新设置按时器按时值

MOVTL0,#18H

RETI

KBHIT:

PUSHPSW

PUSHACC

PUSHDPH

PUSHDPL

PUSHDATA_OUT

PUSHBIT_COUNT

MOVA,R0

PUSHACC

MOVA,R1

PUSHACC

MOVDATA_OUT,#00010101B

LCALLSEND

LCALLDELAY25

LCALLRECEIVE

MOVA,DATA_IN

JZSTART

DECA

DECA

JZSTOP

DECA

JZCLEAR

SJMPOUT

START:

SETBTR0

SJMPOUT

STOP:

CLRTR0

SJMPOUT

CLEAR:

MOVR2,#0

MOVR3,#0

MOVR4,#0

MOVR5,#0

OUT:

POPACC

MOVR1,A

POPACC

MOVR0,A

POPBIT_COUNT

POPDATA_OUT

POPDPL

POPDPH

POPACC

POPPSW

RETI

;延时25ms子法度

DELAY25MS:

MOVR0,#49

D11:

MOVR1,#253

NOP

D12:

DJNZR1,D12

DJNZR0,D11

RET

;延时50μs子法度

DELAY50:

MOVR0,#23

NOP

D21:

DJNZR0,D21

RET

;延时25μs子法度

DELAY25:

MOVR0,#11

D31:

DJNZR0,D31

RET

;延时8μs子法度

DELAY8:

MOVR0,#2

NOP

D41:

DJNZR0,D41

RET

;延时1ms子法度

DELAY1MS:

MOVR0,#2

NOP

D51:

MOVR1,#247

NOP

D52:

DJNZR1,D52

DJNZR0,D51

RET

END

时间:

2021.02.09

创作人:

欧阳历

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1