当前位置:   article > 正文

实验五 键盘按键与数码管显示(汇编与微机原理)_汇编按键数码管显示相应数字

汇编按键数码管显示相应数字

  键盘按键与数码管显示

实验目的:

熟悉星研集成开发环境,掌握微机接口程序编写调试的基本方法。

掌握矩阵式键盘的工作原理及识别键盘按键的方法。

掌握8段数码管显示数字或字符的工作原理和它的使用方法。

掌握用8255扫描键盘及用8255刷新数码管显示的方法。

实验:

      在(2行*8列)小键盘上任意按下某个按键,该键的键值将同时显示在8个数码管上。按键松开时显示上一次的按键值。

(2行*8列)小键盘:

     实验箱上2行*8列小键盘上当某个按键被按下时,该键所在行的行线值为0、所在列的列线值也为0。根据这个特点结合上述原理图采用“列扫描法”可以识别出当前被按下的按键。

8个数码管:

     实验箱上8个8段数码管。每个数码管有8个笔段,按逆时针方向依次称为a段、b段、c段、d段、e段、f段、g段、dp段,8个段接收来自外部的一个8位二进制数(D7—D0),并且笔段a 对应数据位D0……..笔段dp 对应数据位D7 ,由于数码管是共阳的,当段码端接收低电平时相应的笔段就会点亮,段码端接收的数据决定了数码管显示的具体内容。(例:要显示数字0,则笔段a、b、c、d、e、f  都必须点亮,笔段g、h不应该点亮,8个段接收的值应该是11000000,数据D0--D7就应该是11000000(0C0H),让段码端接收11000000它就会显示0)。

     数码管的位码控制GND端,当它接收低电平时该数码管会被选中有效工作:即这时只要段码端有有效的数据数码管就会显示数据,当它接收高电平时数码管不工作,这时即使段码端有有效数据数码管也不会显示任何数据。

8255各端口的分工:

      8255的A口工作在方式0输出状态控制数码管的段码;B端口工作在方式0输出状态控制数码管的位码,并且同时控制键盘列线的扫描;C端口工作在方式0输入状态,其中的PC0、PC1控制键盘的第一、第二行行值的读入。

实验代码:

  1. .MODEL TINY
  2. PA_8255 EQU 0270H
  3. PB_8255 EQU 0271H
  4. PC_8255 EQU 0272H
  5. CTRL_8255 EQU 0273H
  6. .STACK 100
  7. .DATA
  8. buffer DB ?
  9. SEG_TAB DB 0C0H, 0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H
  10. DB 080H, 90H, 88H, 83H, 0C6H,0A1H,86H,8EH,0FFH
  11. .CODE
  12. START: MOV AX,@DATA
  13. MOV DS,AX
  14. MOV ES,AX
  15. NOP
  16. MOV DX,CTRL_8255 ;8255初始化
  17. MOV AL,89H
  18. OUT DX,AL
  19. LEA SI,buffer
  20. MOV AL,10H ;默认数码管不显示
  21. MOV [SI],AL
  22. CALL DIR ;调用显示子程序
  23. MAIN2: LEA DI,buffer
  24. CALL Getkey ;得到按键在SEG_TAB中的值放入AL
  25. STOSB ;将AL赋值给DI指向的地址
  26. CALL DIR
  27. JMP MAIN2
  28. DIR PROC NEAR
  29. PUSH AX
  30. PUSH BX
  31. PUSH DX
  32. LEA SI,buffer ;置显示缓冲器初值
  33. MOV AL,[SI]
  34. LEA BX,SEG_TAB
  35. XLAT ;查表取显示数据->AL
  36. MOV DX,PA_8255
  37. OUT DX,AL ;AL段数据->8255 PA口
  38. MOV DX,PB_8255
  39. MOV AL,0 ;位码控制GND端低电平有效, 显示8位数据管
  40. OUT DX,AL
  41. CALL DL1ms
  42. POP DX
  43. POP BX
  44. POP AX
  45. RET
  46. DIR ENDP
  47. DL1ms PROC NEAR
  48. PUSH CX
  49. MOV CX,500
  50. LOOP $
  51. POP CX
  52. RET
  53. DL1ms ENDP
  54. GETKEY PROC NEAR
  55. PUSH BX
  56. PUSH DX
  57. LK: CALL AllKey ;调用判有无闭合键子程序
  58. JNE LK1
  59. CALL DIR ;调用显示子程序
  60. JMP LK
  61. ;补充程序完成列扫描,得到按键在SEG_TAB中的值放入AL
  62. LK1: MOV BL, 0FEH ;0FEH-->BL 第0列开始扫描,用BL保存列线扫描口数值,从PB0开始
  63. MOV BH, 0 ;0-->BH 用BH保存列线值,从第0列开始
  64. LK2: MOV DX, PB_8255 ;写B口位码控制端
  65. MOV AL, BL ;
  66. OUT DX, AL ;将BL写入B口列线控制端
  67. MOV DX, PC_8255 ;读C口
  68. IN AL, DX ;
  69. TEST AL, 1 ;PC0不等于0转向LONE继续判断PC1
  70. JNZ LONE ;
  71. MOV AL, 0 ;0行有键闭合,0-〉AL PC0等于0表示0行有键闭合,用BH存放按键值
  72. JMP LKP
  73. LONE: TEST AL, 2
  74. JNZ NEXT ;PC1不等于0则转向NEXT列计算器+1
  75. MOV AL, 08 ;1行有键闭合,08H-->AL
  76. LKP: ADD BH, AL ;用BH保存键值
  77. LK3: CALL AllKey
  78. JNE LK3 ;判断释放否
  79. MOV AL, BH ;BH键号->AL
  80. JMP EXIT
  81. NEXT: INC BH ;列计数器加1
  82. TEST BL, 80H ;
  83. JZ EXIT ;判是否已扫到最后一列则转向KEND
  84. ROL BL, 1 ;将BL循环左移一位
  85. JMP LK2
  86. EXIT: POP DX
  87. POP BX
  88. RET
  89. GETKEY ENDP
  90. AllKey PROC NEAR ;判断键盘是否有按键闭合
  91. MOV DX,PB_8255
  92. XOR AL,AL
  93. OUT DX,AL ;全"0"->扫描口,列线控制端低电平有效
  94. MOV DX,PC_8255 ;读C口数据
  95. IN AL,DX ;读键状态
  96. AND AL,03H ;取低二位
  97. CMP AL,3 ;取C口低二位和00000011b比较
  98. RET
  99. AllKey ENDP
  100. END START

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/408783
推荐阅读
相关标签
  

闽ICP备14008679号