1、11110100F4311110001F140011100139511011001D9611011101DD70110000161811111101FD911111001F9A011111017Db100111019DC11001100CCd10110101B5E11011100DCF010111005CH001111013DL100011008C多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环依次点亮多个数码管,利用人眼的视觉暂留现象,只要扫描的频率足够大,将看不到闪烁现象。实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。在代
2、码中,Show这个过程是来显示数码管的。主程序流程图:图 7 主程序流程图源代码:CODE (070141.asm); FILENAME : 070141.asm AUTHOR : XIAO, Zhiqing ( No. 13, Cl. 07105 ) DATE : 20091216 DESCRIPTION : display 070141 on seven tubes array macro : myOut ( WARNING : it may change the value of AL ) its strongly recommended that data be ALmyOut MAC
3、RO portAddr, data PUSH DX MOV DX, portAddr MOV AL, data OUT DX, AL POP DXENDM myDigitOut ( WARNING :myDigitOut MACRO portAddr, data PUSH BX MOV BX , OFFSET SegLut MOV AL , data XLAT SegLut POP BX myIn ( WARNING :myIn MACRO portAddr, data IN AL, DX MOV data, ALData SEGMENT Segment Lookup TableSegLut
4、DB 0EDH , 21H , 0F5H , 0F1H , 39H ; 01234 DB 0D9H , 0DDH , 61H , 0FDH , 0F9H ;56789 DB 7DH , 9DH , 0CDH , 0D5H , 0DCH ;ABCDEF DB 3DH , 8CH ;HL Content index array to printContent DB 00H , 07H , 00H , 01H , 04H , 01H 8255PortA EQU 0E800HPortB EQU 0E801HPortC EQU 0E802HPortControl EQU 0E803HData ENDSS
5、tack SEGMENT STACK STACK DB 100H DUP ( ? )Stack ENDSCode SEGMENTASSUME CS : Code , DS: Data , SS : StackMain PROC PUSH DS XOR AX, AX PUSH AX MOV AX, Data MOV DS, AX myOut PortControl, 80H ; 1 000 0 00 0B means : ; A - mode 0 , output B - mode 0 , output C High - output C Low - output view : CALL Sho
6、w JMP view RET ; unreachable instructionMain ENDP proc Show input argument lists : POINTShow PROC PUSH CX PUSH SI MOV BX, OFFSET Content MOV CL, 01H ; initialize make CL = 00000001B , which means enable the left most digit MOV SI, 0nextDigit : myOut PortB, CL ; select tubes MOV AL, BYTE PTR BX + SI
7、; myDigitOut PortA, AL ; select segments POP CX ROL CL, 1 ; display the left digit next to current one INC SI ; next letter CALL Delay CALL CheckAndQuit CMP SI, 6 JNZ nextDigit POP SI RETShow ENDPDelay PROC MOV CX, 0F000HloopLabel: NOP LOOP loopLabelDelay ENDPcheckAndQuit PROC MOV AH, 0BH ; check wh
8、ether user input something from keyboard INT 21H OR AL, AL ; if he does, then return to Dos JZ exitCheckAndQuit myOut PortA, 0 ; myOut PortB, 0 ; MOV AX, 4C00HexitCheckAndQuit : POP AXcheckAndQuit ENDPCode ENDSEND Main经编译、连接、运行,显示正常,且能够成功返回DOS。图 8 静态显示学号2.2.2. 动态显示HELLO要求在数码管电路16位数码管上按下图所示的规律,动态显示字符
9、串HELLO,当主机键盘按下任意键时结束。利用实验一读入端口的功能,控制动态显示的速度。第一屏第二屏第三屏第四屏第五屏O第六屏图 9 HELLO显示次序按照我的设计,该程序要像上一个程序(070141.asm)一样,通过更新显示的下标数组Content来改变数码管显示。但是,实验指导要求使用以下方法:REQUIREMENT (实验二 8255A并行接口应用.pdf)在数据段,按下列规律设置12个字型码:MESG DB 0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0 POINT DW MESG POINT单元存放MESG单元的有效地址,程序取出POINT单元的内容BX,然
10、后用BX间址取数送数码管电路,扫描显示6个字符。每过0.5s将POINT单元的内容加1,再将POINT单元的内容BX,。POINT单元内容加1,使字符串显示的首地址向高地址移动一个单元,从而使6位字符串向“左”移动一位,实现动态显示。为了满足实验指导书的要求,我改动了程序的结构,不再使用查表的方法。图 10 动态显示HELLO流程图在本程序中,拨码开关S0控制是否移动。拨码开关往上拨,移动停止在第五屏;否则移动。拨码开关S1控制移动速度。拨码开关往上拨,移动变慢;拨码开关往下拨,移动变快。源代码如下:CODE (hello.asm) Hello.asm display Hello on sev
11、en tubes array USAGE : S0 : UP still , DOWN move S1 : UP slow , DOWN fastMESG DB 0, 0, 0, 0, 0, 0, 3DH, 0DCH, 8CH, 8CH, 0EDH, 0 ;HELLOPOINT DW MESG XUE 9 MODEPortSw EQU 0E8E0H JIAO 2 MODE PortSw EQU 0EEE0HSwState DB 0 switchers : 01H - 1 still, 0 move 02H - slow, fastViewIndex DB 0animation : CALL R
12、eadSwState TEST SwState , 02H JZ fast MOV CX, 0500Hfast : MOV CX, 0200H LOOP view CALL UpdateViewIndex JMP animation MOV BX, POINT make CL = 00000001B , which means enable the right most digit MOV CL, BYTE PTR BX + SI ; myOut PortA, CL ; MOV CX, 2000H myOut PortA , 00H myOut PortB , 00HUpdateViewInd
13、ex PROC TEST SwState, 01H JNZ stillMode INC POINT INC ViewIndex CMP ViewIndex, 7 JNZ exitUpdateViewIndex MOV POINT, OFFSET MESG MOV ViewIndex, 0 JMP exitUpdateViewIndexstillMode : MOV ViewIndex , 5 ADD POINT, 5exitUpdateViewIndex : RETUpdateViewIndex ENDPReadSwState PROC myIn PortSw, SwState POP AXR
14、eadSwState ENDP经过编译、连接、运行,可以正常运行。图 11 HELLO显示2.2.3. 回显小键盘输入检测行时,往控制口(0EE03H)写控制字88H,使C口(0EE02H)低八位(列)输出,高八位(行)输入。检测列时,往控制口(0EE03H)写控制字81H,使C口(0EE02H)高八位(行)输出,低八位(列)输入。首先,我利用debug,获得了每个按键对应的比特,制成了下表。根据下表,综合行值和列值,就可以知道按下了哪个键。表 3 检测到的二进制数与按钮值对应表测得键值*0111*1011*1101*11101110*1101*1011*B0111*D在本程序中,设置了防抖动
15、功能和防重复识别功能。当按下一个键后,一般情况下只会接收到一个值。但是,如果长按一个键,就会收到下一个值。这和普通PC键盘的体验相同,贴近广大用户的使用习惯。CODE (recur.asm) recur.asm display seven tubes array according to input testAndSet ( WARNING : refNum and incNum should be INSTANT number )testAndSet MACRO srcData , refNum , incNum LOCAL exitTestAndSet TEST srcData , ref
16、Num JNZ exitTestAndSet OR buttonIndex , incNum OR buttonPressed , 0FFHexitTestAndSet: NOPSegLut DB 0EDH , 21H , 0F4H , 0F1H , 39H ; DB 7DH , 9DH , 0CCH , 0B5H , 0DCH , 5CH ; DB 3DH , 8CH , 00H ; H ( 10H ) L ( 11H ) ( 12H )Content DB 12H , 12H , 12H , 12H , 12H , 12HbuttonPressed DB 0 ; 0FFH for pressed , 00H for not.buttonRow DB 0buttonCol DB 0buttonIndex DB 0buttonEnable DW 0000H C High - o
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1