矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 17097|回复: 23

请问各位老师,有没有人用单片机DIY过计算器

[复制链接]
     
发表于 2007-5-22 12:34:23 | 显示全部楼层 |阅读模式
请问各位老师,有没有人用单片机DIY过计算器
我倒有这个想法,做一个8位的计算器,功能不要太多,有加减乘除就够了,但苦于不会单片机编程
哪位老师做过,展示一下吧
     
发表于 2007-5-22 18:37:32 | 显示全部楼层
做过一个,显示和键盘都是从旧机器上拆下来的,不过机器早已给一个朋友了。
好象程序还在:
这个还是个带时钟的。

  1. //---------------------------------------------------
  2. //CLOCK CALCULATOR 1.0 written by HeLiang 2000.2.25
  3. //Email:lianghe@126.com   [url]http://spacemirror.yeah.net[/url]
  4. //This is a freeware. If you find bugs please tell me.
  5. //Thanks!     He Liang  2000.2.25
  6. //---------------------------------------------------
  7. #include <reg51.h>
  8. #include <stdio.h>
  9. #include <absacc.h>
  10. #define dbp (*((unsigned int *)0x2C001L))
  11. unsigned char dbuf[12];
  12. unsigned int delaycnt=0;
  13. idata unsigned char number[7];
  14. idata unsigned char prenumber[7];
  15. idata unsigned char memory[7];
  16. bit pointON=0,newenter=1,overflow=0,result=0,numenter=1;
  17. unsigned char temp[12],lastc=0,tpoint=0;


  18. #include "clockfnc.c"
  19. void inittimer0(void)
  20. {
  21.     TMOD&=0xf0;
  22.     TMOD+=0x02;
  23.     TH0=TL0=6;
  24.     TR0=1;
  25.     ET0=1;
  26.     EA=1;
  27. }
  28. void cls(void)
  29. {
  30.     unsigned char i;
  31.     for(i=0;i<12;i++)dbuf[i]=0;
  32. }

  33. void settime(void)
  34. {
  35.     code unsigned char stbl[]={0,1,3,4,6,7};
  36.     unsigned char i,c;
  37.     cls();
  38.     dbuf[2]=asctb['-'-0x20];
  39.     dbuf[5]=asctb['-'-0x20];
  40.     for(i=5;i<7;i--)
  41.     {
  42.         c=_getkey();
  43.         if(c=='o')c='0';
  44.         if(c>='0'&&c<='9')
  45.         {
  46.              temp[i]=c-0x30;
  47.              dbuf[stbl[i]]=asctb[temp[i]+0x10];
  48.         }
  49.         else goto stquit;
  50.     }
  51.     EA=0;
  52.     sec=(temp[0]+temp[1]*10)%60;
  53.     min=(temp[2]+temp[3]*10)%60;
  54.     hour=(temp[4]+temp[5]*10)%24;
  55.     timcnt=4000;
  56.     EA=1;
  57. stquit:
  58.     return;
  59. }
  60. void showtime(void)
  61. {
  62.     unsigned char se;
  63.     cls();
  64.     while(1)
  65.     {
  66.         se=timekey();
  67.         if(se=='B')settime();
  68.         else if(se=='R')break;
  69.     }

  70. }
  71. unsigned char getbcd(unsigned char *p,unsigned char c)
  72. {
  73.     if((c&1)==0)
  74.     {
  75.         c>>=1;
  76.         return p[c]&0xf;
  77.     }
  78.     else
  79.     {
  80.         c>>=1;
  81.         return (p[c]&0xf0)>>4;
  82.     }

  83. }
  84. void putbcd(unsigned char *p,unsigned char c,unsigned char a)
  85. {
  86.     if((c&1)==0)
  87.     {
  88.         c>>=1;
  89.         p[c]&=0xf0;
  90.         p[c]|=a&0xf;
  91.     }
  92.     else
  93.     {
  94.         c>>=1;
  95.         a<<=4;
  96.         p[c]&=0xf;
  97.         p[c]|=a&0xf0;
  98.     }
  99. }

  100. void transbuf(void)
  101. {
  102.     unsigned char i;
  103.     for(i=0;i<7;i++)prenumber[i]=number[i];
  104. }
  105. void alterbuf(void)
  106. {
  107.     unsigned char i,c;
  108.     for(i=0;i<7;i++)
  109.     {
  110.         c=number[i];
  111.         number[i]=prenumber[i];
  112.         prenumber[i]=c;
  113.     }
  114. }
  115. void clearbuf(void)
  116. {
  117.     unsigned char i;
  118.     for(i=0;i<7;i++)number[i]=0;
  119.     pointON=0;
  120.     numenter=0;
  121.     newenter=0;
  122. }
  123. void movebuf(void)
  124. {
  125.     unsigned char i;
  126.     for(i=10;i>0;i--)putbcd(number,i,getbcd(number,i-1));
  127.     if(pointON)number[6]++;
  128. }
  129. void unmove(void)
  130. {
  131.     unsigned char i;
  132.     putbcd(number,10,0);
  133.     for(i=0;i<11;i++)putbcd(number,i,getbcd(number,i+1));
  134.     if((number[6]&0x7f)>0)number[6]--;
  135.     else pointON=0;
  136. }
  137. bit inputnumber(unsigned char c)
  138. {
  139.     unsigned char i;
  140.     if(numenter)clearbuf();
  141.     if(getbcd(number,10)!=0||(number[6]&0x7f)>9)return 0;
  142.     movebuf();
  143.     putbcd(number,0,c-0x30);
  144.     return 1;
  145. }
  146. void dispnumber(void)
  147. {
  148.     unsigned char i;
  149.     bit zero=0;
  150.     if(overflow)
  151.     {
  152.         for(i=1;i<12;i++)dbuf[i]=0;
  153.         dbuf[4]=asctb['E'-0x20];
  154.         dbuf[3]=asctb['R'-0x20];
  155.         dbuf[2]=asctb['R'-0x20];
  156.         dbuf[1]=asctb['O'-0x20];
  157.         dbuf[0]=asctb['R'-0x20];
  158.         return;
  159.     }
  160.     for(i=10;i<11;i--)
  161.     {
  162.         if(zero||getbcd(number,i)!=0||i==(number[6]&0x7f))
  163.         {
  164.            dbuf[i]=asctb[getbcd(number,i)+0x10];
  165.            zero=1;
  166.         }
  167.         else dbuf[i]=0;
  168.     }
  169.     dbuf[number[6]&0x7f]|=0x8;
  170.     if(number[6]&0x80)dbuf[11]=0x80;else dbuf[11]=0;
  171.     for(i=0;i<6;i++)if(memory[i]!=0)break;
  172.     if(i!=6)dbuf[11]|=0x20;
  173. }
  174. void tempmove(unsigned char c)
  175. {
  176.     unsigned char i;
  177.     c%=24;
  178.     for(i=0;i<24-c;i++)putbcd(temp,i,getbcd(temp,i+c));
  179.     for(;i<24;i++)putbcd(temp,i,0);
  180. }
  181. void temp2num(unsigned char *p)
  182. {
  183.     unsigned char i;
  184.     for(i=0;i<24;i++)
  185.     {
  186.         if(getbcd(temp,i)!=0)break;
  187.         if(tpoint==0)break;
  188.         tpoint--;
  189.     }
  190.     if(tpoint>10){i+=tpoint-10;tpoint=10;}
  191.     tempmove(i);
  192.     for(i=23;i!=0;i--)if(getbcd(temp,i)!=0)break;
  193.     if(i>10)
  194.     {
  195.         i-=10;
  196.         if(tpoint>=i)
  197.         {
  198.             tempmove(i);
  199.             tpoint-=i;
  200.         }
  201.         else overflow=1;
  202.     }
  203.     if(tpoint>10)tpoint%=11;
  204.     p[6]&=0x80;
  205.     p[6]|=tpoint;
  206.     for(i=0;i<11;i++)putbcd(p,i,getbcd(temp,i));
  207. }
  208. //----------------------add-------------------------------
  209. void add(unsigned char *p1,unsigned char *p2,unsigned char *p3)
  210. {
  211.     unsigned char i,c,prec,a,b;
  212.     unsigned char cy=0;
  213.     bit big=0;
  214.     tpoint=p2[6]&0x7f;
  215.     c=p1[6]&0x7f;
  216.     if(tpoint<c)tpoint=c;
  217.     c=tpoint-p1[6]&0x7f;
  218.     prec=tpoint-p2[6]&0x7f;
  219.     if((p1[6]&0x80)==(p2[6]&0x80))
  220.     {
  221.         for(i=0;i<24;i++)
  222.         {
  223.             if(i-c<11)a=getbcd(p1,i-c);else a=0;
  224.             if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
  225.             a=a+b+cy;
  226.             if(a>9){putbcd(temp,i,a-10);cy=1;}
  227.             else {putbcd(temp,i,a);cy=0;}
  228.         }
  229.     }
  230.     else
  231.     {
  232.         for(i=23;i<24;i--)
  233.         {
  234.             if(i-c<11)a=getbcd(p1,i-c);else a=0;
  235.             if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
  236.             if(a>b){big=1;break;}
  237.             if(a<b){big=0;break;}
  238.         }
  239.         for(i=0;i<24;i++)
  240.         {
  241.             if(i-c<11)a=getbcd(p1,i-c);else a=0;
  242.             if(i-prec<11)b=getbcd(p2,i-prec);else b=0;
  243.             if(big)a=a-b-cy;else a=b-a-cy;
  244.             if(a>9){putbcd(temp,i,a+10);cy=1;}
  245.             else {putbcd(temp,i,a);cy=0;}
  246.         }
  247.         p3[6]&=0x7f;
  248.         if(big)p3[6]|=(p2[6]&0x80)^0x80; else p3[6]|=p2[6]&0x80;
  249.     }
  250.     temp2num(p3);
  251. }
  252. //-----------------------multi------------------------------
  253. void multi(unsigned char *p1,unsigned char *p2,unsigned char *p3)
  254. {
  255.     unsigned char i,j,c,t;
  256.     for(i=0;i<12;i++)temp[i]=0;
  257.     for(i=0;i<11;i++)
  258.     {
  259.         c=0;
  260.         for(j=0;j<11;j++)
  261.         {
  262.             t=getbcd(p1,j)*getbcd(p2,i)+c+getbcd(temp,i+j);
  263.             c=t/10;
  264.             putbcd(temp,i+j,t%10);
  265.         }
  266.         putbcd(temp,i+j,c);
  267.     }
  268.     tpoint=(p1[6]&0x7f)+(p2[6]&0x7f);
  269.     c=(p1[6]&0x80)^(p2[6]&0x80);
  270.     p3[6]&=0x7f;
  271.     p3[6]|=c;
  272.     temp2num(p3);
  273. }
  274. //------------------------divide----------------------------
  275. void moveright(unsigned char *p,unsigned char c)
  276. {
  277.     unsigned char i;
  278.     c%=12;
  279.     for(i=0;i<12-c;i++)putbcd(p,i,getbcd(p,i+c));
  280.     for(;i<12;i++)putbcd(p,i,0);
  281. }
  282. void moveleft(unsigned char *p,unsigned char c)
  283. {
  284.     unsigned char i;
  285.     if(c==0)return;
  286.     for(i=11;i>=c;i--)putbcd(p,i,getbcd(p,i-c));
  287.     for(;i<12;i--)putbcd(p,i,0);
  288. }
  289. unsigned char sub(unsigned char *p1,unsigned char *p2)  //0 p1>=p2  1 p1<p2
  290. {
  291.     unsigned char i,c,cy=0,cn;
  292.     cn=0;
  293.     while(cn<10)
  294.     {
  295.         for(i=11;i<12;i--)
  296.         {
  297.             if(getbcd(p1,i)<getbcd(p2,i))return cn;
  298.             if(getbcd(p1,i)>getbcd(p2,i))break;
  299.         }
  300.         cy=0;
  301.         for(i=0;i<12;i++)
  302.         {
  303.             c=getbcd(p1,i)-getbcd(p2,i)-cy;
  304.             if(c>=10){cy=1;c+=10;}
  305.             else cy=0;
  306.             putbcd(p1,i,c);
  307.         }
  308.         cn++;
  309.     }
  310.     return 0;
  311. }

  312. void div(unsigned char *p1,unsigned char *p2,unsigned char *p3)
  313. {
  314.     unsigned char i,po1,po2,c;
  315.     po1=p1[6]&0x7f;po2=p2[6]&0x7f;

  316.     for(i=0;i<6;i++)temp[i]=p1[i];
  317.     for(i=0;i<6;i++)temp[i+6]=p2[i];

  318.     for(i=10;i!=0;i--)if(getbcd(temp,i)!=0)break;
  319.     if(i<10){moveleft(temp,10-i);po1+=10-i;}
  320.     for(i=10;i<11;i--)if(getbcd(temp+6,i)!=0)break;
  321.     if(i<10){moveleft(temp+6,10-i);po2+=10-i;}else{overflow=1;return;}

  322.     for(i=11;i<12;i--)
  323.     {
  324.         c=sub(temp,temp+6);
  325.         putbcd(p3,i,c);
  326.         moveleft(temp,1);
  327.     }
  328.     if(getbcd(p3,11)!=0){moveright(p3,1);c=10;}
  329.     else c=11;
  330.     c+=po1-po2;
  331.     if(c<0x80)
  332.     {
  333.         if(c>10)
  334.         {
  335.             c-=10;
  336.             moveright(p3,c);
  337.             c=10;
  338.         }
  339.     }
  340.     else
  341.     {
  342.         overflow=1;
  343.     }
  344.     if(c>10)c%=11;
  345.     c|=(p1[6]&0x80)^(p2[6]&0x80);
  346.     p3[6]=c;
  347. }
  348. //------------------------MR--------------------------
  349. void memoryrestore(void)
  350. {
  351.     unsigned char i;
  352.     for(i=0;i<7;i++)number[i]=memory[i];
  353. }
  354. //----------------------------------------------------
  355. void sortzero(unsigned char *p)
  356. {
  357.     unsigned char i;
  358.     for(i=0;i<11;i++)
  359.     {
  360.         if(getbcd(p,i)!=0)break;
  361.         if((p[6]&0x7f)==0)break;
  362.         p[6]--;
  363.     }
  364.     moveright(p,i);
  365.     for(i=0;i<6;i++)if(p[i]!=0)break;
  366.     if(i==6)p[6]=0;
  367. }
  368. //------------------------ M+ ----------------------------
  369. void memoryplus(void)
  370. {
  371.     add(memory,number,memory);
  372.     sortzero(memory);
  373. }
  374. //------------------------MC--------------------------
  375. void memoryclear(void)
  376. {
  377.     unsigned char i;
  378.     for(i=0;i<7;i++)memory[i]=0;
  379. }
  380. //------------------------ M- ---------------------------
  381. void memorysub(void)
  382. {
  383.     number[6]^=0x80;
  384.     add(memory,number,memory);
  385.     number[6]^=0x80;
  386.     sortzero(memory);
  387. }
  388. //----------------------------------------------------
  389. void cal(void)
  390. {
  391.     if(lastc==0)return;
  392.     if(result)return;
  393.     cls();
  394.     dbuf[10]=asctb['r'-0x20];
  395.     dbuf[9]=asctb['v'-0x20];
  396.     dbuf[8]=asctb['n'-0x20];
  397.     if(!newenter)alterbuf();
  398.     switch(lastc)
  399.     {
  400.         case '+':
  401.             add(number,prenumber,number);
  402.             break;
  403.         case '-':
  404.             prenumber[6]^=0x80;
  405.             add(number,prenumber,number);
  406.             prenumber[6]^=0x80;
  407.             break;
  408.         case '*':
  409.             multi(number,prenumber,number);
  410.             break;
  411.         case '/':
  412.             div(number,prenumber,number);
  413.             break;
  414.     }
  415.     sortzero(number);
  416. }
  417. void cputs(char *p)
  418. {
  419.     while(*p!=0){putchar(*p);p++;delay(500);}
  420. }


  421. main()
  422. {
  423.     unsigned char c;
  424.     inittimer0();
  425.     cputs("Clock Calculator 1.0 By He Liang");
  426.     delay(4000);
  427.     showtime();
  428.     overflow=0;
  429.     clearbuf();
  430.     transbuf();
  431.     lastc=0;
  432.     result=0;
  433.     newenter=1;
  434.     numenter=1;
  435.     while(1)
  436.     {
  437.         dispnumber();
  438.         c=_getkey();
  439.         if(c>='0'&&c<='9')inputnumber(c);
  440.         else if(c=='o')
  441.         {
  442.             inputnumber('0');
  443.             inputnumber('0');
  444.         }
  445.         else if(c=='.'){if(numenter)clearbuf();pointON=1;}
  446.         else if(c=='H'){if(!numenter)unmove();}
  447.         else if(c=='F')number[6]^=0x80;
  448.         else
  449.         {
  450.             switch(c)
  451.             {
  452.                 case '+':
  453.                     if(!newenter)cal();
  454.                     transbuf();
  455.                     lastc='+';
  456.                     result=0;
  457.                     break;
  458.                 case '-':
  459.                     if(!newenter)cal();
  460.                     transbuf();
  461.                     lastc='-';
  462.                     result=0;
  463.                     break;
  464.                 case '*':
  465.                     if(!newenter)cal();
  466.                     transbuf();
  467.                     lastc='*';
  468.                     result=0;
  469.                     break;
  470.                 case '/':
  471.                     if(!newenter)cal();
  472.                     transbuf();
  473.                     result=0;
  474.                     lastc='/';
  475.                     break;
  476.                 case 'S':
  477.                     if(result)newenter=1;
  478.                     result=0;
  479.                     cal();
  480.                     result=1;
  481.                     break;
  482.                 case 'R':
  483.                     clearbuf();
  484.                     transbuf();
  485.                     overflow=0;
  486.                     lastc=0;
  487.                     result=0;
  488.                     break;
  489.                 case 'G':
  490.                     if(overflow)
  491.                     {
  492.                         overflow=0;
  493.                         clearbuf();
  494.                         transbuf();
  495.                         lastc=0;
  496.                         result=0;
  497.                     }
  498.                     clearbuf();
  499.                     break;
  500.                 case 'B':
  501.                     if(!newenter)cal();
  502.                     memoryplus();
  503.                     lastc=0;
  504.                     break;
  505.                 case 'C':
  506.                     if(!newenter)cal();
  507.                     memorysub();
  508.                     lastc=0;
  509.                     break;
  510.                 case 'D':
  511.                     memoryclear();
  512.                     break;
  513.                 case 'E':
  514.                     showtime();
  515.                     break;

  516.             }
  517.             numenter=1;
  518.             if(c=='A')
  519.             {
  520.                 memoryrestore();
  521.                 newenter=0;
  522.             }
  523.             else  newenter=1;
  524.         }

  525.     }
  526. }
  527. code char ver[]="Written by He Liang 2000.2.25 Email:lianghe@126.com";

