微机原理课程设计报告 - 图文

更新时间:2023-03-13 07:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微型计算机技术 课程设计

指导教师: 班 级: 姓 名: 学 号: 班内序号: 课设日期: _________________________

1

目 录

一、课程设计题目 ................. 错误!未定义书签。

二、设计目的 ..................... 错误!未定义书签。

三、设计内容 ..................... 错误!未定义书签。

四、设计所需器材与工具 ........................... 3

五、设计思路 ..................... 错误!未定义书签。

六、设计步骤(含流程图和代码) ..... 错误!未定义书签。

七、课程设计小结 ................................ 36

2

一、课程设计题目:点阵显示系统电路及程序设计

利用《汇编语言与微型计算机技术》课程中所学的可编程接口芯片8253、8255A、8259设计一个基于微机控制的点阵显示系统。

二、设计目的

1.通过本设计,使学生综合运用《汇编语言与微型计算机技术》、《数字电子技术》等课程的内容,为今后从事计算机检测与控制工作奠定一定的基础。

2.掌握接口芯片8253、8255A、8259等可编程器件、译码器74LS138、8路同相三态双向总线收发器74LS245、点阵显示器件的使用。

3.学会用汇编语言编写一个较完整的实用程序。

4.掌握微型计算机技术应用开发的全过程,包括需求分析、原理图设计、元器件选用、布线、编程、调试、撰写报告等步骤。

三、设计内容

1.点阵显示系统启动后的初始状态 在计算机显示器上出现菜单:

dot matrix display system 1.←left shift display 2.↑up shift display 3.s stop 4.Esc Exit

2.点阵显示系统运行状态

按计算机光标←键,点阵逐列向左移动并显示:“微型计算机技术课程设计,点阵显示系统,计科11302班,陈嘉敏,彭晓” 。

按计算机光标↑键,点阵逐行向上移动并显示:“微型计算机技术课程设计,点阵显示系统,计科11302班,陈嘉敏,彭晓” 。 按计算机光标s键,点阵停止移动并显示当前字符。 3.结束程序运行状态

按计算机Esc键,结束点阵显示系统运行状态并显示“停”。

四.设计所需器材与工具

1.一块实验面包板(内含时钟信号1MHz或2MHz)。

2.可编程芯片8253、8255、74LS245、74LS138各一片,16×16点阵显示器件一片。

3

3.导线若干。

4.示波器、万用表、常用工具等共用(从实验室现借现还)。

五、设计思路

1.利用74LS138设计地址译码电路,8255端口地址:300H~303H,8253端口地址:304H~307H。

2.74LS245用于总线和8253、8255之间的双向传输和隔离。

3.利用面包板上时钟(1MHz或2MHz)和8253设计一个1毫秒定时电路,将定时信号(1毫秒方波)接到总线的IRQ2或IRQ10送给8259控制点阵左移或上移。

4.选择8255的PA0、PA4、PA5和PB4、PB5、PB6、PB7,7个位控制点阵显示器件行和列的数据串行输入、输入脉冲、锁存脉冲(并行输出脉冲)。

六、设计步骤

1.电路原件介绍

(1)74LS245数据总路线缓冲器 图6-1-1

74LS245的功能表 图6-1-2

4

图6-1-3

(2)74LS138 图6-1-4

5

标准地址译码电路 图6-1-5

8255CS对应的地址为300H~303H, 8253CS对应的地址为304H~307H。

简化后的非标准地址译码电路 图6-1-6

6

(3).8253定时/计数器 图6-1-7

(4).8255A 图6-1-8

7

(5).点阵显示器件 图6-1-9 图6-1-10

附4、课程设计所用器件 图6-1-12

8

附5、点阵生成图 图6-1-13

图6-1-14

9

图6-1-15

图6-1-16

10

5.详细汇编代码

DATA SEGMENT

