微机原理综合实验报告LED横向滚动显示方向修改电子钟修改实验.docx
《微机原理综合实验报告LED横向滚动显示方向修改电子钟修改实验.docx》由会员分享,可在线阅读,更多相关《微机原理综合实验报告LED横向滚动显示方向修改电子钟修改实验.docx(40页珍藏版)》请在冰豆网上搜索。
微机原理综合实验报告LED横向滚动显示方向修改电子钟修改实验
微机原理上机实验报告
综合实验:
1.LED16x16点阵显示实验
竖向显示改横向显示
2.电子钟功能修改
微机原理综合实验报告
综合实验1:
LED16x16点阵竖向显示改横向显示实验
一、实验目的
1、熟悉8255的功能,了解点阵显示的原理及控制方法;
2、学会使用LED点阵,通过编程显示不同字符;
3、认真预习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告。
二、实验内容
1、编写程序,用B4区的二片74HC273控制16X16点阵的行;8255的PA、PB口控制16X16点阵的列;显示字符。
2、按图连接线路;运行程序,观察实验结果,学会编程控制LED点阵显示字符。
三、实验原理图
四、实验步骤
1、连线说明:
D3区:
CS(8255)、A0、A1
——
A3区:
CS1、A0、A1
D3区:
JP23(PA)、JP20(PB)
——
A2区:
JP21、JP22(列输出线)
B4区:
JP57(D0..D7)
——
A3区:
JP42(D0..D7)
B4区:
JP56(D8..D15)
——
A3区:
JP40(D8..D15)
B4(I/O)区:
CS273、BLE、BHE
——
A3区:
CS5、BLE、BHE
B4(I/O)区:
RD、WR
——
A3区:
IOR、IOW
B4(I/O)区:
JP51、JP55
——
A2区:
JP14、JP15(行输出线)
(注意连线方向)
2、运行程序,观察实验结果。
运行演示程序将会看到字符“欢迎使用星研实验仪”在点阵上自下而上循环移动显示。
五、实验代码
对实验六中的代码做一定的修改,将原程序中使LED显示屏从上至下显示的功能改为从左至右滚动显示
有框线部分为修改部分
ADDR_8255_PAEQU270H;8255PA口
ADDR_8255_PBEQU271H;8255PB口
ADDR_8255_CEQU273H;8255控制口
ADDR_273EQU230H;IO区74HC273(16位I/O)
LINEEQUADDR_273;行线1,行线2
ROW1EQUADDR_8255_PA;列线1
ROW2EQUADDR_8255_PB;列线2
_STACKSEGMENTSTACK
DW1024DUP(?
)
_STACKENDS
_DATASEGMENTWORDPUBLIC'DATA'
HUAN
DB00H,0C0H,00H,0C0H,0FEH,0C0H,07H,0FFH,0C7H,86H,6FH,6CH,3CH,60H,18H,60H
DB1CH,60H,1CH,70H,36H,0F0H,36H,0D8H,61H,9CH,0C7H,0FH,3CH,06H,00H,00H
YING
DB60H,00H,31H,0C0H,3FH,7EH,36H,66H,06H,66H,06H,66H,0F6H,66H,36H,66H
DB37H,0E6H,37H,7EH,36H,6CH,30H,60H,30H,60H,78H,00H,0CFH,0FFH,00H,00H
SHI
DB00H,00H,06H,30H,07H,30H,0FH,0FFH,0CH,30H,1FH,0FFH,3BH,33H,7BH,33H
DB1BH,0FFH,1BH,33H,19H,0B0H,18H,0E0H,18H,60H,18H,0FCH,19H,8FH,1FH,03H
YONG
DB00,0,1FH,0FEH,18H,0C6H,18H,0C6H,18H,0C6H,1FH,0FEH,018H,0C6H,18H,0C6H
DB18H,0C6H,1FH,0FEH,18H,0C6H,18H,0C6H,30H,0C6H,30H,0C6H,60H,0DEH,0C0H,0CCH
XING
DB00H,00H,1FH,0FCH,18H,0CH,1FH,0FCH,18H,0CH,1FH,0FCH,01H,80H,19H,80H
DB1FH,0FEH,31H,80H,31H,80H,6FH,0FCH,01H,80H,01H,80H,7FH,0FFH,00H,00H
YAN
DB00H,00H,0FFH,0FFH,18H,0CCH,18H,0CCH,30H,0CCH,30H,0CCH,7FH,0FFH,7CH,0CCH
DB0FCH,0CCH,3CH,0CCH,3CH,0CCH,3DH,8CH,3DH,8CH,33H,0CH,06H,0CH,0CH,0CH
SHI0
DB01H,80H,00H,0C0H,3FH,0FFH,3CH,06H,67H,0CCH,06H,0C0H,0CH,0C0H,07H,0C0H
DB06H,0C0H,7FH,0FFH,00H,0C0H,01H,0E0H,03H,30H,06H,18H,1CH,1CH,70H,18H
YAN0
DB00H,00H,0FCH,60H,0CH,60H,6CH,0F0H,6CH,0D8H,6DH,8FH,6FH,0F8H,7EH,00H
DB06H,0C6H,07H,66H,3FH,0ECH,0E7H,0ECH,06H,18H,1FH,0FFH,0CH,00H,00H,00H
YI
DB0CH,0C0H,0CH,60H,18H,7CH,1BH,6CH,33H,0CH,73H,18H,0F1H,98H,31H,98H
DB30H,0F0H,30H,0F0H,30H,60H,30H,0F0H,31H,98H,33H,0FH,3EH,06H,30H,00H
NONE
DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
CHANGE_RESULT
DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
_DATAENDS
CODE
SEGMENT
START
PROC
NEAR
ASSUME
CS:
CODE,DS:
_DATA,SS:
_STACK
MOV
AX,_DATA
MOV
DS,AX
NOP
CALL
INIT_IO
CALL
TEST_LED
;调用测试子程序,测试LED是否全亮
CALL
CLEAR
LEA
SI,HUAN
;取首个汉字的有效地址
CHS_SHOW:
MOV
CX,9
;九个汉字
CALL
WORD_MOVE
;字模拷贝
CHS_1:
PUSH
CX
;CHS_1可以滚动显示多个字符
MOV
CX,16
CHS_2:
CALL
DISP_CH
;实现显示,DISP_CH可以把每个汉字的32个字节读完并显示出来
;INC
SI
;原程序用于滚动显示的指令
;INC
SI
LEASI,
CHANGE_RESULT
;除了第一次,每次的汉字读取都去CHANGE_RESULT找,只显示CHANGE_RESULT开头的32个字节
CALL
WORD_CHANGE
;将WORD_CHANGE中的字模左移一位
LOOP
CHS_2
POP
CX
LOOP
CHS_1
;读下一个汉字
CALL
WORD_MOVE
;字模复位
LEA
SI,CHANGE_RESULT
;显示复位
JMP
CHS_SHOW
WORD_MOVE
PROCNEAR
;给CHANGE_RESULT赋初值HUAN,把十个汉字都拷贝过来
PUSH
CX
PUSH
ES
PUSH
DS
PUSH
SI
PUSH
DI
LEA
SI,HUAN
源字节
LEA
DI,CHANGE_RESULT
;目的字节
MOV
AX,DS
MOV
ES,AX
MOV
CX,320
CLD
WORD_MOVE1:
MOVSB
;执行完毕后SI,DI自动加一
LOOPWORD_MOVE1
POP
DI
POP
SI
POP
DS
POP
ES
POP
CX
RET
WORD_MOVE
ENDP
WORD_CHANGE
PROC
NEAR
;把字模拷出来,将WORD_CHANGE中的字模全部整体左移一位
PUSH
CX
PUSH
DS
PUSH
ES
PUSH
SI
PUSH
BX
PUSHF
XOR
BX,BX
XOR
AX,AX
LEA
SI,CHANGE_RESULT
MOV
AX,DS
MOV
ES,AX
MOV
CX,320
MOVE_TO_LAST:
INC
SI
LOOPMOVE_TO_LAST
DEC
SI
DEC
SI
MOV
CX,16
;16行
WORD_CHANGE1:
CLC
;CF寄存器清零,为后续字节移动做准备
XOR
AX,AX
PUSH
CX
MOV
CX,10
;10个字
WORD_CHANGE2:
CMP
AL,AH
JZ
DONT_SAVE_CF2
;保存CF标志位
XOR
AX,AX
STC
DONT_SAVE_CF2:
MOV
BL,BYTEPTR[SI]
;循环右移
RCR
BL,1
MOV
[SI],BL
INCSI
;指向该行的下一个字节
MOV
BL,BYTEPTR[SI]
;循环右移
RCR
BL,1
MOV
[SI],BL
JNC
DONT_SAVE_CF
;保存CF标志位
MOVAL,01H
DONT_SAVE_CF:
SUB
SI,33
将SI指向下一个字
LOOPWORD_CHANGE2
ADD
SI,33
;补偿SI
POP
CX
ADD
SI,285
将SI移向上一行起点
LOOPWORD_CHANGE1
SUB
SI,285
;补偿SI
POPF
POP
BX
POP
SI
POP
ES
POP
DS
POP
CX
RET
WORD_CHANGEENDP
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址
DISP_CH
PROC
NEAR
;把每个汉字的32个字节读完
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
MOV
BL,0FEH
MOV
BH,0FFH
REPEAT:
MOV
AX,BX
OUT
DX,AX
LODSB
CALL
ADJUST
MOV
DX,ROW1
OUT
DX,AL
LODSB
CALL
ADJUST
MOV
DX,ROW2
OUT
DX,AL
CALL
DL10MS
CALL
CLEAR
STC
RCL
BL,1
RCL
BH,1
LOOP
REPEAT
POP
CX
POP
SI
RET
DISP1
ENDP
INIT_IO
PROC
NEAR
MOV
AL,80H
OUT
DX,AL
RET
INIT_IO
ENDP
CLEAR
PROC
NEAR
MOV
AX,0FFFFH
MOV
DX,LINE
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,LINE
XOR
AX,AX
OUT
DX,AX
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
START
ENDP
CODE
ENDS
END
START
CODE
SEGMENT
START
PROC
NEAR
ASSUME
CS:
CODE,DS:
_DATA,SS:
_STACK
MOV
AX,_DATA
MOV
DS,AX
MOV
ES,AX
NOP
CALL
INIT_IO
CALL
TEST_LED
实验十四:
电子钟
一、实验目的
进一步熟悉8253、8259、8279
二、实验内容
1、使用8253定时功能,产生0.5S的定时中断给8259
2、在F5区的数码管上显示时间
3、允许设置时钟初值
三、实验步骤
1、连线说明:
D3区:
CS、A0、A1
——
A3区:
CS1、A0、A1
D3区:
PC0、PC1
——
F5区:
KL1、KL2
D3区:
JP20(PB)、B、C
——
F5区:
A、B、C
B3区:
CS、A0
——
A3区:
CS3、A0
B3区:
INT、INTA
——
A3区:
INTR、INTA
B3区:
IR0
——
C4区:
OUT0
C4区:
CS(8253)、A0、A1
——
A3区:
CS2、A0、A1
(注意连线方向)
2、运行程序,按F5区的F键,设置时钟初值。
3、观察F5区数码管上显示的时间是否正确
四、功能修改实验代码
IO8259_0EQU0250H
I