复制代码
     
发表于 2007-5-22 19:41:30 | 显示全部楼层
翌阳写过的程序好多哦..

不知能不能打包上传到ftp里面..

最近想学些c.很想参考一下..
     
 楼主| 发表于 2007-5-22 20:51:54 | 显示全部楼层
翌阳老师能不能上一张电路图啊,C程序我看不懂,但感觉好像是用1602液晶屏的,能否改为LED数码管显示的?如果能的话,我很想现在就动手搭电路
     
发表于 2007-5-22 21:23:00 | 显示全部楼层
很多年前的事了,机器不在我这儿,电路也记不得了。总之就是差不多标准的8031+10位LED+键盘的图。
当然,由于硬件图不同,程序上需要调整一下。还有,这个程序除法有点小问题,朋友当时说他基本上不会用除法,加和乘就够了。
别看一会输出这输出那的,那些字符都是用LED模拟出来的,有些基本上看不成型,只是自己认识就是了。
程序是C51的,用C来写程序简单多了。
     
发表于 2007-5-22 22:06:01 | 显示全部楼层

翌阳,您好!

#include "clockfnc.c"

这个程序是否还有?

程序还看不懂,但想学习下.如果这个别clockfnc也是一部分的话能否提供一下.
发表于 2007-5-22 22:26:17 | 显示全部楼层
程序缺注释,不太容易看懂
     