微db 12H, 10H, 12H, 10H, 2AH, 90H, 4AH, 0A4H, 8AH, 0BEH, 1FH, 0C4H,20H, 24H, 7FH, 0A8H, 0A0H, 28H, 2FH, 28H, 29H, 10H, 29H, 50H, 29H, 0A8H, 29H, 28H, 30H, 46H, 20H, 84H

型 db 01H, 04H, 7FH, 84H, 12H, 24H, 12H, 24H, 12H, 24H, 0FFH, 0A4H, 12H, 24H, 12H, 24H, 12H, 04H, 23H, 14H, 41H, 08H, 7FH, 0FCH, 01H,00H, 01H, 04H, 0FFH, 0FEH, 00H, 00H

计 db 00H, 40H, 20H, 40H, 10H, 40H, 10H, 40H, 00H, 40H, 00H, 44H, 0F7H, 0FEH, 10H, 40H, 10H, 40H, 10H, 40H, 10H, 40H, 12H, 40H, 14H, 40H, 18H, 40H, 10H, 40H, 00H, 40H

算 db 20H, 80H, 3EH, 0FCH, 49H, 20H, 9FH, 0F0H, 10H, 10H, 1FH, 0F0H, 10H, 10H, 1FH, 0F0H, 10H, 10H, 1FH, 0F0H, 08H, 24H, 0FFH, 0FEH, 08H, 20H, 08H, 20H, 10H, 20H, 20H, 20H

机 db 10H, 00H, 10H, 10H, 11H, 0F8H, 11H, 10H, 0FDH, 10H, 11H, 10H, 31H, 10H, 39H, 10H, 55H, 10H, 51H, 10H, 91H, 10H, 11H, 10H, 11H, 12H, 12H, 12H, 14H, 0EH, 18H, 00H

技 db 10H, 40H, 10H, 40H, 10H, 48H, 13H, 0FCH, 0FCH, 40H, 10H, 40H, 10H, 40H, 13H, 0F8H, 1AH, 08H, 31H, 10H, 0D1H, 10H, 10H, 0A0H, 10H, 40H, 10H, 0B0H, 51H, 0EH, 26H, 04H

术 db 01H, 00H, 01H, 40H, 01H, 30H, 01H, 10H, 01H, 04H, 0FFH, 0FEH, 01H, 00H, 03H, 80H, 05H, 40H, 09H, 20H, 11H, 10H, 21H, 0EH, 0C1H, 04H, 01H, 00H, 01H, 00H, 01H, 00H

课 db 00H, 08H, 43H, 0FCH, 22H, 48H, 22H, 48H, 03H, 0F8H, 02H, 48H, 0E2H, 48H, 23H, 0F8H, 20H, 40H, 2FH, 0FEH, 20H, 0E0H, 29H, 50H, 32H, 48H, 24H, 4EH, 08H, 44H, 00H, 40H

程 db 08H, 04H, 1DH, 0FEH, 0F1H, 04H, 11H, 04H, 11H, 04H, 0FFH, 04H, 11H, 0FCH, 38H, 00H, 37H, 0FEH, 54H, 20H,50H, 28H, 91H, 0FCH, 10H, 20H, 10H, 24H, 17H, 0FEH, 10H, 00H

设 db 01H, 0F0H, 21H, 10H, 11H, 10H, 11H, 10H, 01H, 10H, 02H, 0EH, 0F4H, 00H, 13H, 0F8H, 11H, 08H, 11H, 10H, 10H, 90H, 10H, 0A0H, 14H, 40H, 18H, 0B0H, 13H, 0EH, 0CH, 04H

计 Db 00H, 40H, 20H, 40H, 10H, 40H, 10H, 40H, 00H, 40H, 00H, 44H, 0F7H, 0FEH, 10H, 40H, 10H, 40H, 10H, 40H, 10H, 40H, 12H, 40H, 14H, 40H, 18H, 40H, 10H, 40H, 00H, 40H

