admin 管理员组

文章数量: 887021


2024年1月26日发(作者:margin函数)

;此程序为在两个数码管上实现00-99的循环显示

;设置ram

DATA_IN DATA 20H ;接收数据缓冲寄存器

DATA_OUT DATA 21H ;发送数据缓冲寄存器

BIT_COUNT DATA 22H ;数据位数寄存器

// HOUR DATA 23H

// MINITE DATA 24H

// SECOND DATA 25H

// MSECOND

ORG

LJMP

ORG

LJMP

ORG

LJMP

;初始化

ORG

INIT: MOV

MOV

DATA

MOVX

LCALL

MOV

LCALL

MOV

MOVX

// MOV

MOV

MOV

MOV

MOV

// MOV

// MOV

// MOV

// MOV

MOV

MOV

DATA 26H

0000H

INIT

000BH

TIME0 ;定时器0中断入口

0013H

KBHIT

0030H

DPTR,#4000H ;HD7279A的地址

A,#10011111B ;HD7279A初始化CS、CLK、@DPTR,A

DELAY25MS ;延时后进入工作状态

DATA_OUT,#10100100B ;HD7279A复位指令

SEND ;发送指令

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

@DPTR,A

R4,#20 ;定时器一个周期内的中断数

R2,#0

R3,#0

R4,#0

R5,#0

MSECOND,#0

SECOND,#0

MINITE,#0

HOUR,#0 ;数字计数器

R6,#0 ;个位寄存器

R7,#0 ;十位寄存器

MOV TMOD,#1 ;设置定时器0工作模式为方式1

// MOV TH0,#3CH ;设置定时器定时值

// MOV TL0,#0B0H

MOV TH0,#0FCH ;设置定时器定时值

MOV TL0,#18H

SETB EA ;开总中断

SETB ET0 ;开定时器0中断

SETB EX1

SETB TR0 ;开始计时

;主程序

MAIN: MOV A,R2 ;把数字转换为2个BCD码

MOV B,#10

DIV AB

MOV R6,B ;个位放在R6

MOV R7,A ;十位放在R7

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

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

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

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

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

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

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

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

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

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

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

LCALL SEND

MOV A,#10011111B

MOVX

// LCALL

MOV

MOV

DIV

MOV

MOV

MOV

找到了第4个数码管

LCALL

LCALL

MOV

LCALL

MOV

MOVX

// LCALL

MOV

找到了第5个数码管

LCALL

LCALL

MOV

LCALL

MOV

MOVX

// LCALL

MOV

MOV

DIV

MOV

MOV

MOV

找到了第6个数码管

LCALL

LCALL

MOV

LCALL

MOV

MOVX

// LCALL

@DPTR,A

DELAY1MS ;显示延时

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

B,#10

AB

R6,B ;个位放在R6

R7,A ;十位放在R7

DATA_OUT,#11001011B ;下载数据且按方式1译码,SEND

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

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

SEND

A,#10011111B

@DPTR,A

DELAY1MS ;显示延时

DATA_OUT,#11001100B ;下载数据且按方式1译码,SEND

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

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

SEND

A,#10011111B

@DPTR,A

DELAY1MS ;显示延时

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

B,#10

AB

R6,B ;个位放在R6

R7,A ;十位放在R7

DATA_OUT,#11001101B ;下载数据且按方式1译码,SEND

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

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

SEND

A,#10011111B

@DPTR,A

DELAY1MS ;显示延时

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

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

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

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

// LCALL DELAY1MS ;显示延时

LJMP MAIN ;下一循环

SJMP $

;发送子程序

SEND: CLR ET0 ;加锁

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

MOV A,#00011111B ;设CS为低电平

MOVX @DPTR,A

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

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

SENDLOOP: MOV A,DATA_OUT ;取出发送的指令或数据

MOV ;串行发送从高位到低位发送,故先取最高位

MOV A,#00011111B ;输出到DAT位

MOV ACC.5,C

MOVX @DPTR,A

SETB C ;设CLK为高电平

MOV ACC.6,C

MOVX @DPTR,A

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

CLR C ;设CLK为低电平

MOV ACC.6,C

MOVX @DPTR,A

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

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

RL A

MOV DATA_OUT,A

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

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

MOVX @DPTR,A

SETB ET0 ;释放锁

RET

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

RECEIVE: CLR ET0 ;加锁

MOV BIT_COUNT,#8 ;接收8位数据

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

MOV A,#00111111B ;设CS为低电平,同时保证DAT为高电平(输入状态)

MOVX @DPTR,A

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

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

RECEIVELOOP:SETB ;设CS为高电平

MOVX @DPTR,A

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

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

RL A

MOV DATA_IN,A

MOVX A,@DPTR ;读取数据

MOV ;取出数据位DAT

MOV A,DATA_IN

MOV ACC.0,C

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

MOV A,#00111111B ;设CS为低电平,同时保证DAT为高电平(输入状态)

MOVX @DPTR,A

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

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

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

MOVX @DPTR,A

SETB ET0 ;释放锁

RET

;定时器0中断程序

TIME0:

// DJNZ R4,NEXT ;定时器一个周期内中断数不够就继续计时

INC R2 ;数字加1

// MOV R4,#20 ;重置定时器一个周期内中断数

CJNE R2,#100,NEXT ;数字不够100继续加1

MOV R2,#0

INC R3

CJNE R3,#10,NEXT

MOV R3,#0

INC R4

CJNE R4,#60,NEXT

MOV R4,#0

INC R5

;数字到达100就清零

CJNE

MOV

NEXT: MOV

设置定时器定时值

MOV

RETI

KBHIT: PUSH

PUSH

PUSH

PUSH

PUSH

PUSH

MOV

PUSH

MOV

PUSH

MOV

LCALL

LCALL

LCALL

MOV

JZ

DEC

DEC

JZ

DEC

JZ

SJMP

START: SETB

SJMP

STOP: CLR

R5,#60,NEXT

R5,#0

TH0,#0FCH

TL0,#18H

PSW

ACC

DPH

DPL

DATA_OUT

BIT_COUNT

A,R0

ACC

A,R1

ACC

DATA_OUT,#00010101B

SEND

DELAY25

RECEIVE

A,DATA_IN

START

A

A

STOP

A

CLEAR

OUT

TR0

OUT

TR0

;定时器方式1中断后需要重新

SJMP OUT

CLEAR: MOV R2,#0

MOV R3,#0

MOV R4,#0

MOV R5,#0

OUT: POP ACC

MOV R1,A

POP ACC

MOV R0,A

POP BIT_COUNT

POP DATA_OUT

POP DPL

POP DPH

POP ACC

POP PSW

RETI

;延时25ms子程序

DELAY25MS: MOV R0,#49

D11: MOV R1,#253

NOP

D12: DJNZ R1,D12

DJNZ R0,D11

RET

;延时50μs子程序

DELAY50: MOV R0,#23

NOP

D21: DJNZ R0,D21

RET

;延时25μs子程序

DELAY25: MOV R0,#11

D31: DJNZ R0,D31

RET

;延时8μs子程序

DELAY8: MOV R0,#2

NOP

D41: DJNZ R0,D41

RET

;延时1ms子程序

DELAY1MS: MOV

NOP

D51: MOV

NOP

D52: DJNZ

DJNZ

RET

END

R0,#2

R1,#247

R1,D52

R0,D51


本文标签: 数据 指令 方式 时间 发送