1、第11脚CLK是时钟输入脚,当该端输入一个上升沿,74HC273就会把数据输入端D0-D7的数据锁存住并输出,直到下一个上升沿的到来才会改变。二、实验原理 1、通用并口模块原理图:图(1)由一片74HC245作为键盘的行扫描电路(键盘的列扫描信号由一片74HC273提供,如图2所示),74HC245的P0-P3已经分别接到4*3的小键盘的4行。另外,这片74HC245的引脚和4*3小键盘行、列都有引出相应的接插口,所以也能另作它用,例如用74HC245来驱动发光二极管,或者与适当的输入输出器件(例如8255)相配合就可以进行键盘扫描实验。该片74HC245的/G端引了出来(KEYCS0)作为它
2、的片选信号端。图(1) 图(2)中左边的74HC273实现数码管的段码驱动,右边的74HC273除了与图(1)中的74HC245配合,作为键盘的行列扫描信号,来确定那个键被按下,还作为6个共阴数码管的位驱动。该模块的6个共阴数码管的段引脚(分别是KEY模块的的a、 b、c、d、e、f、g、dp)和位引脚(分别是KEY模块上的DS1、DS2、DS3、DS4、DS5、DS6)都引出来,如果用其它的驱动模块也可以控制数码管的显示。因为这两片74HC273都只作为输出用,所以用一片74HC32对IOW和它们各自的片选信号进行逻辑与运算,仅当是写操作时才会选中它们,以此避免不该它们工作时它们却工作的情况
3、发生:在KEYCS1和IOW有效(低电平)的前提下,74HC32的输出第6脚有效,对应的就是控制位选的74HC273被选通。在KEYCS2和IOW有效(低电平)的前提下,74HC32的输出第8脚有效,对应的就是控制段选的74HC273被选通。图(2) 2、数码管字型编码表:从上面的原理图可以看出,本模块显示部分由个共阴极数码管组成,并由两片74HC273分别对位选和段选进行控制,位选的选通端子为KEYCS1,段选的选通端子为KEYCS2,相应的数码管字型编码如表1所示。三、实验示例:(可参考随机的演示程序key.asm) 该示例程序不停的扫描键盘,当扫描到有键按下时就把该键的键值(即12个按键
4、的排列顺序)送到数码管上显示。硬件线路连接示例: 数码管的6根位控制信号线DS1DS6分别接至位选74HC273的输出Q0Q5; 译码地址输出端CS3接至KEYCS0; 译码地址输出端CS4接至KEYCS1; 译码地址输出端CS5接至KEYCS2;GAL的输出(译码电路可看前面的地址译码电路部分):x:表示可以取任意值,这里取“0” 按照如上的硬件连线示例可得:74HC245的地址 340H;段选锁存器的地址 360H;位选锁存器的地址 380H;下面是一个只有显示功能没有键盘扫描的小程序,可以参考一下:.486 DATA SEGMENT AT 0 USE16 ORG 1000H COUNT
5、DB ?DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE ORG 3000H BEG: JMP START TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH DPORT1 EQU 380H DPORT2 EQU 360H START: MOV AX,DATA MOV DS,AX MOV CL,6 KK: MOV AL,CL MOV BX,OFFSET TAB XLAT TAB MOV DX,DPORT1 OUT DX,AL NOP MOV DX,DPORT2 MOV AL,0FFH JMP KK CODE
6、ENDS END BEG 三、程序流程图主程序初始化各段寄存器及相关变量初始化8255、8254、8259芯片设置中断向量,开放8259中断屏蔽开放处理器中断中断服务程序保护现场判断时间是否不小于59分55秒 报时扫描键盘G键?调用启停子程序S键?调用设置时间子程序COUNT加1COUNT=40?修改时间,调用ADDONE子程序COUNT清0显示时间,调用显示时间子程序结束中断(发EOI命令)恢复现场中断返回四、实验源代码.486p DATA SEGMENT AT 0 USE16 ORG 1000H HOUR DW ? MIN DW ? SEC DW ? ST DB ? COUNT DB ?D
7、ATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATAORG 1500H BEG:JMP START TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,00H ;0F的共阴极七段译码表 00H表示不显示任何东西KEYCOD DB 0EEH,0DEH,0BEH,0EDH,0DDH,0BDH,0EBH,0DBH,0BBH,0E7H,0D7H,0B7H ;行列编码值 KEYVAL DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH ;所有键的键面值 PORT1 EQU 340H ;数码管
8、段选端口 PORT2 EQU 360H ;数码管位选端口,键盘矩阵的行列端口START: MOV EAX,60000000H MOV CR0,EAX MOV AX,DATA MOV DS,AX MOV HOUR,0203H ;小时分钟以及秒的初始化 MOV MIN,0509H MOV SEC,0502H LEA BX,TAB MOV ST,0 ;开始暂停标志位置0 MOV COUNT ,0 ;中断次数计数初始值为0 ;8255初始化 ,用于产生报时的脉冲 MOV DX,20FH ;利用左四的8255,控制口为20FH MOV AL,10000000B ;C口输出 OUT DX,AL MOV D
9、X,20BHL ;C0输出1,蜂鸣器不响 MOV AL,0FFH OUT DX,AL 8254初始化,用于产生周期为25ms的中断 MOV AL,00110110B ;计数器0,先低后高,方式三,二进制 MOV DX,32cH ;写往控制口 MOV DX,320H ;计数器0写初值:47KHz*25ms MOV AX,1175 MOV AL,AH8259初始化 CLI :关中断 MOV DX,300H ;ICW1 MOV AL,00010011B MOV DX,308H ;ICW2 MOV AL,08H ;IR0中断类型号为08HOUT DX,ALMOV AL,00000001B ;ICW4
10、MOV AL,0FEH ;IR0开屏蔽 OUT DX,AL XOR AX,AX ;装载中断向量 MOV ES,AX MOV DI,08H*4 MOV AX,OFFSET INTSR MOV ES:DI,AX MOV AX,SEG INTSRDI+2,AX STI ;开中断 JMP $ INTSR PROC ; CMP MIN,0509H ;比较当前时间是否在59分55秒00分00秒之间 JL NEXT1 CMP SEC,0505H MOV DX,20BH MOV AL,00H ;蜂鸣器低有效,报时 JMP NEXT2NEXT1: CMP MIN,0 JNE NEXT3 CMP SEC,0 MO
11、V DX,20BH MOV AL,00H ; JMP NEXT2NEXT3: MOV DX,20BH MOV AL,0FFHNEXT2: CMP COUNT,20 ;用8255产生0.5ms的蜂鸣 JLE NEXT4NEXT4: CALL KEYCHECK ;检测有无键按下 CMP AL,0AH ;启停键按下,调用启停程序 JNZ NEXT5 CALL TSTART JMP NEXT6NEXT5: CMP AL,0BH ;设置键按下,调用设置时间程序 JNZ NEXT6 CALL SETTIMENEXT6: INC COUNT ;当COUNT直为40时,加一秒,之后置0 CMP COUNT,4
12、0 ;25ms*40=1s JB NEXT7 CALL ADDONE MOV COUNT,0NEXT7: CALL SHOW ;显示时间 MOV AL,20H ;发EOI命令,结束中断 MOV DX,300H OUT DX,AL IRETINTSR ENDPTSTART PROC ;控制暂停和开始 CMP ST,00H JNE L1 DEC ST JMP L2 L1: INC ST L0: CALL KEYCHECK CMP AL,0AH JZ L2 CALL SHOW JMP L0 L2: RETTSTART ENDPADDONE PROC ;加1秒子程序 MOV AX,SEC ;当前秒个位
13、为9,加1后变0,十位加1 CMP AL,9 JE N1 INC AL MOV SEC,AX JMP N6N1: INC AH MOV AL,0 CMP AH,6 ;十位加1后为6,则秒变为00,分钟个位加1 JE N2 MOV SEC,AX JMP N6N2: MOV AX,0 MOV AX,MIN ; 当前分钟个位为9,加1后变0,十位加1 CMP AL,9 JE N3 MOV MIN,AXN3: MOV AL,0十位加1后为6,则分钟变为00,小时个位加1 JE N4N4: MOV AX,HOUR CMP AX,0204H ;小时加1后与24比,相等,则变为0 JE N5 MOV HOU
14、R,AX JMP N6N5:N6:ADDONE ENDPSETTIME PROC ;设置时间子程序 MOV HOUR,0 MOV MIN,0 MOV SEC,0 NOPL1:调用KEYCHECK,无键按下时,AL中值为0CH CALL DELAY CMP AL,0CH JNZ L2 JMP L1L2: CMP AL,02H JG L1 ;设置小时十位时,将其他各位数码管灭掉及对应的七段译码表0CH MOV AH,AL MOV BYTE PTRHOUR+1,AL MOV BYTE PTRHOUR,0CH MOV MIN,0C0CH MOV SEC,0C0CHL3: CALL SHOW设置小时的个
15、位 JZ L3 MOV AH,BYTE PTRHOUR+1L4: CMP AX,0204H JGE L1L5: CALL SHOW设置分钟的十位 JZ L5L6: CMP AL,06H JGE L1 MOV BYTE PTRMIN+1,AL L7:设置分钟的个位 JZ L7 MOV AH,BYTE PTRMIN+1 L8: CMP AX,0509H JG L1 L9:设置秒的十位 JZ L9 L10: CMP AL,06H MOV BYTE PTRSEC+1,ALL11:设置秒的个位 JZ L11 MOV AH,BYTE PTRSEC+1L12: CMP AX,0509H MOV SEC,AX
16、 L13: CALL SHOW CALL KEYCHECK ;再次按键,启动计时 JZ L13 RETSETTIME ENDPKEYCHECK PROC ;判断有无键按下子程序 PUSH BX CALL CLEAR MOV DX,PORT2 IN AL,DX AND AL,0FH CMP AL,0FH JZ EXIT ;有按键按下,延时消抖 NOP NOP 再次确认是否有键按下 IN AL,DX CMP AL,0FH JZ EXIT ;开始对每一列进行逐行扫描 MOV CX,3 MOV BL,0FEHNEXT:MOV AL,BL MOV DX,PORT2 IN AL,DX AND AL,0FH
17、 JNZ KEY ROL BL,1 LOOP NEXT JMP EXITKEY: SHL BL,4 OR AL,BL ;形成一个字节的键码信息存入AL,高4位为列信息低4位为行信息 LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12NEXT11: CMP AL,SI JZ FIND INC SI INC DI LOOP NEXT11 JMP EXITFIND: MOV AL,DI ;AL中内容为所按键的键面值 PUSH AXWAIT1: IN AL,DX ;判断按键是否已释放,若无则等待 CMP AL,0FH JNZ WAIT1 POP AX JMP EXIT2 EXI
18、T:MOV AL,0CH EXIT2:NOP POP BX KEYCHECK ENDPSHOW PROC ; XLAT MOV DX,PORT1 ;段选输出数据 MOV DX,PORT2 ;位选输出小时的个位 MOV AL,0C2H CALL CLEAR MOV AL,AH 位选输出小时的十位 MOV AL,0C1HCALL DELAY MOV AX,MIN位选输出分钟的个位 MOV AL,0C8H MOV AL,AH位选输出分钟的十位 MOV AL,0C4H MOV AX,SEC位选输出秒的个位 MOV AL,0E0h XLAT 位选输出秒的十位 MOV AL,0D0HSHOW ENDPCO
19、DE ENDS END BEGDELAY PROC ;延时子程序 PUSH CX MOV CX,1000 LOOP $ POP CXDELAY ENDPCLEAR PROC ;使七段译码管全灭子程序 MOV AL,00H MOV DX,PORT1 MOV DX,PORT2CLEAR ENDP五、总结为期不到一周的微机接口课程设计结束了,在这几天中,经过自身的努力,可以算得上是比较成功的完成了实验,但仍有不足之处。首先先谈谈这几天的收获。第一天定下了课设的题目,紧接着理清思路,明白实验大概的流程,并根据流程着手写相关的代码。第二天基本任务还是完善代码,并上机编译修改错误,由于当天时间较紧,虽然硬
20、件已经连接,但是仍有错误,无法正常运行,主要是因为中断服务程序无法进入,导致不能正常计时。第三天根据前一天的错误,找到问题所在:8259的一排端口无法正常使用,换了一排,就有结果,但是还是有许多问题。首先就是在设置时间时,数码管会变暗,因此,我增加了DELAY延时,结果正确,然而又出现了新的问题,也是在设置时间时,当我设置小时的十位的时候,个位也会出现数据,不过是乱码,经过老师的指导,才发现在SETTIME时,并没有清掉端口的值导致错误,经过修正后,结果正确。剩下的就是程序上有些小错误,比如说分钟以及秒的设置上,十位均要小于6,在这点上出现了问题等。这次课程设计,虽说时间不是很长,但我仍感觉到收获颇丰。首我的先编程能力得到了很大的提高,因为在之前的上机实验中,并没有像此次课设那样,要将多个芯片联合使用,这次的课设,使我懂得了设计程序的全局观念,并增强自身的纠错能力。这次课设将我平时所学的理论知识与实践充分结合的,让我更加深刻的了解了各芯片的工作原理,总之,这次的课设让我获益匪浅。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1