找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3350|回复: 0
收起左侧

8086微机课设程序

[复制链接]
ID:212700 发表于 2017-6-19 19:41 | 显示全部楼层 |阅读模式
中南大学微机课程设计
0.png

8086源程序如下:
  1. INCLUDE ZUOZHE.INC
  2. INCLUDE HUANYING.inc
  3. INCLUDE ZAIJIAN.inc
  4. INCLUDE DAIJI.inc
  5. .386P
  6. IOY0 EQU 3000H ;片选 IOY0 对应的端口始地址
  7. IOY1 EQU 3040H
  8. IOY2 EQU 3080H
  9. IOY3 EQU 30C0H
  10. MY8251_DATA  EQU IOY2+00H*4 ;8251 数据寄存器
  11. MY8251_MODE  EQU IOY2+01H*4 ;8251 方式控制寄存器
  12. MY8254_COUNT2 EQU IOY3+02H*4 ;8254 计数器 2 端口地址
  13. MY8254_MODE EQU IOY3+03H*4 ;8254 控制寄存器端口地址
  14. MY8255_A EQU IOY0+00H*4 ;8255 的 A 口地址
  15. MY8255_B EQU IOY0+01H*4 ;8255 的 B 口地址
  16. MY8255_C EQU IOY0+02H*4 ;8255 的 C 口地址
  17. MY8255_MODE EQU IOY0+03H*4 ;8255 的控制寄存器地址
  18. STACK1 SEGMENT  STACK
  19.          DW 256 DUP(?)
  20. STACK1 ENDS
  21. DATA SEGMENT USE16
  22.      ADDR DW ?
  23. DTABLE DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H  
  24. STR2 DB '          1         

  25. STR3 DB '          2         

  26. STR4 DB '          3         


  27. STR5 DB '        BYE-BYE      

  28. DATA ENDS
  29. CODE SEGMENT USE16
  30. ASSUME CS:CODE,DS:DATA
  31. START: MOV AX,DATA
  32.        MOV DS,AX
  33. A2: MOV ADDR,OFFSET ZUOZHE
  34.        MOV SI,ADDR
  35. A1:    MOV  CX,20H
  36. LOOP2: CALL DISPHZ
  37.        SUB  SI,32
  38.        LOOP LOOP2
  39.        CALL CCSCAN
  40.        JNZ BEGIN
  41.        ADD  SI,2  
  42.        MOV  AX,SI      
  43.        SUB  AX,ADDR
  44.        CMP  AX,96               ;比较文字是否显示完毕
  45.        JNB  A2                  
  46.        JMP  A1      
  47. BEGIN: MOV  SI,3000H               ;建立缓冲区,存放要显示的键值
  48.            MOV  AL,00H                 ;先初始化键值为0
  49.            MOV  [SI],AL
  50.            MOV  [SI+1],AL
  51.            MOV  [SI+2],AL
  52.            MOV  [SI+3],AL
  53.            MOV  [SI+4],AL
  54.            MOV  [SI+5],AL
  55.            MOV  DI,3005H
  56.        MOV DX,MY8255_MODE ;初始化 8255 工作方式
  57.        MOV AL,81H ;方式 0,A 口、B 口输出,C 口低 4 位输入
  58.        OUT DX,AL
  59.        CALL DIS                    ;显示刷新                     
  60.            CALL CLEAR                  ;清屏
  61.        CALL CCSCAN ;扫描按键
  62.        JNZ GETKEY1 ;有键按下则跳置 GETKEY1
  63.        JMP BEGIN ;无按键则跳回继续循环,有则退出
  64. QUIT:  MOV AX,4C00H ;返回到 DOS
  65.        INT 21H
  66. GETKEY1:MOV CH,0FEH
  67.         MOV CL,00H ;设置当前检测的是第几列
  68. COLUM: MOV AL,CH ;选取一列,将 X1~X4 中一个置 0
  69.        MOV DX,MY8255_A
  70.        OUT DX,AL
  71.        MOV DX,MY8255_C ;读 Y1~Y4,用于判断是哪一行按键闭合
  72.        IN AL,DX
  73.    L1: TEST AL,01H ;是否为第 1 行
  74.        JNZ L2 ;不是则继续判断
  75.        MOV  AL,01H
  76.        CALL PUTBUF
  77.        JMP KEY1
  78.    L2: TEST AL,02H ;是否为第 2 行
  79.        JNZ L3 ;不是则继续判断
  80.        MOV  AL,02H
  81.        CALL PUTBUF
  82.        JMP KEY2
  83.    L3: TEST AL,04H ;是否为第 3 行
  84.        JNZ L4 ;不是则继续判断
  85.        MOV  AL,03H
  86.        CALL PUTBUF
  87.        JMP KEY3
  88.    L4: TEST AL,08H ;是否为第 4 行
  89.        JNZ COLUM ;不是则继续判断
  90.        MOV  AL,04H
  91.        CALL PUTBUF
  92.        JMP KEY4
  93. KEY1:      CALL FINSH
  94.            PUSH AX
  95.            CALL DIS                    ;显示刷新
  96.                POP  AX
  97.                PUSH BX
  98.                MOV BX,OFFSET STR2
  99.                CALL STRING
  100.                POP BX
  101.    A21:    MOV ADDR,OFFSET HUANYING
  102.            MOV SI,ADDR
  103.    A11:    MOV  CX,20H
  104.    LOOP21: CALL DISPHZ
  105.            SUB  SI,32
  106.            LOOP LOOP21
  107.            CALL CCSCAN
  108.            JNZ BEGIN
  109.            ADD  SI,2  
  110.            MOV  AX,SI      
  111.            SUB  AX,ADDR
  112.            CMP  AX,96               ;比较文字是否显示完毕
  113.            JNB  A21                  
  114.            JMP  A11      
  115. KEY2:      CALL FINSH
  116.            PUSH AX
  117.            CALL DIS                    ;显示刷新
  118.                POP  AX
  119.                MOV BX,OFFSET STR3
  120.                CALL STRING
  121.    A22:    MOV ADDR,OFFSET DAIJI
  122.            MOV SI,ADDR
  123.    A12:    MOV  CX,20H
  124.    LOOP22: CALL DISPHZ
  125.            SUB  SI,32
  126.            LOOP LOOP22
  127.            CALL CCSCAN
  128.            JNZ BEGIN
  129.            ADD  SI,2  
  130.            MOV  AX,SI      
  131.            SUB  AX,ADDR
  132.            CMP  AX,256               ;比较文字是否显示完毕
  133.            JNB  A22                  
  134.            JMP  A12      
  135. KEY3:      CALL FINSH
  136.            PUSH AX
  137.            CALL DIS                    ;显示刷新
  138.                POP  AX
  139.                MOV BX,OFFSET STR4
  140.                CALL STRING
  141.    A23:    MOV ADDR,OFFSET ZAIJIAN
  142.            MOV SI,ADDR
  143.    A13:    MOV  CX,20H
  144.    LOOP23: CALL DISPHZ
  145.            SUB  SI,32
  146.            LOOP LOOP23
  147.            CALL CCSCAN
  148.            JNZ BEGIN
  149.            ADD  SI,2  
  150.            MOV  AX,SI      
  151.            SUB  AX,ADDR
  152.            CMP  AX,96               ;比较文字是否显示完毕
  153.            JNB  A23                  
  154.            JMP  A13      
  155. KEY4:      CALL FINSH
  156.            PUSH AX
  157.            MOV BX,OFFSET STR5
  158.                CALL STRING
  159.            CALL DIS                    ;显示刷新
  160.                POP  AX
  161.                CALL CLEAR
  162.        MOV AX,4C00H ;结束程序退出
  163.        INT 21H
  164. CCSCAN PROC NEAR ;扫描是否有按键闭合子程序
  165.        MOV AL,00H
  166.        MOV DX,MY8255_A ;将 4 列全选通,X1~X4 置 0
  167.        OUT DX,AL
  168.        MOV DX,MY8255_C
  169.        IN AL,DX ;读 Y1~Y4
  170.        NOT AL
  171.        AND AL,0FH ;取出 Y1~Y4 的反值
  172.        RET
  173. CCSCAN ENDP
  174. DISPHZ PROC NEAR ;显示 1 屏汉字子程序
  175.        PUSH CX
  176.        MOV CX,16
  177.        MOV BX,0FFFEH
  178. LOOP1: MOV AL,BYTE PTR[SI]
  179.        MOV AH,BYTE PTR[SI+1]
  180.        ROL EAX,16
  181.        MOV AX,BX
  182.        ADD SI,2
  183.        ROL BX,1
  184.        NOT EAX
  185.        MOV DX,IOY1
  186.        OUT DX,EAX
  187.        CALL DALLY
  188.        LOOP LOOP1
  189.        POP CX
  190.        RET
  191.        DISPHZ ENDP
  192. DALLY PROC NEAR ;软件延时子程序
  193.        PUSH CX
  194.        PUSH AX
  195.        MOV CX,09H
  196.        D1: MOV AX,0F000H
  197.        D2: DEC AX
  198.        JNZ D2
  199.        LOOP D1
  200.        POP AX
  201.        POP CX
  202.        RET
  203. DALLY ENDP
  204. FINSH PROC NEAR
  205.        MOV  EAX,0                ;灭灯
  206.        MOV  DX,IOY1
  207.        OUT  DX,EAX
  208.        RET
  209. FINSH ENDP
  210. DIS PROC NEAR                      ;显示键值子程序
  211.        PUSH AX                     ;以缓冲区存放的键值为键值表偏移找到键值并显示
  212.            MOV  SI,3000H                              
  213.            MOV  DL,0DFH
  214.            MOV  AL,DL
  215. AGAIN: PUSH DX
  216.        MOV  DX,MY8255_A
  217.        OUT  DX,AL                  ;设置X1~X4,选通一个数码管   
  218.        MOV  AL,[SI]                ;取出缓冲区中存放键值                  
  219.        MOV  BX,OFFSET DTABLE
  220.            AND  AX,00FFH
  221.            ADD  BX,AX                  
  222.            MOV  AL,[BX]                ;将键值作为偏移和键值基地址相加得到相应的键值
  223.        MOV  DX,MY8255_B
  224.            OUT  DX,AL                  ;写入数码管A~Dp
  225.            CALL DALLY
  226.            INC  SI                     ;取下一个键值
  227.        POP  DX
  228.        MOV  AL,DL
  229.            TEST AL,01H                 ;判断是否显示完?
  230.        JZ   OUT1                   ;显示完,返回
  231.            ROR  AL,1            
  232.            MOV  DL,AL
  233.            JMP  AGAIN                  ;未显示完,跳回继续
  234. OUT1:  POP  AX                     
  235.            RET
  236. DIS ENDP
  237. CLEAR PROC NEAR                    ;清除数码管显示子程序
  238.        MOV  DX,MY8255_B            ;段位置0即可清除数码管显示   
  239.        MOV  AL,00H
  240.        OUT  DX,AL
  241.            RET
  242. CLEAR ENDP
  243. PUTBUF PROC NEAR                   ;保存键值子程序
  244.        MOV  SI,DI
  245.        MOV  [SI],AL
  246.            DEC  DI
  247.            CMP  DI,2FFFH
  248.            JNZ  GOBACK
  249.            MOV  DI,3005H
  250. GOBACK: RET
  251. PUTBUF ENDP
  252. STRING PROC NEAR
  253.        MOV AL, 0B6H ;初始化 8254,得到收发时钟
  254.        MOV DX, MY8254_MODE
  255.        OUT DX, AL
  256.        MOV AL, 0CH
  257.        MOV DX, MY8254_COUNT2
  258.        OUT DX, AL
  259.        MOV AL, 00H
  260.        OUT DX, AL
  261.        CALL INIT ;初始化 8251
  262.        CALL DALLY1
  263.        MOV AL,7EH
  264.        MOV DX, MY8251_MODE
  265.        OUT DX, AL  ;8251 方式字
  266.        CALL DALLY1
  267.        MOV AL, 34H
  268.        OUT DX, AL  ;8251 控制字
  269.        CALL DALLY1
  270.        MOV CX, 0016H ;10 个数
  271. A111: MOV AL, 37H
  272.        MOV DX, MY8251_MODE
  273.        OUT DX, AL
  274.        MOV AL, [BX]
  275.        MOV DX, MY8251_DATA
  276.        OUT DX, AL  ;发送数据
  277.        MOV DX, MY8251_MODE
  278. A222: IN AL, DX ;判断发送缓冲是否为空
  279.        AND AL, 01H
  280.        JZ A222
  281.        CALL DALLY
  282. A333: IN AL, DX ;判断是否接收到数据
  283.        AND AL, 02H
  284.        JZ A333
  285.        MOV DX, MY8251_DATA
  286.        IN AL, DX ;读取接收到的数据并显示
  287.        MOV DL,AL
  288.        MOV AH,02H
  289.        INT 21H
  290.        INC BX
  291.        LOOP A111
  292.        RET
  293. STRING ENDP
  294. INIT  PROC NEAR
  295.       MOV AL, 00H  ;复位 8251 子程序
  296.       MOV DX, MY8251_MODE
  297.       OUT DX, AL


  298. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:
微机课程设计.zip (5.55 KB, 下载次数: 33)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表