4648|12

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

小妹求助C编程,感激涕零! [复制链接]

下面是大体程序:
(还需要实现的功能有:加入乘法和除法运算;能够连续运算;支持浮点数;你认为必要的更进一步完善。因为是按实验箱的按钮做的,与常规计算器不大一样。不过加法减法已经运行成功。)谢谢!

#include "reg51.h"
#include "absacc.h"
#include "intrins.h"

#define add_op 10
#define sub_op 11
#define equ_op 13

unsigned char buff[6];
unsigned char key;

unsigned char code seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void init_t0();

unsigned char get_key();

void beep();

main()
{
        int a,b,j;
        unsigned char op;
        unsigned char i,c;
        init_t0();
        while(1)
        {
                a=0;        /* 第一操作数 */
                b=0;        /* 第二操作数 */
                for(i=0;i<6;i++)        /* 最多显示6位 */
                {
                        c=get_key();        /* 以下输入第一操作数 */
                        if(c<10)
                        {
                                for(j=5;j>0;j--)
                                        buff[j]=buff[j-1];
                                buff[0]=c;
                                a=a*10+c;
                        }
                        else
                        {
                                op=c;        /* 输入操作符 */
                                break;
                        }
                }
                if(i==6) op=get_key();        /* 输入操作符 */
                for(j=0;j<6;j++)
                        buff[j]=0;        /* 清除显示 */
                if(op!=add_op&&op!=sub_op)
                {
                        /*show error */
                        beep();
                        continue;
                }
                for(i=0;i<6;i++)
                {
                        c=get_key();        /* 输入第二操作数 */
                        if(c<10)
                        {
                                for(j=5;j>0;j--)
                                        buff[j]=buff[j-1];
                                buff[0]=c;
                                b=b*10+c;
                        }
                        else
                        {
                                break;
                        }
                }
                if(i==6) op=get_key();
                if(c!=equ_op)
                {
                        /* 输入的不是等号,报错 */
                        beep();
                }
                else
                {
                        if(op==add_op)        /* 加法 */
                        {
                                a=a+b;
                        }
                        else if(op==sub_op)        /* 减法 */
                        {
                                a=a-b;
                        }
                        else
                        {
                                a=0;
                        }
                        /* add code here to display a's value */
                        buff[0]=a%10;
                        buff[1]=a%100/10;
                        buff[2]=a%1000/100;
                        buff[3]=a%10000/1000;
                        buff[4]=0;
                        buff[5]=0;
                }
        }
}

void int_t0(void) interrupt 1 using 1
{
     static unsigned char di=0;
     unsigned char i,col,line;
     if(di==0)
     {
         XBYTE[0x8004]=0;
         col=0xfe;
         for(i=0;i<6;i++)
         {
             XBYTE[0x8002]=col;
             line=XBYTE[0x8001];
             if(line!=0x0f)
             {   key=i+_irol_(line,4);
               ;
                 break;
             }
             col=_crol_(col,1);
         }
         if(i==6)
             key=0;
     }
     TH0=-5;
     XBYTE[0x8004]= seg[buff[di]];
     XBYTE[0x8002]=_crol_(1,di);
     di++;
     if(di==6)
     {
         di=0;
     }
}

void init_t0()
{
     TMOD= 0x01;
     TH0= -5;
     EA=1;
     ET0=1;
     TR0=1;
}
unsigned char get_key()
{
  unsigned char k;
  while(key==0);
  switch(key)
  {
  case 117:k=7;break;
  case 116:k=8;break;
  case 115:k=9;break;
  case 114:k=10;break;
   case 113:k=16;break;
   case 112:k=17;break;
     case 181:k=4;break;
     case 180:k=5;break;
     case 179:k=6;break;
     case 178:k=11;break;
     case 177:k=18;break;
     case 176:k=19;break;
         case 213:k=1;break;
         case 212:k=2;break;
         case 211:k=3;break;
         case 210:k=12;break;
         case 209:k=20;break;
         case 208:k=21;break;
           case 229:k=0;break;
           case 228:k=15;break;
           case 227:k=14;break;
           case 226:k=13;break;
           case 225:k=22;break;
           case 224:k=23;break;

  }
  while(key!=0);
  return k;
}