Dou0 db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 18H, 00H, 18H, 00H, 10H, 00H, 20H, 00H, 00H, 00H, 00H, 00H

点 db 02H, 00H, 02H, 00H, 02H, 08H, 03H, 0FCH, 02H, 00H, 02H, 10H, 3FH, 0F8H, 20H, 10H, 20H, 10H, 20H, 10H, 3FH, 0F0H, 00H, 00H, 29H, 10H, 24H, 0C8H, 44H, 44H, 80H, 04H

阵 db 00H, 80H, 78H, 84H, 4FH, 0FEH, 50H, 80H, 50H, 0A0H, 61H, 20H, 51H, 28H, 4BH, 0FCH, 48H, 20H, 48H, 20H, 68H, 24H, 57H, 0FEH, 40H,

16

20H, 40H, 20H, 40H, 20H, 40H, 20H

显 db 00H, 10H, 1FH, 0F8H, 10H, 10H, 10H, 10H, 1FH, 0F0H, 10H, 10H, 10H, 10H, 1FH, 0F0H, 14H, 50H, 44H, 44H, 34H, 4CH, 14H, 50H, 04H, 40H, 04H, 44H, 0FFH, 0FEH, 00H, 00H

示 db 00H, 10H, 3FH, 0F8H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 04H, 0FFH, 0FEH, 01H, 00H, 01H, 00H, 09H, 20H, 19H, 18H, 21H, 0CH, 41H, 04H, 01H, 00H, 05H, 00H, 02H, 00H

系 db 00H, 38H, 7FH, 0C0H, 04H, 00H, 04H, 10H, 08H, 20H, 3FH, 0C0H, 01H, 00H, 02H, 20H, 04H, 10H, 3FH, 0F8H, 01H, 08H, 09H, 20H, 09H, 10H, 11H, 08H, 25H, 08H, 02H, 00H

统 db 10H, 80H, 10H, 40H, 20H, 48H, 27H, 0FCH, 48H, 80H, 0F9H, 10H, 12H, 08H, 27H, 0FCH, 41H, 24H, 0F9H, 20H, 41H, 20H, 01H, 20H, 1AH, 22H, 0E2H, 22H, 44H, 1EH, 08H, 00H

Dou2 db 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 18H, 00H, 18H, 00H, 10H, 00H, 20H, 00H, 00H, 00H, 00H, 00H

Zhang Db 09H, 00H, 0FDH, 08H, 09H, 08H, 09H, 10H, 09H, 20H, 79H, 40H,41H, 04H, 47H, 0FEH, 41H, 40H, 79H, 40H, 09H, 20H, 09H, 20H, 09H, 10H, 09H, 4EH, 51H, 84H, 21H, 00H

strmenu DB 'dot matrix display system',0AH,0DH,'1.','L',' left shift display',0AH,0DH,'2.','U',' up shift display',0AH,0DH,'3.S stop',0AH,0DH,'4.Esc Exit',0AH,0DH,0AH,0DH,'$'

OUTSET DW 0000H;用于存放字符首地址,增加程序可移植性。

COUNT DB 35;用于指示汉字的个数----------------------------------------------------------------------------------

StopFlag DB 00H;暂停标志位:用于辅助实现暂停功能。(1)如果为0收到中断后,可以MoveStep;(2)否则不行。

Status DB 00H;辅助实现第一种中断。

;为了实现“利用中断来刷屏”,需要用到两个变量。

IndexOfLine DW 0006H;行标,用来指示当前刷屏从第几行开始。用于辅助实现ShowUpward范围是0~count*16-1。当超过的时候,应该使其等于00

IndexOfWord DB 00H;汉字的指针(只能放256个汉字喽),辅助实现ShowLeftward的 MoveStep DB 00H;以每个汉字为中心,的位移量,用于Left。@:出于我们点阵的数据格式,其范围在0~16之间。

;用于恢复原中断向量 INT0A_OFF DW(?)