发表于 2007-5-22 22:41:42 | 显示全部楼层
我用6502内核的单片机做过"计算器+万年历+时钟+闹钟+电子电话本",只不过都上交给公司老板了,不知道算不算DIY.
     
发表于 2007-5-22 23:03:13 | 显示全部楼层

CLOCKFNC.C


  1. code unsigned char asctb[]={0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x40,0x63,0x36,
  2.         0x00,0x00,0x06,0x80,0x08,0x00,0x77,0x14,0xb3,0xb6,0xd4,0xe6,0xe7,0x34,
  3.         0xf7,0xf6,0x00,0x00,0x00,0x82,0x00,0xb1,0x00,0xf5,0xc7,0x83,0x97,0xe3,
  4.         0xe1,0x67,0xd5,0x04,0x16,0xc1,0x43,0x75,0x85,0x87,0xf1,0xf4,0x81,0xc4,
  5.         0x61,0x57,0x07,0xd7,0xd1,0xd6,0xb3,0x63,0x00,0x36,0x00,0x02,0x10,0xf5,
  6.         0xc7,0x83,0x97,0xe3,0xe1,0x67,0xd5,0x04,0x16,0xc1,0x43,0x75,0x85,0x87,
  7.         0xf1,0xf4,0x81,0xc4,0x61,0x57,0x07,0xd7,0xd1,0xd6,0xb3,0x63,0x41,0x36,
  8.         0x20,0x00};
  9. code unsigned char keytbl[]="ABCD7410852o963.-..+EFGH/*RS";
  10. data unsigned char hour=0,min=0,sec=0;
  11. data unsigned int timcnt=4000;
  12. void timer0(void) interrupt 1
  13. {
  14.     static unsigned int k=1;
  15.     static unsigned char dc=0;
  16.     k<<=1;
  17.     dc++;
  18.     if(dc>=12)dc=0;
  19.     if((k&0xfff)==0){k=1;dc=4;}
  20.     dbp=0;
  21.     XBYTE[0xc000]=dbuf[dc];
  22.     dbp=k;
  23.     if(delaycnt!=0)delaycnt--;
  24.     timcnt--;
  25.     if(timcnt==0)
  26.     {
  27.         sec++;
  28.         if(sec>59)
  29.         {
  30.             sec=0;min++;
  31.             if(min>59)
  32.             {
  33.                 hour++;min=0;
  34.                 if(hour>23)hour=0;
  35.             }
  36.         }
  37.         timcnt=4000;
  38.     }
  39. }
  40. void delay(unsigned int d)
  41. {
  42.     delaycnt=d;
  43.     while(delaycnt!=0);
  44. }
  45. char putchar(char c)
  46. {
  47.     unsigned char i;
  48.     char cc;
  49.     if(c==8){for(i=0;i<11;i++)dbuf[i]=dbuf[i+1];dbuf[11]=0;return c;}
  50.     if(c<' '){for(i=0;i<12;i++)dbuf[i]=0;return c;}
  51.     cc=asctb[c-0x20];
  52.     if(cc==8&&(dbuf[0]&8)==0)
  53.     {
  54.         dbuf[0]|=8;
  55.     }
  56.     else
  57.     {
  58.         for(i=11;i>0;i--)dbuf[i]=dbuf[i-1];
  59.         dbuf[0]=cc;
  60.     }
  61.     return c;
  62. }
  63. char _getkey(void)
  64. {
  65.     unsigned char kx,ky,c;
  66.     P3=0xc3;
  67.     P1=0xff;
  68.     while((P1&0x7F)!=0x7f);
  69.     delay(250);
  70.     while(1)
  71.     {
  72.         P3=0xc3;
  73.         P1=0xff;
  74.         delay(10);
  75.         while((kx=P1&0x7f)==0x7f);
  76.         P3=0xff;
  77.         P1=0x80;
  78.         delay(10);
  79.         if((ky=P3&0x3c)==0x3c)continue;
  80.         P3=0xc3;
  81.         P1=0xff;
  82.         delay(10);
  83.         if(kx!=P1&0x7f)continue;
  84.         P3=0xff;
  85.         P1=0x80;
  86.         delay(10);
  87.         if(ky!=P3&0x3c)continue;
  88.         break;
  89.     }
  90.     c=0;
  91.     while((kx&1)!=0){kx>>=1;c++;}
  92.     c<<=2;
  93.     ky>>=2;
  94.     while((ky&1)!=0){ky>>=1;c++;}
  95.     return keytbl[c];

  96. }
  97. char timekey(void)
  98. {
  99.     unsigned char kx,ky,c;
  100.     P3=0xc3;
  101.     P1=0xff;
  102.     delay(20);
  103.     while((P1&0x7F)!=0x7f);
  104.     delay(250);
  105.     while(1)
  106.     {
  107.         P3=0xc3;
  108.         P1=0xff;
  109.         delay(10);
  110.         while((kx=P1&0x7f)==0x7f)
  111.         {
  112.           if(c!=sec)
  113.           {
  114.             c=sec;
  115.             dbuf[0]=asctb[sec%10+0x10];
  116.             dbuf[1]=asctb[sec/10+0x10];
  117.             dbuf[2]=asctb['-'-0x20];
  118.             dbuf[3]=asctb[min%10+0x10];
  119.             dbuf[4]=asctb[min/10+0x10];
  120.             dbuf[5]=asctb['-'-0x20];
  121.             dbuf[6]=asctb[hour%10+0x10];
  122.             dbuf[7]=asctb[hour/10+0x10];
  123.           }
  124.         }
  125.         P3=0xff;
  126.         P1=0x80;
  127.         delay(10);
  128.         if((ky=P3&0x3c)==0x3c)continue;
  129.         P3=0xc3;
  130.         P1=0xff;
  131.         delay(10);
  132.         if(kx!=P1&0x7f)continue;
  133.         P3=0xff;
  134.         P1=0x80;
  135.         delay(10);
  136.         if(ky!=P3&0x3c)continue;
  137.         break;
  138.     }
  139.     c=0;
  140.     while((kx&1)!=0){kx>>=1;c++;}
  141.     c<<=2;
  142.     ky>>=2;
  143.     while((ky&1)!=0){ky>>=1;c++;}
  144.     return keytbl[c];

  145. }
