16*16点阵显示原理及代码解释
时间:2011-01-12
来源:互联网
;用8255的PA、PB、PC口和8155的PA口做LED16*16点阵显示实验
.MODEL TINY
ADDR_8255_PA EQU 0F000H ;8255 PA口
ADDR_8255_PB EQU 0F001H ;8255 PB口
ADDR_8255_PC EQU 0F002H ;8255 PC口
ADDR_8255_C EQU 0F003H ;8255控制口
ADDR_8155_PA EQU 0E101H ;8155 PA口
ADDR_8155_C EQU 0E100H ;8155控制口
LINE1 EQU ADDR_8255_PA ;行线1
LINE2 EQU ADDR_8255_PB ;行线2
ROW1 EQU ADDR_8255_PC ;列线1
ROW2 EQU ADDR_8155_PA ;列线2
.STACK 100
.DATA
HUAN DB 00H,0C0H,00H,0C0H,0FEH,0C0H,07H,0FFH,0C7H,86H,6FH,6CH,3CH,60H,18H,60H
DB 1CH,60H,1CH,70H,36H,0F0H,36H,0D8H,61H,9CH,0C7H,0FH,3CH,06H,00H,00H
YING DB 60H,00H,31H,0C0H,3FH,7EH,36H,66H,06H,66H,06H,66H,0F6H,66H,36H,66H
DB 37H,0E6H,37H,7EH,36H,6CH,30H,60H,30H,60H,78H,00H,0CFH,0FFH,00H,00H
SHI DB 00H,00H,06H,30H,07H,30H,0FH,0FFH,0CH,30H,1FH,0FFH,3BH,33H,7BH,33H
DB 1BH,0FFH,1BH,33H,19H,0B0H,18H,0E0H,18H,60H,18H,0FCH,19H,8FH,1FH,03H
YONG DB 0,0,1FH,0FEH,18H,0C6H,18H,0C6H,18H,0C6H,1FH,0FEH,018H,0C6H,18H,0C6H
DB 18H,0C6H,1FH,0FEH,18H,0C6H,18H,0C6H,30H,0C6H,30H,0C6H,60H,0DEH,0C0H,0CCH
XING DB 00H,00H,1FH,0FCH,18H,0CH,1FH,0FCH,18H,0CH,1FH,0FCH,01H,80H,19H,80H
DB 1FH,0FEH,31H,80H,31H,80H,6FH,0FCH,01H,80H,01H,80H,7FH,0FFH,00H,00H
YAN DB 0,0,0FFH,0FFH,18H,0CCH,18H,0CCH,30H,0CCH,30H,0CCH,7FH,0FFH,7CH,0CCH
DB 0FCH,0CCH,3CH,0CCH,3CH,0CCH,3DH,8CH,3DH,8CH,33H,0CH,06H,0CH,0CH,0CH
SHI0 DB 01H,80H,00H,0C0H,3FH,0FFH,3CH,06H,67H,0CCH,06H,0C0H,0CH,0C0H,07H,0C0H
DB 06H,0C0H,7FH,0FFH,00H,0C0H,01H,0E0H,03H,30H,06H,18H,1CH,1CH,70H,18H
YAN0 DB 00H,00H,0FCH,60H,0CH,60H,6CH,0F0H,6CH,0D8H,6DH,8FH,6FH,0F8H,7EH,00H
DB 06H,0C6H,07H,66H,3FH,0ECH,0E7H,0ECH,06H,18H,1FH,0FFH,0CH,00H,00H,00H
YI DB 0CH,0C0H,0CH,60H,18H,7CH,1BH,6CH,33H,0CH,73H,18H,0F1H,98H,31H,98H
DB 30H,0F0H,30H,0F0H,30H,60H,30H,0F0H,31H,98H,33H,0FH,3EH,06H,30H,00H
NONE DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL INIT_IO
CALL TEST_LED ;调用测试子程序,测试LED是否全亮
CALL CLEAR
;滚动显示多个字符
CHS_SHOW: MOV CX,9
LEA SI,HUAN
CHS_1: PUSH CX
MOV CX,16
CHS_2: CALL DISP_CH
INC SI
INC SI
LOOP CHS_2
POP CX
LOOP CHS_1
JMP CHS_SHOW
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址
DISP_CH PROC NEAR
PUSH CX
MOV CX,8
DISP_CH_1: CALL DISP1
LOOP DISP_CH_1
POP CX
RET
DISP_CH ENDP
;显示一个16*16点阵字子程序,字型码放在显示缓冲区XBUFF
DISP1 PROC NEAR
PUSH SI
PUSH CX
MOV CX,16 ;计数器,16列依次被扫描
MOV BL,0FEH ;上边列输出值
MOV BH,0FFH ;下边列输出值
REPEAT: MOV DX,LINE1
MOV AL,BL
OUT DX,AL ;上边列输出
MOV DX,LINE2
MOV AL,BH
OUT DX,AL ;下边列输出
LODSB
CALL ADJUST ;调整AL,将AL中二进制数旋转180度
MOV DX,ROW1
OUT DX,AL ;左边行输出
LODSB
CALL ADJUST ;调整AL,将AL中二进制数旋转180度
MOV DX,ROW2
OUT DX,AL ;右边行输出
CALL DL10MS
CALL CLEAR
STC
RCL BL,1
RCL BH,1 ;循环移位BX,行线扫描输出0
LOOP REPEAT
POP CX
POP SI
RET
DISP1 ENDP
INIT_IO PROC NEAR
MOV DX,ADDR_8255_C ;8255控制字地址
MOV AL,80H ;设置8255的PA、PB、PC口为输出口
OUT DX,AL ;写控制字
MOV DX,ADDR_8155_C ;8155控制字地址
MOV AL,03H ;设置8155的PA口为输出
OUT DX,AL ;写控制字
RET
INIT_IO ENDP
CLEAR PROC NEAR
MOV AL,0FFH
MOV DX,LINE1
OUT DX,AL
MOV DX,LINE2
OUT DX,AL
MOV AL,0
MOV DX,ROW1
OUT DX,AL
MOV DX,ROW2
OUT DX,AL
RET
CLEAR ENDP
;测试LED子程序,点亮LED并延时1S
TEST_LED PROC NEAR
MOV DX,LINE1
XOR AL,AL
OUT DX,AL
MOV DX,LINE2
OUT DX,AL
MOV AL,0FFH
MOV DX,ROW1
OUT DX,AL
MOV DX,ROW2
OUT DX,AL
CALL DL500ms
CALL DL500ms
RET
TEST_LED ENDP
;调整AL中取到的字型码的一个字节,将最高位调整位最低位,最低位调整为最高位
ADJUST PROC NEAR
PUSH CX
MOV CX,8
ADJUST1: RCL AL,1
XCHG AL,AH
RCR AL,1
XCHG AL,AH
LOOP ADJUST1
MOV AL,AH
POP CX
RET
ADJUST ENDP
DL10ms PROC NEAR
PUSH CX
MOV CX,133
LOOP $
POP CX
RET
DL10ms ENDP
DL500ms PROC NEAR
PUSH CX
MOV CX,0FFFFH
LOOP $
POP CX
RET
DL500ms ENDP
END START
就是看不懂为什么会是这样的?还有如果左右显示又该怎样呢?
.MODEL TINY
ADDR_8255_PA EQU 0F000H ;8255 PA口
ADDR_8255_PB EQU 0F001H ;8255 PB口
ADDR_8255_PC EQU 0F002H ;8255 PC口
ADDR_8255_C EQU 0F003H ;8255控制口
ADDR_8155_PA EQU 0E101H ;8155 PA口
ADDR_8155_C EQU 0E100H ;8155控制口
LINE1 EQU ADDR_8255_PA ;行线1
LINE2 EQU ADDR_8255_PB ;行线2
ROW1 EQU ADDR_8255_PC ;列线1
ROW2 EQU ADDR_8155_PA ;列线2
.STACK 100
.DATA
HUAN DB 00H,0C0H,00H,0C0H,0FEH,0C0H,07H,0FFH,0C7H,86H,6FH,6CH,3CH,60H,18H,60H
DB 1CH,60H,1CH,70H,36H,0F0H,36H,0D8H,61H,9CH,0C7H,0FH,3CH,06H,00H,00H
YING DB 60H,00H,31H,0C0H,3FH,7EH,36H,66H,06H,66H,06H,66H,0F6H,66H,36H,66H
DB 37H,0E6H,37H,7EH,36H,6CH,30H,60H,30H,60H,78H,00H,0CFH,0FFH,00H,00H
SHI DB 00H,00H,06H,30H,07H,30H,0FH,0FFH,0CH,30H,1FH,0FFH,3BH,33H,7BH,33H
DB 1BH,0FFH,1BH,33H,19H,0B0H,18H,0E0H,18H,60H,18H,0FCH,19H,8FH,1FH,03H
YONG DB 0,0,1FH,0FEH,18H,0C6H,18H,0C6H,18H,0C6H,1FH,0FEH,018H,0C6H,18H,0C6H
DB 18H,0C6H,1FH,0FEH,18H,0C6H,18H,0C6H,30H,0C6H,30H,0C6H,60H,0DEH,0C0H,0CCH
XING DB 00H,00H,1FH,0FCH,18H,0CH,1FH,0FCH,18H,0CH,1FH,0FCH,01H,80H,19H,80H
DB 1FH,0FEH,31H,80H,31H,80H,6FH,0FCH,01H,80H,01H,80H,7FH,0FFH,00H,00H
YAN DB 0,0,0FFH,0FFH,18H,0CCH,18H,0CCH,30H,0CCH,30H,0CCH,7FH,0FFH,7CH,0CCH
DB 0FCH,0CCH,3CH,0CCH,3CH,0CCH,3DH,8CH,3DH,8CH,33H,0CH,06H,0CH,0CH,0CH
SHI0 DB 01H,80H,00H,0C0H,3FH,0FFH,3CH,06H,67H,0CCH,06H,0C0H,0CH,0C0H,07H,0C0H
DB 06H,0C0H,7FH,0FFH,00H,0C0H,01H,0E0H,03H,30H,06H,18H,1CH,1CH,70H,18H
YAN0 DB 00H,00H,0FCH,60H,0CH,60H,6CH,0F0H,6CH,0D8H,6DH,8FH,6FH,0F8H,7EH,00H
DB 06H,0C6H,07H,66H,3FH,0ECH,0E7H,0ECH,06H,18H,1FH,0FFH,0CH,00H,00H,00H
YI DB 0CH,0C0H,0CH,60H,18H,7CH,1BH,6CH,33H,0CH,73H,18H,0F1H,98H,31H,98H
DB 30H,0F0H,30H,0F0H,30H,60H,30H,0F0H,31H,98H,33H,0FH,3EH,06H,30H,00H
NONE DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL INIT_IO
CALL TEST_LED ;调用测试子程序,测试LED是否全亮
CALL CLEAR
;滚动显示多个字符
CHS_SHOW: MOV CX,9
LEA SI,HUAN
CHS_1: PUSH CX
MOV CX,16
CHS_2: CALL DISP_CH
INC SI
INC SI
LOOP CHS_2
POP CX
LOOP CHS_1
JMP CHS_SHOW
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址
DISP_CH PROC NEAR
PUSH CX
MOV CX,8
DISP_CH_1: CALL DISP1
LOOP DISP_CH_1
POP CX
RET
DISP_CH ENDP
;显示一个16*16点阵字子程序,字型码放在显示缓冲区XBUFF
DISP1 PROC NEAR
PUSH SI
PUSH CX
MOV CX,16 ;计数器,16列依次被扫描
MOV BL,0FEH ;上边列输出值
MOV BH,0FFH ;下边列输出值
REPEAT: MOV DX,LINE1
MOV AL,BL
OUT DX,AL ;上边列输出
MOV DX,LINE2
MOV AL,BH
OUT DX,AL ;下边列输出
LODSB
CALL ADJUST ;调整AL,将AL中二进制数旋转180度
MOV DX,ROW1
OUT DX,AL ;左边行输出
LODSB
CALL ADJUST ;调整AL,将AL中二进制数旋转180度
MOV DX,ROW2
OUT DX,AL ;右边行输出
CALL DL10MS
CALL CLEAR
STC
RCL BL,1
RCL BH,1 ;循环移位BX,行线扫描输出0
LOOP REPEAT
POP CX
POP SI
RET
DISP1 ENDP
INIT_IO PROC NEAR
MOV DX,ADDR_8255_C ;8255控制字地址
MOV AL,80H ;设置8255的PA、PB、PC口为输出口
OUT DX,AL ;写控制字
MOV DX,ADDR_8155_C ;8155控制字地址
MOV AL,03H ;设置8155的PA口为输出
OUT DX,AL ;写控制字
RET
INIT_IO ENDP
CLEAR PROC NEAR
MOV AL,0FFH
MOV DX,LINE1
OUT DX,AL
MOV DX,LINE2
OUT DX,AL
MOV AL,0
MOV DX,ROW1
OUT DX,AL
MOV DX,ROW2
OUT DX,AL
RET
CLEAR ENDP
;测试LED子程序,点亮LED并延时1S
TEST_LED PROC NEAR
MOV DX,LINE1
XOR AL,AL
OUT DX,AL
MOV DX,LINE2
OUT DX,AL
MOV AL,0FFH
MOV DX,ROW1
OUT DX,AL
MOV DX,ROW2
OUT DX,AL
CALL DL500ms
CALL DL500ms
RET
TEST_LED ENDP
;调整AL中取到的字型码的一个字节,将最高位调整位最低位,最低位调整为最高位
ADJUST PROC NEAR
PUSH CX
MOV CX,8
ADJUST1: RCL AL,1
XCHG AL,AH
RCR AL,1
XCHG AL,AH
LOOP ADJUST1
MOV AL,AH
POP CX
RET
ADJUST ENDP
DL10ms PROC NEAR
PUSH CX
MOV CX,133
LOOP $
POP CX
RET
DL10ms ENDP
DL500ms PROC NEAR
PUSH CX
MOV CX,0FFFFH
LOOP $
POP CX
RET
DL500ms ENDP
END START
就是看不懂为什么会是这样的?还有如果左右显示又该怎样呢?
作者: lxy15329 发布时间: 2011-01-12
MARK
作者: znxllyuan 发布时间: 2011-01-12
晕倒ing

作者: masmaster 发布时间: 2011-01-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28