+ -
当前位置:首页 → 问答吧 → 16*16点阵显示原理及代码解释

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
就是看不懂为什么会是这样的?还有如果左右显示又该怎样呢?

作者: lxy15329   发布时间: 2011-01-12

MARK

作者: znxllyuan   发布时间: 2011-01-12

晕倒ing

作者: masmaster   发布时间: 2011-01-12