17

INT0A_SEG DW(?)

;Test:用于辅助做测试的变量。

Times DB 00h

DATA ENDS

CODE SEGMENT 'CODE' ASSUME DS:DATA,CS:CODE

;------------------------------------------------------------Start START: MOV DX,DATA MOV DS,DX LEA DX,wEI ;设置字符的开始位置---------------------------------------------------------------------------------------- MOV OUTSET,DX CALL InI8255 CALL Ini8253 MOV AX,3572H ;获取原中断向量 INT 21H

MOV INT0A_OFF,BX ;保存原中断向量 MOV BX,ES

MOV INT0A_SEG,BX

CLI ;关中断 MOV AX,2572H

MOV DX,SEG MoveStepLeft ;设置新的中断向量 PUSH DS MOV DS,DX

MOV DX,OFFSET MoveStepLeft INT 21H POP DS

STI ;开中断

IN AL,0A1H ;打开IRQ10 AND AL,0FBH OUT 0A1H,AL

IN AL,21H ;打开IRQ2

18

AND AL,0FBH OUT 21H,AL LEA DX,strmenu MOV AH,09H INT 21H

;刷屏。 NOTEND: MOV AH,0BH ;检查是否有键按下 INT 21H INC AL

JNZ NOTEND2 ; 若无键按下,则跳过判断

MOV AH,08H ;如有’Q’或’q’键按下,则程序退出 INT 21H

CMP AL,'s';当键入为's'的时候,停止LED滚动 JZ JStop CMP AL,'S'; JZ JStop CMP AL,1BH;当键入为Esc的时候,退出程序 JZ JEXIT CMP AL,'u';当键入U的时候,调用Up:(1)改变Status变量=2;(2)改变StopFlag;(3)改变中断表向量为“MoveLeftStep\从而实现中断移位 JZ JUp CMP AL,'U'; JZ JUp CMP AL,'l';当键入L的时候,调用Left:(1)改变Status变量=2;(2)改变StopFlag;(3)改变中断向量表为“MoveLeftStep\,从而实现中断移位 JZ JLeft CMP AL,'L'; JZ JLeft CMP AL,'Q' JZ JEXIT CMP AL,'q' JZ JEXIT NOTEND2: CMP Status,01H JZ JLeftShow;以向左的方式,刷屏 CMP Status,02H JZ JUpShow;以向上的方式刷屏 ;CALL DELAY CALL DELAY JMP NOTEND

19

JStop: CALL Stop JMP NOTEND JLeft: CALL Left JMP NOTEND JUp: CALL UP JMP NOTEND JEXIT: CALL EXIT

JLeftShow: CALL ShowLeftward ;CALL DELAY;??????????????????????也许对于cpu位的位移,这个delay最好是放在MoveStepLeft函数的内部 ;CALL MoveStepLeft;---如果中断没起作用,那就用CUP来位移。 MOV AH,2 MOV DL,'L' INT 21H JMP NOTEND

JUpShow: CALL ShowUpward ;CALL DELAY ;CALL MoveStepUp;---如果中断没起作用,那就用CUP来位移。 MOV AH,2 MOV DL,'U' INT 21H JMP NOTEND

;----------------------------------------------------------------------------根据键盘输入,改变中断向量表,从而选择是向上,还是向下移动。-----------------

20

Left:

;(1)把中断处理程序“向左左位”的中断程序放入中断向量表中。 ;(2)同时将status置为1,表示的是以向左的方式刷屏 ;(3)置暂停位为00h; ;(4)开始循环。 PUSH AX PUSH DX MOV AH,2 MOV DL,'L' INT 21H

CLI ;关中断 MOV AX,2572H

MOV DX,SEG MoveStepLeft ;设置新的中断向量 PUSH DS MOV DS,DX

MOV DX,OFFSET MoveStepLeft INT 21H POP DS

STI ;开中断