void beep()
{
}

最新回复

呵呵,写得漂亮.  详情 回复 发表于 2008-7-19 08:55
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
乘法与除法要注意类型或加入强制 转换
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
  1. 51单片机双字节乘法运算原理和除法运算原理
  2.        
  3. ****************************************************
  4. ;*            两字节无符号数乘法程序                *
  5. ;****************************************************
  6. ;             R7R6R5R4 <= R3R2 * R1R0
  7. ;
  8. MUL2BY2:  CLR   A             ;清零R4--R7
  9.           MOV   R7,  A
  10.           MOV   R6,  A
  11.           MOV   R5,  A
  12.           MOV   R4,  A
  13.           MOV   46H, #10H
  14. MULLOOP1: CLR   C             ;进位端清零
  15.           MOV   A,   R4
  16.           RLC   A
  17.           MOV   R4,  A
  18.           MOV   A,   R5
  19.           RLC   A
  20.           MOV   R5,  A
  21.           MOV   A,   R6
  22.           RLC   A
  23.           MOV   R6,  A
  24.           MOV   A,   R7
  25.           RLC   A
  26.           MOV   R7,  A
  27.           MOV   A,   R0
  28.           RLC   A
  29.           MOV   R0,  A
  30.           MOV   A,   R1
  31.           RLC   A
  32.           MOV   R1,  A
  33.           JNC   MULLOOP2
  34.           MOV   A,   R4
  35.           ADD   A,   R2
  36.           MOV   R4,  A
  37.           MOV   A,   R5
  38.           ADDC  A,   R3
  39.           MOV   R5,  A
  40.           MOV   A,   R6
  41.           ADDC  A,   #00H
  42.           MOV   R6,  A
  43.           MOV   A,   R7
  44.           ADDC  A,   #00H
  45.           MOV   R7,  A
  46. MULLOOP2: DJNZ  46H, MULLOOP1
  47.           RET

  48. ;
  49. ;****************************************************
  50. ;*            四字节/两字节无符号数除法程序         *
  51. ;****************************************************
  52. ;R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数)
  53. ;
  54. DIV4BY2:  MOV   46H,  #20H
  55.           MOV   R0,  #00H
  56.           MOV   R1,  #00H
  57. DIVLOOP1: MOV   A,   R4
  58.           RLC   A
  59.           MOV   R4,  A
  60.           MOV   A,   R5
  61.           RLC   A
  62.           MOV   R5,  A
  63.           MOV   A,   R6
  64.           RLC   A
  65.           MOV   R6,  A
  66.           MOV   A,   R7
  67.           RLC   A
  68.           MOV   R7,  A
  69.           MOV   A,   R0
  70.           RLC   A
  71.           MOV   R0,  A
  72.           MOV   A,   R1
  73.           RLC   A
  74.           MOV   R1,  A
  75.           CLR   C
  76.           MOV   A,   R0
  77.           SUBB  A,   R2
  78.           MOV   B,   A
  79.           MOV   A,   R1
  80.           SUBB  A,   R3
  81.           JC    DIVLOOP2
  82.           MOV   R0,  B
  83.           MOV   R1,  A
  84. DIVLOOP2: CPL   C
  85.           DJNZ  46H,  DIVLOOP1
  86.           MOV   A,   R4
  87.           RLC   A
  88.           MOV   R4,  A
  89.           MOV   A,   R5
  90.           RLC   A
  91.           MOV   R5,  A
  92.           MOV   A,   R6
  93.           RLC   A
  94.           MOV   R6,  A
  95.           MOV   A,   R7
  96.           RLC   A
  97.           MOV   R7,  A
  98.           RET
  99. 这是两个已经编好的程序
复制代码
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢楼上的,会给你加分。不过可以用C编一下吗?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

5
 
keil C 可以直接调二楼的
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
C更简单,都定义成 FLOAT 然后计算
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 happyflystone 的回复:
keil C 可以直接调二楼的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
二楼写的非常好
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
赞二楼,
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
把二楼的代码保存为asm
然后在keilc中可以直接使用

顶一下二楼的精神
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
C可以直接调用汇编?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
当然可以
__asm{

}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
呵呵,写得漂亮.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表