电子工程小白

    1. 中断 4/1895 51单片机 2018-05-28
      你好,能帮忙看下程序吗?汇编计算器(最高3位数运算),想将4*4的矩阵键盘改为4*5的,原用p1.0-p1.3接行,p1.4-p1.7接列可以实现功能,改用p3.3到p3.4接键盘列,需要怎么改。下程序是全接p1口的,proteus仿真可以运行。 ORG     0000H; JMP     MAIN; ORG     0003H; JMP     INP0; ORG     0030H; /*键盘所输入数字依次存入70H-77H*/ MAIN:   MOV   R6, #70H;         MOV   SP, #60H;                 CLR   80H;                 CLR   81H;                 SETB  EA;         SETB  EX0;                 SETB  IT0; DISP1:     MOV   R0,    #70H;//从第一位地址存数            MOV   R2,    #01H;//位选第一位 DISP2:     MOV   A,     @R0;            LCALL SEG7;                 //跳转段码                    MOV   P0,    A;         //P0输出字形                    MOV   P2,    R2;         //位选输出                    LCALL D1MS;                 //跳转延时                    MOV   P2,    #0;         //位选关闭,段码不输出                    INC   R0;                 //选择下一位;                    MOV   A,     R2;                             CLR   C;                         //进位标志清零                    RLC   A;                         //扫描字右移                    MOV   R2,    A;         //保存扫描字                    JNC  DISP2;                 //C=0时, 循环一次未结束,跳转到DISP2 PASS:      LJMP  DISP1; D1MS:      MOV   R7,    #50H;//延时程序 DMS:       DJNZ  R7,    DMS;                    RET; SEG7:      MOV   DPTR,  #TABLE;//查表程序            MOVC  A,     @A+DPTR;                    RET; TABLE:  DB    0C0H, 0F9H, 0A4H, 0B0H;         DB    99H,  92H,  82H,  0F8H;                 DB    80H,  90H,  88H,  83H;                 DB    0C6H, 0A1H, 86H,  8EH; /*P1.0-1.3,行线;    P1.4-1.7,列线;*/ /*P0,输出字形;      P2,输出位选*/          INP0:                    PUSH  ACC;                 PUSH  B;                 PUSH  PSW; START:  MOV   R4, #00H; L1:     MOV   R3, #0F7H;//设扫描初值,11110111,P3.3=0         MOV   R1, #00H;        //取码指针; /*首先行扫描*/ L2:     MOV   A,  R3;        //行扫描开始         MOV   P1, A;        //扫描值输出至p1                 MOV   A,  P1;        //读入P1的值                 MOV   R4, A;        //P3口中P3.4-3.7的状态通过A,传送到R4                 SETB  C;                //进位标志置1                 MOV   R5, #04H; //                   l3:     RLC   A;                //按键左移,通过C是否为0,判断此列是否有0;无0则r1进行累加;有0跳转到延时,         JNC   KEY;                //C=0,跳转到延时                 INC   R1;                                DJNZ  R5, L3;                 MOV   A,  R3;                         SETB  C;                 RRC   A;           //换行扫描                 MOV   R3,A;                            JC    L2;           //C=1,跳转到L2 KEY:    ACALL DELAY; D1:     MOV   A,P1;         XRL   A,R4;                 JNZ    D1;                 MOV   A,   R6; //指定存入地址                 MOV   R0,  A;                   MOV   A,   R1; //存入数字                 MOV   @R0, A; /*判断运算法*/         MOV   A,     R1;                 XRL   A,     #0AH;//判断是否为加法符                 JZ    ADD1;                 MOV   A,     R1;                 XRL   A,   #0BH;//判断是否为减法符             JZ    SUBB1;                 MOV   A,     R1;                 XRL   A,   #0CH;//判断是否为乘法符             JZ    MUL1;                 MOV   A,     R1;                 XRL   A,   #0DH;//判断是否为除法符             JZ    DIV1;                 MOV   A,     R1;                 XRL   A,   #0EH;//判断是否为等于号             JZ    EQUAL1;                 MOV   A,     R1;                 XRL   A,   #0FH;//判断是否为清零键             JZ    ON1;                     INC   R0;           //选择下一个地址                 MOV   A,   R0; //存入r0的新数值                 MOV   R6,  A;                 POP   PSW;                 POP          B;                 pop   ACC;                 RET; DELAY:  MOV   R7,   #60;//消除抖动延时程序 DLY1:   DJNZ  R7,   DLY1;                 RET; ADD1:   MOV   A,    80H; //加法程序         MOV   81H,  A;         LJMP  D1;                 MOV   A,    81H;                 ADD   A,        80H;                 MOV   80H,  A;            RET; SUBB1:  MOV   A,    80H;//减法程序         MOV   81H,  A;         LJMP  DD1;                 MOV   A,    80H;                 SUBB  A,    81H;                 MOV   80H,  A;         RET; MUL1:   MOV   A,    80H;//乘法程序                 MOV   81H,  A;         LJMP  DD1;                 MOV   A,    80H;                 MUL   AB;                 MOV          80H,  A;            RET; DIV1:   MOV   A,    80H;//除法程序                 MOV   81H,  A;         LJMP  DD1;                 MOV   A,    80H;                 DIV   AB;                 MOV   80H,  A;           RET; EQUAL1: MOV   A,    80H;//等于程序                 MOV   B,    #64H;//算百位数                 DIV   AB;                 MOV   72H,  A;         //将此数除100,商数放72h,余数放71h。                 MOV   71H,  B;                 MOV   A,    71H;                 MOV   B,    0AH;//算十位数                 DIV   AB;                 MOV   71H,  A;         //将此数除10,商数放71h,余数放70h。                 MOV   70H,  B;                 RET; ON1:    CLR    70H;                 //清零程序         CLR    71H;                 CLR    72H;                 CLR    73H;                 CLR    78H;                 CLR    79H;                 CLR    7AH;                 CLR    80H;                 CLR    81H;                 CLR    82H;                 CLR    88H;                 CLR    89H;                 CLR    8AH;                 MOV    R0, 00H;                 MOV    R1, 00H;                 MOV    R2, 00H;                 MOV    R3, 00H;                 MOV    R4, 00H;                 MOV    R5, 00H;                 MOV    R6, 70H;                 MOV    R7, 00H;                 RET;   DD1:    MOV   B,            #0AH;//将所输入两位数转换为十进制,并存入80h中         MOV   A,     78H;         MUL   AB;                 ADD   A,     70H;                 MOV   80H,   A;                 RET; END;
    2. 中断 4/1895 51单片机 2018-05-28
      :congratulate:

最近访客

< 1/1 >

统计信息

已有3人来访过

  • 芯积分:--
  • 好友:--
  • 主题:1
  • 回复:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言