//此程序主要是练习proteus中74ls595的使用方法(在程序的最后我再次说明一下)
//不过这个程序的仿真结果是对的,可是很郁闷,感觉不可思议,和自己想的不一样,总感觉是错的
//有谁也感觉到这个程序有错误,这是我的qq:117838621,我们可以探讨一下
CLK_0 EQU P3.2 ;伪指令
CLK_1 EQU P3.3
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: LCALL INIT ;调用INIT
MAIN_1: MOV R0,#30H
MOV R1,#7FH ;设置位选
MOV R2,#8 ;8位led需要8次循环
MAIN_2: MOV A,R1
LCALL LED ;调用位控制子程序
NOP ;就是这个地方我感觉到不对
MOV A,@R0
LCALL DAT ;调用数字显示程序
NOP
NOP
LCALL DELAY
INC R0 ;自加一,为下一位的显示做准备
MOV A,R1
RR A ;段选右移,控制下一位的显示
MOV R1,A
DJNZ R2,MAIN_2
SJMP MAIN_1
DAT: CLR CLK_0
MOV SBUF,A
JNB TI,$
CLR TI
SETB CLK_0
RET
LED: CLR CLK_1 ;清零时钟端
MOV SBUF,A ;发送位选控制信号
JNB TI,$ ;等待,如果TI为1
CLR TI
SETB CLK_1 ;置时钟信号
RET
INIT: MOV R0,#0
MOV R1,#30H
MOV R2,#8
MOV DPTR,#TAB ;取表首地址
INIT_1: MOV A,R0
MOVC A,@A+DPTR ;从表格中取数
MOV @R1,A ;保存所取的数
INC R0 ;自加,为下次取书做准备
INC R1
DJNZ R2,INIT_1 ;循环8次,将所有要在8个数码管上显示的数显示出来
RET
DELAY: MOV R5,#10
L2: MOV R6,#200
L1: MOV R7,#200
DJNZ R7,$
DJNZ R6,L1
DJNZ R5,L2
RET
TAB: DB 11111100B ;0
DB 01100000B ;1
DB 11011010B ;2
DB 11110010B ;3
DB 01100110B ;4
DB 10110110B ;5
DB 10111110B ;6
DB 11100000B ;7
END
//由74ls595的资料可以看出,有个tc_cp引脚,而只有在这个引脚的上升沿才能进去一位数据(并且里
//面的数据进行移位),但并不能输出,只有在sh_cp这个引脚的上升沿时,数据才能并行输出,
//而这个仿真图上(书上写的)竟然把单片机的RXD端接在ds端,TXD接在sh_cp上,这样并不符合资料所说
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』