IN AL,0A1H ;打开IRQ10 AND AL,0FBH ;11111011 OUT 0A1H,AL

IN AL,21H ;打开IRQ2 AND AL,0FBH OUT 21H,AL MOV Status,1;(2) MOV StopFlag,00H;(3)置暂停位 POP DX POP AX RET Up:

;(1)把中断处理程序“向上位移”的中断程序放入中断向量表中。 ;(2)同时将status置为2,表示的是以向左的方式刷屏 ;(3)置暂停位为00h; ;(4)开始循环。 PUSH AX PUSH DX MOV AH,2

21

MOV DL,'U' INT 21H

CLI ;关中断 MOV AX,2572H

MOV DX,SEG MoveStepUp ;设置新的中断向量 PUSH DS MOV DS,DX

MOV DX,OFFSET MoveStepUp INT 21H POP DS

STI ;开中断

IN AL,0A1H ;打开IRQ10 AND AL,0FBH ;11111011 OUT 0A1H,AL

IN AL,21H ;打开IRQ2 AND AL,0FBH OUT 21H,AL ;开中断 MOV Status,2;(2) MOV StopFlag,00H;置暂停位 POP DX POP AX RET

Stop: PUSH AX PUSH DX MOV AH,2 MOV DL,'S' INT 21H MOV StopFlag,01H;置暂停位 POP DX POP AX RET

;-----------------------------------------------------------------LED显示的逻辑部分-----------------------

;----------------------------------------------------------------------SendWord--------------------------------------------------------------------

22

SendWord:

;计算并送出一行16位数据。 ;这个数据放在AX中。 PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,16 cicleSendWord: ;测试部分 PUSH AX PUSH DX MOV DX,8000H ;MOV DX,0001H AND DX,AX SHR DX,15 ADD DX,30H MOV AH,2H INT 21H POP DX POP AX

;1:通过8255的c4口把一位数据给G1 PUSH AX MOV DX,303H TEST AX,8000H;如果数据位是0的话,将c0置1;如果数据位是1的话,将c0置0 JZ SetOne ;将c0置0 MOV AL,00000000B OUT DX,AL JMP GoOn SetOne: ;将C0置1 MOV AL,00000001B OUT DX,AL GoOn:

;2:以下代码是为了实现一个\移位脉冲\ MOV AL,00001100B;使得C6变成0(低电平);同时不改变数据输入位 OUT DX,AL MOV AL,00001101B;使得C6变成1(高电平);同时不改变数据输入位 OUT DX,AL POP AX SHL AX,1; ;SHR AX,1 DEC CX

23

JNZ cicleSendWord POP DX POP CX POP BX POP AX RET

;----------------------------------------------------------------------ShowLeftWard-------------------------------------------------------------------- ShowLeftWard: PUSH SI PUSH DX PUSH CX PUSH BX PUSH AX

;1:根据IndexOfWord2

;2:MoveStep决定一个位的位移

;3:当Stop为0时,每“刷完一次屏',MoveStep要移动++;否则不移动; ;4:当MoveStep==16时,IndexOfWord2++

;5:当IndexOfWord2==NumOfCharacter-1时,IndexOfWord2归零@:因为”索引是从0开始的嘛“。 MOV SI,OUTSET MOV AL,32 MUL IndexOfWord ADD SI,AX MOV CX,16 ;来一个信号刷一次屏 Oneline: ;CALL DELAY ;Left代码的关键:

;(1)CX作为一个临时的“偏移变量使用”

;(2)把四个字节(两个字)的数据拼接在一起,并把最终结果放在AX中。 PUSH CX ; MOV AH,[SI] MOV AL,[SI+1] MOV CL,MoveStep SHL AX,CL;

24

;MOV BH,[SI+32];下一个字的对应行 ;MOV BL,[SI+33] CALL GetNextLeftWord;---取下一个字对应行的十六位,放在BX中 MOV CL,16 SUB CL,MoveStep SHR BX,CL OR AX,BX POP CX ADD SI,2;换行 ;test CALL Enter

