;16*16点阵左移汇编程序
DS_595 EQU P1.5 ;串行数据输入(595-14)
CH_595 EQU P1.7 ;移位时钟脉冲(595-11)
CT_595 EQU P1.6 ;输出锁存器控制脉冲(595-12)
G_595 EQU P1.4
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME
ORG 0100H
MAIN: MOV SP,#60H
CLR G_595
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR0
SETB ET0
MOV R2,#2 ;滚动时间
MOV DPTR,#TAB
inc dptr
inc dptr
MOV 20H,DPH
MOV 21H,DPL
MOV DPTR,#TAB
SETB EA
SCA: MOV R1,DPH
MOV R5,DPL
MOV R3,#00H ;扫描信号初值
MOV R4,#00H
MOV 2fh,#0feH
SCA1:; MOV P3,R3
MOV A,R4
MOVC A,@A+DPTR
CALL WR_595;595串行输入,并行输出
NOP
NOP
INC R4
MOV A,R4
MOVC A,@A+DPTR
CALL WR_595;595串行输入,并行输出
NOP
NOP
CALL DEL
SETB CT_595 ;上升沿将数据送到输出锁存器,显示
NOP
NOP
CLR CT_595
INC R4;取码指针加1
call llsm
CALL DEL
INC R3
CJNE R3,#16,SCA1
LJMP SCA
DEL: MOV R6,#2
MOV R7,#248
DJNZ R7,$
DJNZ R6,$
RET
TIME: CLR EA
MOV 30H,A
PUSH 30H
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,LOOP
MOV R2,#2
CLR C
MOV A,R5
ADD A,#2
MOV R5,A
MOV DPL,R5
MOV A,R1
ADDC A,#0
MOV R1,A
MOV DPH,R1
CJNE A,20H,LOOP
MOV A,R5
CJNE A,21H,LOOP
MOV DPTR,#TAB
LOOP: POP 30H
MOV A,30H
SETB EA
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*****移位寄存器接收一个字节
WR_595: MOV R7,#08H ;一个字节数据(8位)
LOOP_: RLC A ;数据移位
MOV DS_595,C ;送数据到串行数据输入端上(P1.0)
CLR CH_595 ;拉低移位时钟
NOP
NOP
setb CH_595 ;上升沿发生移位(移入一数据)
DJNZ R7,LOOP_ ;一个字节数据没移完继续
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
llsm:;逐列扫描
CJNE R3,#8,JCC
JCC:JnC P00
MOV P2,#0FFH
MOV P0,2fH;扫描P0
MOV A,2fH
RL A
MOV 2fH,A
AJMP XX
P00:MOV P0,#0FFH
MOV P2,2fH;扫描P2
MOV A,2fH
RL A
MOV 2fH,A
XX:ret
TAB: DB 32,4,32,4,34,66,34,130,254,127,33,1,33,1,32,16;
DB 32,16,255,8,32,7,34,26,172,33,32,64,32,240,0,0;"我",0
DB 0,64,64,32,178,160,150,144,154,76,146,71,246,42,154,42;
DB 147,18,145,26,153,38,151,34,145,64,144,192,48,64,0,0;"爱",1
这种例子多不胜数:
http://hi.baidu.com/%B7%DB%B3%BE%B5%C4%CA%C0%BD%E7/blog/item/31855b6476cd8ed38cb10d4e.html
http://hi.baidu.com/jiangxue911/blog/item/be708894ff85d3047af480e0.html
http://hi.baidu.com/pnalson/blog/item/8c3ff1c8694774167e3e6fdc.html
你的这个不是乱码就有问题了!~
你仔细理解一下这段
void wr595(uchar dat)
{
uchar a;
for(a=8;a>0;a--)
{
SH_CP=0;
DS=dat&0x80;
dat<<=1;
SH_CP=1;
_nop_();
_nop_();
SH_CP=0;
_nop_();
_nop_();
SH_CP=1;
}
}
你的for循环是有问题的
以为你的每个字节移了多次
所以就乱码了
void wr595(uchar dat)
{
uchar a;
for(a=8;a>0;a--)
{
SH_CP=0;
DS=dat&0x80;
dat<<=1;
SH_CP=1;
_nop_();
_nop_();
}
}
你看看下面的
去掉一个
这个网上很多啦,去google能找到很多例子