1、1微型计算机技术课程设计指导教师: 班 级: 姓 名: 学 号: 班内序号: 课设日期: _2目 录一、课程设计题目 3二、设计目的 3三、设计内容 3四、设计所需器材与工具 3五、设计思路 4六、设计步骤(含流程图和代码) 4七、课程设计小结 .363一、课程设计题目:点阵显示系统电路及程序设计利用汇编语言与微型计算机技术课程中所学的可编程接口芯片8253、8255A、8259 设计一个基于微机控制的点阵显示系统。二、设计目的1通过本设计,使学生综合运用汇编语言与微型计算机技术、数字电子技术等课程的内容,为今后从事计算机检测与控制工作奠定一定的基础。2掌握接口芯片 8253、8255A、82
2、59 等可编程器件、译码器 74LS138、8路同相三态双向总线收发器 74LS245、点阵显示器件的使用。3学会用汇编语言编写一个较完整的实用程序。4掌握微型计算机技术应用开发的全过程,包括需求分析、原理图设计、元器件选用、布线、编程、调试、撰写报告等步骤。三、设计内容1点阵显示系统启动后的初始状态在计算机显示器上出现菜单:dot matrix display system1.left shift display2.up shift display3.s stop4.Esc Exit2点阵显示系统运行状态按计算机光标键,点阵逐列向左移动并显示:“微型计算机技术课程设计,点阵显示系统,计科 1
3、1302班,陈嘉敏,彭晓” 。按计算机光标键,点阵逐行向上移动并显示:“微型计算机技术课程设计,点阵显示系统,计科 11302班,陈嘉敏,彭晓” 。按计算机光标 s键,点阵停止移动并显示当前字符。3结束程序运行状态按计算机 Esc键,结束点阵显示系统运行状态并显示“停”。四设计所需器材与工具1一块实验面包板(内含时钟信号 1MHz或 2MHz)。 2可编程芯片 8253、8255、74LS245、74LS138 各一片,1616 点阵显示4器件一片。3导线若干。4示波器、万用表、常用工具等共用(从实验室现借现还)。五、设计思路 1利用 74LS138设计地址译码电路,8255 端口地址:300
4、H303H,8253端口地址:304H307H。274LS245 用于总线和 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-174LS245的功能表 图 6-1-25图 6-1-3(2)
5、74LS138 图 6-1-46标准地址译码电路 图 6-1-58255CS对应的地址为 300H303H, 8253CS 对应的地址为 304H307H。简化后的非标准地址译码电路 图 6-1-67(3).8253定时/计数器 图 6-1-7(4).8255A 图 6-1-88(5).点阵显示器件 图 6-1-9 图 6-1-10附 4、课程设计所用器件 图 6-1-12 9附 5、点阵生成图 图 6-1-13图 6-1-1410图 6-1-1511图 6-1-16图 6-1-1712图 6-1-18图 6-1-1913图 6-1-20142.流程图3.电路图 图 6-3-1注:开始初始化
6、8253、8255A 及 8259芯片,选择计数器 1、2,输出端口 A、B,工作方式 0显示主界面信息,点阵显示出字模,停止不移动中断服务程序,不断扫描键盘,等待有键按下(1.2.3.4)并执行相应服务程序按键 1启动 LeftShift功能,调用左移程序,并显示在点阵上按键 2启动 UpShift功能,调用上移程序,并显示在点阵上按键 3启动StopDisplay 功能,调用停止程序,点阵停止移动并显示当前字符按键 4启动 Esc 功能,调用退出程序,点阵显示“停”,并结束显示。15(1)电路箱总芯片上已集成 8259芯片,实际连接时 8253的 OUT2直接接到总芯片的 IRQ10处;(
7、2)实际连接时,是由 8255A芯片的 PA0、PA4、PA5、PB4、PB5、PB6、PB7控制点阵显示屛;PA0R1、PA4SCK、PA5LATCH、PB4A、PB5B、 PB6C、PB7D。GND 和EN/OE接地,+5V 接电源正极。4.正确运用所给器件布线,搭接硬件电路初始接线图 图 6-4-1 测试中发现 8255无法正常工作,检查得知面包板底下有短路,重新申请新的面包板,更改部分线路,最后得到线路图如下,并测试成功。16最终接线图及测试 图 6-4-2175.详细汇编代码DATA SEGMENT微 db 12H, 10H, 12H, 10H, 2AH, 90H, 4AH, 0A4
8、H, 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
9、, 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, 0
10、8H, 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,
11、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,
12、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,
13、 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, 40HDo
14、u0 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
15、, 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, 1820H, 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, 44
16、H, 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,
17、 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, 00HDou2 db 00H, 00H, 00H, 00H, 00H,
18、 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, 00HZhang 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, 0
19、0Hstrmenu 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;辅助实现第
20、一种中断。;为了实现“利用中断来刷屏 ”,需要用到两个变量。IndexOfLine DW 0006H;行标,用来指示当前刷屏从第几行开始。用于辅助实现ShowUpward 范围是 0count*16-1。当超过的时候,应该使其等于 00IndexOfWord DB 00H;汉字的指针( 只能放 256 个汉字喽),辅助实现 ShowLeftward 的MoveStep DB 00H;以每个汉字为中心,的位移量,用于 Left。:出于我们点阵的数据格式,其范围在 016 之间。;用于恢复原中断向量19INT0A_OFF DW(?)INT0A_SEG DW(?) ;Test:用于辅助做测试的变量。
21、Times DB 00hDATA ENDSCODE SEGMENT CODEASSUME DS:DATA,CS:CODE;-StartSTART:MOV DX,DATAMOV DS,DXLEA DX,wEI ;设置字符的开始位置MOV OUTSET,DXCALL InI8255CALL Ini8253MOV AX,3572H ;获取原中断向量INT 21HMOV INT0A_OFF,BX ;保存原中断向量MOV BX,ESMOV INT0A_SEG,BXCLI ;关中断MOV AX,2572HMOV DX,SEG MoveStepLeft ;设置新的中断向量PUSH DSMOV DS,DXMO
22、V DX,OFFSET MoveStepLeftINT 21HPOP DSSTI ;开中断IN AL,0A1H ;打开 IRQ10AND AL,0FBH20OUT 0A1H,ALIN AL,21H ;打开 IRQ2AND AL,0FBHOUT 21H,ALLEA DX,strmenuMOV AH,09HINT 21H;刷屏。NOTEND:MOV AH,0BH ;检查是否有键按下INT 21HINC ALJNZ NOTEND2 ; 若无键按下,则跳过判断MOV AH,08H ;如有Q或q键按下,则程序退出INT 21HCMP AL,s;当键入为s 的时候,停止 LED 滚动JZ JStopCMP
23、 AL,S;JZ JStopCMP AL,1BH;当键入为 Esc 的时候,退出程序JZ JEXITCMP AL,u;当键入 U 的时候,调用 Up:(1 )改变 Status 变量=2;(2)改变StopFlag;(3)改变中断表向量为“MoveLeftStep“,从而实现中断移位JZ JUpCMP AL,U;JZ JUpCMP AL,l;当键入 L 的时候,调用 Left:(1 )改变 Status 变量=2;(2)改变StopFlag;(3)改变中断向量表为“MoveLeftStep“,从而实现中断移位JZ JLeftCMP AL,L;JZ JLeftCMP AL,QJZ JEXITCM
24、P AL,qJZ JEXITNOTEND2:CMP Status,01HJZ JLeftShow;以向左的方式,刷屏CMP Status,02HJZ JUpShow;以向上的方式刷屏;CALL DELAY21CALL DELAYJMP NOTENDJStop:CALL StopJMP NOTENDJLeft:CALL LeftJMP NOTENDJUp:CALL UPJMP NOTENDJEXIT:CALL EXITJLeftShow:CALL ShowLeftward;CALL DELAY;?也许对于 cpu 位的位移,这个 delay 最好是放在 MoveStepLeft 函数的内部;CA
25、LL MoveStepLeft;-如果中断没起作用,那就用 CUP 来位移。MOV AH,2MOV DL,LINT 21HJMP NOTENDJUpShow:CALL ShowUpward;CALL DELAY;CALL MoveStepUp;-如果中断没起作用,那就用 CUP 来位移。MOV AH,2MOV DL,UINT 21HJMP NOTEND22;-根据键盘输入,改变中断向量表,从而选择是向上,还是向下移动。-Left:;(1)把中断处理程序“向左左位 ”的中断程序放入中断向量表中。;(2)同时将 status 置为 1,表示的是以向左的方式刷屏;(3)置暂停位为 00h;(4)开始
26、循环。PUSH AXPUSH DXMOV AH,2MOV DL,LINT 21HCLI ;关中断MOV AX,2572HMOV DX,SEG MoveStepLeft ;设置新的中断向量PUSH DSMOV DS,DXMOV DX,OFFSET MoveStepLeftINT 21HPOP DSSTI ;开中断IN AL,0A1H ;打开 IRQ10AND AL,0FBH ;11111011OUT 0A1H,ALIN AL,21H ;打开 IRQ2AND AL,0FBHOUT 21H,ALMOV Status,1;(2)MOV StopFlag,00H;(3)置暂停位POP DXPOP AXR
27、ETUp:;(1)把中断处理程序“向上位移 ”的中断程序放入中断向量表中。;(2)同时将 status 置为,表示的是以向左的方式刷屏;(3)置暂停位为 00h;(4)开始循环。PUSH AX23PUSH DXMOV AH,2MOV DL,UINT 21HCLI ;关中断MOV AX,2572HMOV DX,SEG MoveStepUp ;设置新的中断向量PUSH DSMOV DS,DXMOV DX,OFFSET MoveStepUpINT 21HPOP DSSTI ;开中断IN AL,0A1H ;打开 IRQ10AND AL,0FBH ;11111011OUT 0A1H,ALIN AL,21
28、H ;打开 IRQ2AND AL,0FBHOUT 21H,AL;开中断MOV Status,2;(2)MOV StopFlag,00H;置暂停位POP DXPOP AXRETStop:PUSH AXPUSH DXMOV AH,2MOV DL,SINT 21HMOV StopFlag,01H;置暂停位POP DXPOP AXRET;-LED 显示的逻辑部分-24;-SendWord-SendWord:;计算并送出一行 16 位数据。;这个数据放在 AX 中。PUSH AXPUSH BXPUSH CXPUSH DXMOV CX,16cicleSendWord:;测试部分PUSH AXPUSH DX
29、MOV DX,8000H;MOV DX,0001HAND DX,AXSHR DX,15ADD DX,30HMOV AH,2HINT 21HPOP DXPOP AX;1:通过 8255 的 c4 口把一位数据给 G1PUSH AXMOV DX,303HTEST AX,8000H;如果数据位是 0 的话,将 c0 置 1;如果数据位是 1 的话,将 c0 置 0JZ SetOne;将 c0 置 0MOV AL,00000000BOUT DX,ALJMP GoOnSetOne:;将 C0 置 1MOV AL,00000001BOUT DX,ALGoOn:;2:以下代码是为了实现一个“ 移位脉冲“MO
30、V AL,00001100B;使得 C6 变成 0(低电平); 同时不改变数据输入位OUT DX,ALMOV AL,00001101B;使得 C6 变成 1(高电平);同时不改变数据输入位OUT DX,ALPOP AXSHL AX,1;25;SHR AX,1DEC CXJNZ cicleSendWordPOP DXPOP CXPOP BXPOP AXRET;-ShowLeftWard-ShowLeftWard:PUSH SIPUSH DXPUSH CXPUSH BXPUSH AX;1:根据 IndexOfWord2;2:MoveStep 决定一个位的位移;3:当 Stop 为 0 时,每“刷完
31、一次屏 ,MoveStep 要移动 +;否则不移动;4:当 MoveStep=16 时,IndexOfWord2+;5:当 IndexOfWord2=NumOfCharacter-1 时,IndexOfWord2 归零:因为”索引是从 0开始的嘛“。MOV SI,OUTSETMOV AL,32MUL IndexOfWordADD SI,AXMOV CX,16;来一个信号刷一次屏Oneline:;CALL DELAY;Left 代码的关键:;(1)CX 作为一个临时的“偏移变量使用”;(2)把四个字节(两个字)的数据拼接在一起,并把最终结果放在 AX 中。PUSH CX ;MOV AH,SIMO
32、V AL,SI+126MOV CL,MoveStepSHL AX,CL;MOV BH,SI+32;下一个字的对应行;MOV BL,SI+33CALL GetNextLeftWord;-取下一个字对应行的十六位,放在 BX 中MOV CL,16SUB CL,MoveStepSHR BX,CLOR AX,BXPOP CXADD SI,2;换行;testCALL Enter;(1)移位输出了 16 位数据CALL SendWord;2)释放锁存,先 0 后 1.采用置位、复位控制字MOV AL,00001010BMOV DX,303H;call delayOUT DX,ALMOV AL,000010
33、11BOUT DX,AL;(3)行选-需要测试选中那一行MOV AL,CL;SHL AL,1DEC AL;?MOV DX,302HOUT DX,ALDEC CXJNZ OnelinePOP AXPOP BXPOP CXPOP DXPOP SI;JMP EXITRET;-GetNextLeftWord-GetNextLeftWord:;取下一字的时候,要考虑一种特殊情况,及当 SI 已经指向最后一个字的时候,下一个 1627位,应该取自第一个字PUSH AXPUSH SIPUSH DXMOV AL,IndexOfWordINC ALCMP AL,COUNTJNZ GetNextLeftGetFi
34、stLeft:MOV DX,OUTSETMOV AL,32MUL IndexOfWordADD DX,AXMOV AX,SISUB AX,DXMOV SI,OUTSETADD SI,AXMOV BH,SIMOV BL,SI+1;TESTPUSH DXMOV DL, MOV AH,2HINT 21HPOPDXMOV AX,BXCALL SendWordJMP EndGetLeftWordGetNextLeft:MOV BH,SI+32;下一个字的对应行MOV BL,SI+33EndGetLeftWord:POP DXPOP SIPOP AXRET;-MoveStepLeft-MoveStepLe
35、ft:;1:根据 IndexOfWord2 以及 MoveStep2 确定 SI。;2:MoveStep 决定一个位的位移28;3:当 Stop 为 0 时,每“刷完一次屏 ,MoveStep 要移动 +;否则不移动;4:当 MoveStep=16 时,IndexOfWord2+;5:当 IndexOfWord2=COUNT 时,IndexOfWord2 归零:因为”索引是从 0 开始的嘛“。;当刷完一次屏之后,MoveStep2 要变化。;(1)当已经按下暂停建的时候,则不前移动;(2)当移动超过=16 的时候PUSH AXCLIMOV AL,01HTEST StopFlag,ALJNZ E
36、ndStep;如果等于 1,则 MoveSteip 不前移动INC MoveStepMOV AL,16CMP MoveStep,ALJNZ EndStep;如果 EndMoveStep!=16 跳过 4;MOV MoveStep,00HINC IndexOfWordMOV AL,COUNTCMP IndexOfWord,ALJNZ EndStep;如果 IndexOfStep2!=COUNT, 则跳过 5MOV IndexOfWord,00HEndStep:MOV AL,62H ;发中断结束命令MOV DX,0A0HOUT DX,AL ;向从片 8259 发 EOI 命令OUT 020H,AL
37、 ;向主片 8259 发 EOI 命令STI ;开中断POP AXIRETRET;-ShowUpWard-;1:用到变量:IndexOfLine;:(1)用来指示当前刷屏从第几行开始。(2)范围是 0count*16-1。(3)当超过的时候,应该使其等于 00(4)用来对 SI 初始化;2:SI:;:SI 动态变化(显示十六行数据过程中),当超过的 count*16-1 这个地方所对应的地址的时候,使其“重新指向开头”。;29ShowUpWard:PUSH SIPUSH DXPUSH CXPUSH BXPUSH AXMOV SI,OUTSETMOV AX,2MUL IndexOfLine AD
38、D SI,AXMOV CX,16;来一个信号刷一次屏AnotherLine:MOV AH,SIMOV AL,SI+1ADD SI,2;(1)换行;(2)如果换行以后=range=32*count 行对应的指针,令其从新指向开头,并继续+进行行扫PUSH AX;定义一个临时变量MOV AX,0MOV AL,32MUL COUNTMOV BX,OUTSETADD BX,AXCMP BX,SIJNZ Continue;如果等于 range,则 reset;ResetMOV SI,OUTSETContinue:POP AX;TestCALL Enter;(1)移位输出了 16 位数据-以 AX 传送数
39、据CALL SendWord;2)释放锁存,先 0 后 1.采用置位、复位控制字MOV AL,00001010BMOV DX,303H;call delay30OUT DX,ALMOV AL,00001011BOUT DX,AL;(3)行选-需要测试选中那一行MOV AL,CL;SHL AL,1DEC AL;?MOV DX,302HOUT DX,ALDEC CX;用于实现 16 行数据的输出JNZ AnotherLinePOP AXPOP BXPOP CXPOP DXPOP SI;JMP NOTENDRET;-MoveStepUp-MoveStepUp:PUSH AX;testPUSH DXCLIINC TimesMOV AH,2MOV DL,TimesADD DL,30HINT 21HMOV AH,2MOV DX,IndexOfLineADD DL,30HINT 21H