;(1)移位输出了16位数据 CALL SendWord

;2)释放锁存,先0后1.采用置位、复位控制字 MOV AL,00001010B MOV DX,303H ;call delay OUT DX,AL MOV AL,00001011B OUT DX,AL ;(3)行选--需要测试选中那一行 MOV AL,CL; SHL AL,1 DEC AL;???? MOV DX,302H OUT DX,AL DEC CX JNZ Oneline

POP AX POP BX POP CX POP DX POP SI

;JMP EXIT RET

;-------------------------------------------------------------------GetNextLeftWord------------------------ GetNextLeftWord:

;取下一字的时候,要考虑一种特殊情况,及当SI已经指向最后一个字的时候,下一个16位,应该取自第一个字 PUSH AX

25

PUSH SI PUSH DX MOV AL,IndexOfWord INC AL CMP AL,COUNT JNZ GetNextLeft GetFistLeft: MOV DX,OUTSET MOV AL,32 MUL IndexOfWord ADD DX,AX MOV AX,SI SUB AX,DX MOV SI,OUTSET ADD SI,AX MOV BH,[SI] MOV BL,[SI+1] ;TEST PUSH DX MOV DL,' ' MOV AH,2H INT 21H POPDX MOV AX,BX CALL SendWord JMP EndGetLeftWord GetNextLeft: MOV BH,[SI+32];下一个字的对应行 MOV BL,[SI+33] EndGetLeftWord: POP DX POP SI POP AX RET

;----------------------------------------------------------------------MoveStepLeft-------------------------------------------------------------------- MoveStepLeft:

;1:根据IndexOfWord2以及MoveStep2确定SI。 ;2:MoveStep决定一个位的位移

;3:当Stop为0时,每“刷完一次屏',MoveStep要移动++;否则不移动; ;4:当MoveStep==16时,IndexOfWord2++

26

;5:当IndexOfWord2==COUNT时,IndexOfWord2归零@:因为”索引是从0开始的嘛“。 ;当刷完一次屏之后,MoveStep2要变化。 ;(1)当已经按下暂停建的时候,则不前移动; ;(2)当移动超过==16的时候 PUSH AX CLI MOV AL,01H TEST StopFlag,AL JNZ EndStep;如果等于1,则MoveSteip不前移动 INC MoveStep MOV AL,16 CMP MoveStep,AL JNZ EndStep;如果EndMoveStep!=16跳过4; MOV MoveStep,00H INC IndexOfWord MOV AL,COUNT CMP IndexOfWord,AL JNZ EndStep;如果IndexOfStep2!=COUNT,则跳过5 MOV IndexOfWord,00H EndStep: MOV AL,62H ;发中断结束命令 MOV DX,0A0H

OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP AX IRET RET

;-------------------------------------------------------------------ShowUpWard---------------------------------------------------------

;1:用到变量:IndexOfLine

;@:(1)用来指示当前刷屏从第几行开始。(2)范围是0~count*16-1。(3)当超过的时候,应该使其等于00(4)用来对SI初始化 ;

;2:SI:

;@:SI动态变化(显示十六行数据过程中),当超过的count*16-1这个地方所对应的地址的时候,使其“重新指向开头”。 ;

ShowUpWard: PUSH SI PUSH DX

27

PUSH CX PUSH BX PUSH AX MOV SI,OUTSET MOV AX,2 MUL IndexOfLine ADD SI,AX MOV CX,16 ;来一个信号刷一次屏

AnotherLine: MOV AH,[SI] MOV AL,[SI+1] ADD SI,2;(1)换行

;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 PUSH AX;定义一个临时变量 MOV AX,0 MOV AL,32 MUL COUNT MOV BX,OUTSET ADD BX,AX CMP BX,SI JNZ Continue;如果等于range,则reset ;Reset MOV SI,OUTSET Continue: POP AX ;Test CALL Enter