复制代码
     
发表于 2007-5-22 23:34:14 | 显示全部楼层
thanks!!!!!!
     
 楼主| 发表于 2007-5-26 23:10:27 | 显示全部楼层
非常感谢翌阳兄提供的程序,但是我看不懂C语言,所以不能通过分析程序来画出电路图,只是把翌阳兄帖出来的程序直接进行了编译,得到的HEX文件竟大到12.8K,用编程器打开后提示出错,所以在次请教翌阳兄,这个电路是否有外部ROM程序存贮器,显示接口是否用到了74164等转换芯片,希望得到电路图。

[ 本帖最后由 nnn2688 于 2007-5-26 23:11 编辑 ]
calc2.jpg
     
发表于 2007-5-27 00:23:37 | 显示全部楼层
这个程序的外部电路已经忘记了.
还有,编译后不可能这么大啊.程序没有多少.BIN文件才4.56K,好在那个BIN的文件还在.HEX应该是与之对应的.
对了,这个是用C51编译的,Franklin 的C51.
外部电路记得好象是有锁存器和其它的什么电路.其实没有别的,就是在显示和键盘部分程序改一下,如果内存比较小,可以把编码表减小点,只用0-9的就成了.没用的代码可以去掉一些.
还有,不会C语言基本上弄不好吧,DIY出来也没有意思,程序也要DIY的啊.
学一学C吧,很简单的.
     
 楼主| 发表于 2007-5-27 14:11:28 | 显示全部楼层
现在汇编语言还没弄明白呢,学习C语言感觉有些吃力了,并且工作比较忙,精力有限啊~~~
     
发表于 2007-5-27 16:00:12 | 显示全部楼层
C比汇编好学多了......
     
发表于 2007-5-27 16:08:43 | 显示全部楼层
楼主加油..

您用的什么编译的?Uv2吗?
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 14:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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