找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2059|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机汇编计算器的问题(最高3位数运算)

[复制链接]
跳转到指定楼层
楼主
ID:335599 发表于 2018-5-28 11:09 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汇编计算器(最高3位数运算),想将4*4的矩阵键盘改为4*5的,原用p1.0-p1.3接行,p1.4-p1.7接列可以实现功能,改用p3.3到p3.4接键盘列,键盘扫描程序将读p1改为读p3却不能实现,还需要改其他吗?

  1. ORG     0000H;
  2. JMP     MAIN;
  3. ORG     0003H;
  4. JMP     INP0;
  5. ORG     0030H;
  6. /*键盘所输入数字依次存入70H-77H*/
  7. MAIN:   MOV   R6, #70H;
  8.         MOV   SP, #60H;
  9.                 CLR   80H;
  10.                 CLR   81H;
  11.                 SETB  EA;
  12.         SETB  EX0;
  13.                 SETB  IT0;
  14. DISP1:     MOV   R0,    #70H;//从第一位地址存数
  15.            MOV   R2,    #01H;//位选第一位
  16. DISP2:     MOV   A,     @R0;
  17.            LCALL SEG7;                 //跳转段码
  18.                    MOV   P0,    A;         //P0输出字形
  19.                    MOV   P2,    R2;         //位选输出
  20.                    LCALL D1MS;                 //跳转延时
  21.                    MOV   P2,    #0;         //位选关闭,段码不输出
  22.                    INC   R0;                 //选择下一位;
  23.                    MOV   A,     R2;         
  24.                    CLR   C;                         //进位标志清零
  25.                    RLC   A;                         //扫描字右移
  26.                    MOV   R2,    A;         //保存扫描字
  27.                    JNC  DISP2;                 //C=0时, 循环一次未结束,跳转到DISP2
  28. PASS:      LJMP  DISP1;
  29. D1MS:      MOV   R7,    #50H;//延时程序
  30. DMS:       DJNZ  R7,    DMS;

  31.                    RET;
  32. SEG7:      MOV   DPTR,  #TABLE;//查表程序
  33.            MOVC  A,     @A+DPTR;
  34.                    RET;
  35. TABLE:  DB    0C0H, 0F9H, 0A4H, 0B0H;
  36.         DB    99H,  92H,  82H,  0F8H;
  37.                 DB    80H,  90H,  88H,  83H;
  38.                 DB    0C6H, 0A1H, 86H,  8EH;
  39. /*P1.0-1.3,行线;    P1.4-1.7,列线;*/
  40. /*P0,输出字形;      P2,输出位选*/         
  41. INP0:         
  42.         PUSH  ACC;
  43.                 PUSH  B;
  44.                 PUSH  PSW;
  45. START:  MOV   R4, #00H;
  46. L1:     MOV   R3, #0F7H;//设扫描初值,11110111,P3.3=0
  47.         MOV   R1, #00H;        //取码指针;





  48. /*首先行扫描*/
  49. L2:     MOV   A,  R3;        //行扫描开始
  50.         MOV   P1, A;        //扫描值输出至p1
  51.                 MOV   A,  P1;        //读入P1的值
  52.                 MOV   R4, A;        //P3口中P3.4-3.7的状态通过A,传送到R4
  53.                 SETB  C;                //进位标志置1
  54.                 MOV   R5, #04H; //                  
  55. l3:     RLC   A;                //按键左移,通过C是否为0,判断此列是否有0;无0则r1进行累加;有0跳转到延时,
  56.         JNC   KEY;                //C=0,跳转到延时
  57.                 INC   R1;               
  58.                 DJNZ  R5, L3;
  59.                 MOV   A,  R3;      
  60.                 SETB  C;
  61.                 RRC   A;           //换行扫描
  62.                 MOV   R3,A;         
  63.                 JC    L2;           //C=1,跳转到L2
  64. KEY:    ACALL DELAY;
  65. D1:     MOV   A,P1;
  66.         XRL   A,R4;
  67.                 JNZ    D1;
  68.                 MOV   A,   R6; //指定存入地址
  69.                 MOV   R0,  A;  
  70.                 MOV   A,   R1; //存入数字
  71.                 MOV   @R0, A;




  72. /*判断运算法*/
  73.         MOV   A,     R1;
  74.                 XRL   A,     #0AH;//判断是否为加法符
  75.                 JZ    ADD1;
  76.                 MOV   A,     R1;
  77.                 XRL   A,   #0BH;//判断是否为减法符
  78.             JZ    SUBB1;
  79.                 MOV   A,     R1;
  80.                 XRL   A,   #0CH;//判断是否为乘法符
  81.             JZ    MUL1;
  82.                 MOV   A,     R1;
  83.                 XRL   A,   #0DH;//判断是否为除法符
  84.             JZ    DIV1;
  85.                 MOV   A,     R1;
  86.                 XRL   A,   #0EH;//判断是否为等于号
  87.             JZ    EQUAL1;
  88.                 MOV   A,     R1;
  89.                 XRL   A,   #0FH;//判断是否为清零键
  90.             JZ    ON1;



  91.    
  92.                 INC   R0;           //选择下一个地址
  93.                 MOV   A,   R0; //存入r0的新数值
  94.                 MOV   R6,  A;
  95.                 POP   PSW;
  96.                 POP          B;
  97.                 pop   ACC;
  98.                 RET;
  99. DELAY:  MOV   R7,   #60;//消除抖动延时程序
  100. DLY1:   DJNZ  R7,   DLY1;
  101.                 RET;



  102. ADD1:   MOV   A,    80H; //加法程序
  103.         MOV   81H,  A;
  104.         LJMP  D1;
  105.                 MOV   A,    81H;
  106.                 ADD   A,        80H;
  107.                 MOV   80H,  A;   
  108.         RET;



  109. SUBB1:  MOV   A,    80H;//减法程序
  110.         MOV   81H,  A;
  111.         LJMP  DD1;
  112.                 MOV   A,    80H;
  113.                 SUBB  A,    81H;
  114.                 MOV   80H,  A;
  115.         RET;



  116. MUL1:   MOV   A,    80H;//乘法程序
  117.                 MOV   81H,  A;
  118.         LJMP  DD1;
  119.                 MOV   A,    80H;
  120.                 MUL   AB;
  121.                 MOV          80H,  A;   
  122.         RET;




  123. DIV1:   MOV   A,    80H;//除法程序
  124.                 MOV   81H,  A;
  125.         LJMP  DD1;
  126.                 MOV   A,    80H;
  127.                 DIV   AB;
  128.                 MOV   80H,  A;  
  129.         RET;



  130. EQUAL1: MOV   A,    80H;//等于程序
  131.                 MOV   B,    #64H;//算百位数
  132.                 DIV   AB;
  133.                 MOV   72H,  A;         //将此数除100,商数放72h,余数放71h。
  134.                 MOV   71H,  B;
  135.                 MOV   A,    71H;
  136.                 MOV   B,    0AH;//算十位数
  137.                 DIV   AB;
  138.                 MOV   71H,  A;         //将此数除10,商数放71h,余数放70h。
  139.                 MOV   70H,  B;
  140.                 RET;


  141. ON1:    CLR    70H;                 //清零程序
  142.         CLR    71H;
  143.                 CLR    72H;
  144.                 CLR    73H;
  145.                 CLR    78H;
  146.                 CLR    79H;
  147.                 CLR    7AH;
  148.                 CLR    80H;
  149.                 CLR    81H;
  150.                 CLR    82H;
  151.                 CLR    88H;
  152.                 CLR    89H;
  153.                 CLR    8AH;
  154.                 MOV    R0, 00H;
  155.                 MOV    R1, 00H;
  156.                 MOV    R2, 00H;
  157.                 MOV    R3, 00H;
  158.                 MOV    R4, 00H;
  159.                 MOV    R5, 00H;
  160.                 MOV    R6, 70H;
  161.                 MOV    R7, 00H;
  162.                 RET;  


  163. DD1:    MOV   B,            #0AH;//将所输入两位数转换为十进制,并存入80h中
  164.         MOV   A,     78H;
  165.         MUL   AB;
  166.                 ADD   A,     70H;
  167.                 MOV   80H,   A;
  168.                 RET;
  169. END;
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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