;(1)移位输出了16位数据--以AX传送数据 CALL SendWord

;2)释放锁存,先0后1.采用置位、复位控制字 MOV AL,00001010B MOV DX,303H ;call delay OUT DX,AL MOV AL,00001011B OUT DX,AL

28

;(3)行选--需要测试选中那一行 MOV AL,CL; SHL AL,1 DEC AL;???? MOV DX,302H OUT DX,AL DEC CX;用于实现16行数据的输出 JNZ AnotherLine

POP AX POP BX POP CX POP DX POP SI

;JMP NOTEND RET

;-------------------------------------------------------------------MoveStepUp---------------------------------------------

MoveStepUp: PUSH AX ;test PUSH DX CLI INC Times MOV AH,2 MOV DL,Times ADD DL,30H INT 21H MOV AH,2 MOV DX,IndexOfLine ADD DL,30H INT 21H CMP StopFlag,1 JZ ContinueMoveUp ADD IndexOfLine,1;(1)换行

29

;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 MOV AX,16 MUL COUNT CMP AX,IndexOfLine JNZ ContinueMoveUp ;Reset MOV IndexOfLine,00H ContinueMoveUp: MOV AL,62H ;发中断结束命令 MOV DX,0A0H

OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP DX POP AX IRET

;JMP NOTEND RET

;---------------------------------------------------------------------辅助---------------------------------------------- INI8253: ;对8253C1和C2进行初始化 PUSH DX PUSH AX MOV DX,307H ;初始化8253,307H为8253控制端口地址 MOV AL,01110110B ;计数器1,方式3 OUT DX,AL ;将初始控制字输出到控制端口 MOV DX,305H ;计数器1 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL MOV DX,307H ;再给8253写控制字 MOV AL,10110110B ;计数器2,方式3 OUT DX,AL MOV DX,306H ;计数器2 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL

30

函数

POP AX POP DX RET

INI8255: ;8255初始化 PUSH DX PUSH AX MOV DX,303H ;初始化8255 MOV AL,80H ;A口输出 OUT DX,AL ;将初始控制字输出到控制端口 MOV DX,300H ;A端口的地址 MOV AL,000H OUT DX,AL MOV DX,302H ;C口地址 ??? MOV AL,000H OUT DX,AL

POP AX POP DX RET

EXIT:

MOV AX,2572H ;恢复中断向量 MOV DX,INT0A_SEG PUSH DS MOV DS,DX

MOV DX,INT0A_OFF INT 21H POP DS

IN AL,0A1H ;屏蔽IRQ10 OR AL,04H OUT 0A1H,AL

IN AL,21H ;屏蔽IRQ2 OR AL,04H OUT 21H,AL

MOV AX,4C00H ;程序退出 INT 21H

Enter:

31

PUSH AX PUSH DX MOV AH,2 MOV DX,0AH INT 21H MOV AH,2 MOV DX,0DH INT 21H POP DX POP AX RET

DELAY PROC PUSH CX PUSH BX

MOV BX,0FFFH LOOP2:MOV CX,0FFFH LOOP1:LOOP LOOP1 DEC BX JNZ LOOP2 POP BX POP CX RET DELAY ENDP

CODE ENDS END START

6.实验过程中的主要难点(自己遇到的)及解决思路和办法

主要难点:

①利用proteus画电路图时,知道每个芯片怎么连,但是需要多个芯片同时连接时,之间的连线会有些不确定;

②在试验箱上连线时,没能提前好好布局,连线很混乱很难看清楚,尤其在测试芯片有问题需要更改的时候,很难分清楚;

③不会编写核心点阵显示程序及功能调用子程序;

④调试改写程序时,会遇到测试灯和电路不工作的问题,影响程序正常测试。 解决方法:

