📄 16x16.asm
字号:
;***********************************************************************
;要求1 滚动显示。先每行点亮, 扫描完成16行, 然后每列点亮,
; 扫描完16列,然后每点点亮,从最外圈跑完,然后次外圈,
;只到最中心轮流只到每一个点完成扫描。
;***********************************************************************
;考虑到单片机最小系统,不使用扩展。
;试验一下,没有 xl1000的实验仪 ,自己想的,使用 Proteus 6.9 做为硬件仿真
;考虑到单片机最小系统,不使用扩展,若想使用扩展,可以使用 74HC145 来开展I/O口
;本系统使用P0,P1 做高电平有效;P2,P3底电平有效;
;Proteus 6.9中没有16X16的点阵,所以用4片8X8点阵连成,
;* Create by :ng_cgj 于南阳
;=============================
ORG 0000H
MOV SP,#50H ;设堆栈指针
;逐行点亮(通过分别移位P0口,P1口来点亮各行)
ST1: MOV P1,#00H ;置P0口为底电平
MOV P0,#01H ;选中第1行
MOV P3,#00H ;置P3口为底电平
MOV P2,#00H ;置P2口为底电平
MOV R0,#08 ;设置移位的次数
LOOP: LCALL DELAY ;调用延时
MOV A,P0 ;读取P0口
RL A ;左移一位
MOV P0,A ;送值回P0口
DJNZ R0, LOOP ;判断移位8次数
MOV P0,#00H ;置P0口为底电平
MOV P1,#01H ;选中第9行
MOV R0,#08 ;设置移位的次数
LOOP2: LCALL DELAY ;调用延时
MOV P1,A ;读取P1口
RL A ;左移一位
MOV P1,A ;送值回P1口
DJNZ R0, LOOP2 ;判断移位8次数
MOV P1,#00H ;置P1口为底电平,熄灭最后一行
;逐列点亮(通过同时移位P2口,P3口来点亮各行)
ST2: MOV P0,#0FFH ;置P0口为高电平
MOV P1,#0FFH ;置P1口为高电平
MOV P3,#0FFH ;置P3口为高电平
MOV P2,#0FEH ;选中右边第1列
MOV R0,#08 ;设置移位的次数
LOOP3: LCALL DELAY ;调用延时
MOV A,P2 ;读取P2口
RL A ;左移一位
MOV P2,A ;送值回P2口
DJNZ R0,LOOP3 ;判断移位8次数
MOV P2,#0FFH ;置右8列为0
MOV P3,#0FEH ;选中第9列
MOV R0,#08 ;设置移位的次数
LOOP4: LCALL DELAY ;调用延时
MOV A,P3 ;读取P3口
RL A ;左移一位
MOV P3,A ;送值回P3口
DJNZ R0,LOOP4 ;判断移位8次数
MOV P3,#0FFH ;熄灭最后一列
;逐点点亮
ST5:
MOV 30H,#07 ;设置移位的次数
MOV B,#07 ;设置移位的次数
;行点点亮
MOV P0,#01H ;选中第1行
MOV P3,#0FFH ;置P3口为高电平
MOV P2,#0FEH ;点亮有上角第一点
MOV P1,#00H ;置P1口为底电平
ST4: MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P2RL ;调用P2口左移
MOV P2,#7FH ;点亮第8点
LCALL DELAY1 ;调用延时
ST6: MOV P2,#0FFH ;置P2口为高电平
MOV P3,#0FEH ;点亮第9点
LCALL DELAY1 ;调用延时
MOV R1,B ;取移位的次数的数值
LCALL P3RL ;调用P3口左移
;列点点亮
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P0RL ;调用P0口左移
MOV P0,#00H ;置P0口为底电平
MOV P1,#01H ;点亮列点
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P1RL ;调用P1口左移
;行点点亮
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P3RR ;调用P3口右移
MOV P2,#07FH ;点亮行点
MOV P3,#0FFH ;置P3口为高电平
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P2RR ;调用P2口右移
;列点点亮
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P1RR ;调用P1口右移
MOV P0,#80H ;点亮列点
MOV P1,#00H ;置P1口为底电平
LCALL DELAY1 ;调用延时
JC FOUR ;判断是否扫描到最后四点?
DEC 30H ;扫描完1圈,移位数减1
MOV B,30H ;保存移位数值
MOV R1,B ;取移位的次数的数值
LCALL DELAY1 ;调用延时
LCALL P0RR ;调用P0口右移
MOV A,30H ;取移位数值
CJNE A,#1,BACK ;比较循环的次数,没完则继续点亮下一点
;点亮最后4X4
MOV R1,#02 ;取移位的次数的数值
LCALL P2RL ;调用P2口左移
MOV P2,#0FFH ;置P2口为高电平
MOV P3,#0FEH
MOV 30H,#01 ;设置移位的次数的数值
MOV B,30H ;保存移位数值
SETB C ;置位C
LJMP ST6 ;没有点亮完,返回继续
;点亮最后4点
FOUR: MOV P2,#7FH ;点亮倒数第四点
LCALL DELAY1
MOV P2,#0FFH ;点亮倒数第三点
MOV P3,#0FEH
LCALL DELAY1
MOV P0,#00H ;点亮倒数第二点
MOV P1,#01H
MOV P3,#0FEH
LCALL DELAY1
MOV P2,#07FH ;点亮倒数第一点
MOV P1,#01H
MOV P3,#0FFH
LCALL DELAY1
WAIT: LCALL DELAY2 ;等待
LJMP ST1 ;重新开始
BACK: LJMP ST4 ;没有点亮完,返回继续
;移位子程序
P0RR: MOV A,P0 ;读取P0口
RR A ;右移
MOV P0,A ;送值回P0口
LCALL DELAY1 ;调用延时
DJNZ R1,P0RR ;判断移位次数
RET ;返回
P0RL: MOV A,P0
RL A
MOV P0,A
LCALL DELAY1
DJNZ R1,P0RL
RET
P1RL: MOV A,P1
RL A
MOV P1,A
LCALL DELAY1
DJNZ R1,P1RL
RET
P1RR: MOV A,P1
RR A
MOV P1,A
LCALL DELAY1
DJNZ R1,P1RR
RET
P2RL: MOV A,P2
RL A
MOV P2,A
LCALL DELAY1
DJNZ R1,P2RL
RET
P2RR: MOV A,P2
RR A
MOV P2,A
LCALL DELAY1
DJNZ R1,P2RR
RET
P3RL: MOV A,P3
RL A
MOV P3,A
LCALL DELAY1
DJNZ R1,P3RL
RET
P3RR: MOV A,P3
RR A
MOV P3,A
LCALL DELAY1
DJNZ R1,P3RR
RET
;延时子程序
DELAY1: MOV R6,#200 ;
DS3: MOV R7,#248
DS4: DJNZ R7,DS4
DJNZ R6,DS3
RET
DELAY: MOV R5,#5 ;
DS1: MOV R6,#100 ;
DS2: MOV R7,#248
DJNZ R7,$
DJNZ R6,DS2
DJNZ R5,DS1
RET
DELAY2: MOV R5,#100 ;
DS7: MOV R6,#100 ;
DS8: MOV R7,#248
DJNZ R7,$
DJNZ R6,DS8
DJNZ R5,DS7
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -