1、DATA SEGMENT DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252 ;各音阶发声的对应的不同频率值LEN DB 0, 6, 14, 22, 30, 38, 46, 54, 62 ;屏幕所画键盘的每个键身的右边界值DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DATA MOV DS,AXMOV AH,0 ; 设置屏幕显示图形方式:每屏幕字符数, 16色MOV AL,12H INT 10H ; 调用H的号功能中断MOV AH,6 ; 窗口上滚功能调用MOV AL,0 ; 设置
2、颜色为黑色MOV CH,0 MOV CL,0 MOV DH,18H MOV DL,4FH ;窗口坐标INT 10H ;执行中断MOV SI,360 ;键盘键身的最上面坐标MOV DX,480 ;键盘键身的最下面坐标MOV DI,540 ;键盘键身的右边界初始值MOV CX,540 ;画键盘键身的初始横坐标REDRAW: SUB DX,1 ;画完一行的键盘后画另一行CMP DX,445 ;为起到三维效果而产生斜线的临界坐标,比较JA ZHI ;大于就处在竖直的键盘处,跳转到画竖直部分代码处CMP DX,SI ;与键盘键身的最上边界比较JB LL ;低于此坐标说明整个键盘绘画完毕,跳转至发声程序代
3、码处XIE: ;低于临界坐标时要进行画斜线部分的坐标处理SUB DI,479 ;右边界和写点横坐标都减去固定值再减去SUB CX,539 ;右边界和写点横坐标都减去固定值再减去JMP HH ;跳转至写点的代码部分ZHI: ;高于临界坐标时任然要进行画竖直部分的坐标处理SUB DI,480 ;右边界和写点横坐标都减去固定值SUB CX,540 ;右边界和写点横坐标都减去固定值HH:MOV BL,0 ;对每个键盘键身的一行进行计数, PAINT: MOV AL,15 ;画白色键身MOV AH,0CH MOV BH,0 ;在第号显示页写点INT 10H ;10号中断的C号功能实现写点 INC CX
4、;写完一个点后纵坐标不变,横坐标加一继续写点CMP CX,DI JBE PAINT ;在没有超过右边界的时候按横坐标加一继续写点ADD DI,80 ;超过右边界后则对右边界和横坐标进行处理ADD CX,20 INC BL ;在这种情况下说明一个键盘键身的一行画完了,在纵坐标不变的情况下画下一个键盘键身的一行 CMP BL,6 ;设定键盘数目JBE PAINT JMP REDRAWLL: MOV AL,80H ;对进行初始化工作,A口、B口均为输出状态工作与方式OUT 63H,AL ;写入控制端口MOV AL,0B7H ;对计数器进行初始化工作,选号计数器,且先读写低位后高位,工作与模式OUT
5、43H,AL ;写入控制端口PP: MOV AH,01H ;调用键盘中断等待键盘输入,并将键盘输入对应的ASCII码值做出口参数存入AL INT 16H JZ PP ;没有键盘输入循环等待SUB AL,30H ;将对应的ASCII码值减去留下个位数值,以便取表中对应的边界值和发声频率值 CMP AL,08H ;AL中的参数将传递到SOUND子程序去,此处还有按键范围的作用,按键不是7将溢出跳出JAE OVER1CALL SOUND ;调用发声程序子程序JMP PP ;一个按键的发声结束,等下一个键盘输入OVER1:JMP OVER ;溢出SOUND PROC NEAR ;发声子程序PUSH A
6、X PUSH BX PUSH CX PUSH DX PUSH SI ;保护变量,以便在此子程序中用到变量时不至改变原值影响下面操作MOV AH,0 ;使SI中的值就是键盘参数的十进制值MOV SI,AX ; 保护AL于SI中,以待后用,作为参数传递MOV BX,OFFSET DAT XLAT ;差频率值表中的值,并赋给ALMOV DI,AX ;设置发声频率值的对应键盘所要频率MOV DX,12H MOV AX,34DCH ; PC机内置计数器的输入时钟脉冲频率的进制值DCDIV DI ;出后得到计数初值OUT 42H,AL ;先写低位MOV AL,AH OUT 42H,AL ;后写高位IN A
7、L,61H ;读PB口当前状态OR AL,3 ; 使PB0、PB1均为OUT 61H,AL ;接通扬声器,此时喇叭将在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作CALL DOWN ;调用使键盘产生向下按的效果的子程序WAIT1: IN AL,60H ;查看状态端口TEST AL,80H ;查询键是否放开 这样键不松开就会一直出声JZ WAIT1 ;未放开继续查询CALL UP ;调用使键盘产生向上跳起效子程序MOV AL,0 ;关闭扬声器OUT 61H,ALMOV AL,0H MOV AH,0CH INT 21HPOP SI ;还原变量POP DX POP CX POP B
8、X POP AX RETSOUND ENDPDOWN PROC NEAR ;键盘按下子程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DIMOV AX,SI ;将上面做参数保存起来的SI传递到此运用MOV BH,AL ;BH中表示按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值表得到键盘键身的右边界值,并将结果赋给AL POP BX ;BH中表示按得是什么键, PUSH BX ;将取出的右边界值作*10处理MOV BX,10MUL BXPOP BXMOV SI,AX ;SI中为横坐标的边界MOV DX,4
9、50 ;键盘竖直部分要实现按下效果的起始纵坐标MOV DI,475 ;键盘竖直部分实现按下效果的临界值GO: PUSH SI SUB SI,60 ;边界减去键盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI CA: MOV AL,0 ;对得到的(CX,DX)点进行写黑色实现擦除效果MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身的某行的一个个横坐标点CMP CX,SI ; 画好一行没有?JBE CA INC DX ;一行画好后画另一行CMP DX,DI JBE GOPOP DI POP DX POP CX POP BX POP AXRET
10、DOWN ENDPPUSH BX ;一段延时程序,以使键盘按下效果不至于太快PUSH CX MOV BX,1000 DELAY:MOV CX,0FfFH DL10MS:LOOP DL10MS DEC BX JNZ DELAY POP CX POP BXUP PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DIMOV AX,SI ;将上面做参数保存起来的SI传递到此运用 MOV BH,AL ;BH中表示按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值表得到键盘键身的右边界值,并将结果赋给AL
11、POP BX ;BH中表示按得是什么键, PUSH BXMOV BX,10 ;将取出的右边界值作*10处理MUL BXPOP BXMOV DX,475 ;键盘竖直部分要实现弹起效果的起始纵坐标MOV DI,450 ;键盘竖直部分要实现弹起效果的临界纵坐标OK: PUSH SI SUB SI,59 ;边界减去键盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI SB: MOV AL,15 ;对得到的(CX,DX)点进行写白色实现弹起效果MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身的某行的一个个横坐标点CMP CX,SI ; 画好一行没有?JBE SB DEC DX ;一行画好后画另一行CMP DX,DI JAE OKPOP DI POP DX POP CX POP BX POP AXRETUP ENDPOVER: MOV AH,4CH INT 21HCODE ENDS END START