①看书理解芯片引脚的功能,知道数据线、地址线,控制线的接法,将书上的逻辑图转化为试验箱的连线图。

②连接线路前混淆电路图与引脚图概念,不清楚实验箱注意事项:“横向导通”和“凹槽断电”,不知道如何根据电路图合理安排芯片和连线位置。了解注

32

意事项和多加思考之后,首先在草稿上画出电路图,再合理布线,电路连接成功。

②多看课本中的指令定义及相关例题程序,大概了解编写思路。将整个程序分为每一个子程序的调用,虽然未能按照原有设计思路成功编写程序,不过参考了其他同学编好的程序并修改字模,最终成功显示出了汉字。

③需要将连线仔细检查,可能是接线太松接触不良,也有接线错误,芯片烧毁等问题,经过排查,最后点阵显示屏能成功显示出汉字。

7.课设结果

点阵显示屏显示“微型计算机技术课程设计,点阵显示系统,..班,...”,并不断循环播放,实现了上移和左移,停止和退出功能。 实验显示图片(成品视频部分截图)

图7-1 图7-2

33

图7-3 图7-4

图7-5 图7-6

图7-7

34

七.课设小结

耗时近两周,终于成功完成微机原理这门课的课设设计,运用汇编语言使16×16LED点阵显示屏滚动显示汉字,下面是我对这次课程设计的总结

电路图部分:先通过书籍,和指导老师给定的ppt了解8253,8255,74lS245,74LS138各个芯片的引脚,根据其功能绘制电路图。

连线部分:根据自己绘制的电路图,连线。第一次自己剪线连线,不是很习惯,用的类似老虎钳子的剪刀剪线,线的长度都剪比较长,导致连接的图类似空间图,然而看过别人的整洁的板子,很是愧疚,一激动,就把线一根根剪短重新插线,这个过程中发现指甲剪剪线十分方便,容易控制力度。悲催地在连线过程中,有小节金属线断进面包板,拿不出来,由于不知道面包板的结构,错误地直接用另一段线把断进去的金属扎到金属板里面去了。因为是直接连接整个电路图,而不是一个一个芯片去测好然后连线,连线后测试改线比较麻烦,最终只好拆线重新连接。

测试部分:整改第一次的连线,使电路图成为初始连线图(图6-4-1)后开始测试,用二极管和借用来的示波器。但是8255始终无法工作,找同学帮忙测试,最终认定是8255芯片位置面包板内部短路,只好拆线重新连接,绕过短路部分。重新连线后不是很好看,但是时间原因也没有再去改线。运行写好的程序

35

后,点阵能够显示测试字,但是不能够滚动,8253中断没有起作用,检查三个OUT口时而能够正常运行,时而不能正常运行。但是手动触发可以使汉子滚动。

验收部分:请老师来验收时,最开始能够自己滚动,但是滚动速度比较慢,并且肉眼看起来速度就不均匀,然后滚动一半时自己停止了,然后不管怎么调整都只能手动触发。后来更换8253芯片后正常工作了两次,通过了验收。

总结:实验过程中出现了很多不能理解的问题,但为了解决问题,积极参与同学间的讨论,从设计电路图到调试程序测试芯片,在此过程中发现自己平时学习中的漏洞。通过不断复习课本和对知识点的不断思考,逐渐了解课设的大致流程和每一步骤的目的,增强了信心,也加强了自己对汇编语言和微机原理的理解。对出现的问题积极解决和同学之间的和合作和讨论。许多解决不了的问题都可以通过课本和上网查阅相关资料解决,所以平时上课和课后,对知识点的理解尤为重要。深厚的基础知识功底能才能让我们在课设中游刃有余。此次微机原理课程设计激发了我学习硬件的兴趣,虽然有很多不足,但是每一点进步都值得欣喜,谢谢老师和同学的帮助。

指导老师意见:

36

成绩:

教师签名:37

年 月

本文来源:https://www.bwwdw.com/article/s95x.html

Top