找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易单片机计算器程序 LED数码管的显示出错

[复制链接]
跳转到指定楼层
楼主
我在个简易的计算器,想要能够实现加减乘除、清零。用到AT89C51,8255A,74LS373,6位LED数码管,不知为什么LED总是显示同一个数字而且只显示一位,哪位大佬可以救救我吗?能帮我看看是哪里出错了吗?

计算器.JPG (149.53 KB, 下载次数: 81)

完整电路图

完整电路图

计算器.zip

32.78 KB, 下载次数: 8

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

使用道具 举报

沙发
ID:789121 发表于 2020-7-13 15:39 | 只看该作者
没有程序,只能猜测数码管位选有问题。看你这图是用汇编写的么?如果不是,可以尝试用P2口控制8255
回复

使用道具 举报

板凳
ID:802095 发表于 2020-7-14 11:49 | 只看该作者
不要黑 发表于 2020-7-13 15:39
没有程序,只能猜测数码管位选有问题。看你这图是用汇编写的么?如果不是,可以尝试用P2口控制8255

程序放在了压缩包里,我是用c语言写的,要求是要使用8255,但我可能还是不太会用,我把代码贴在下面了,求大佬相助~


  1. #include <stdio.h>
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include <math.h>
  5. #include <ctype.h>
  6. #include <absacc.h>

  7. #define PA PBYTE[0X00]
  8. #define PB PBYTE[0X20]
  9. #define Cont PBYTE[0X60]
  10. #define E 1000000
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define Lint unsigned long int

  14. uchar operand1[7], operand2[7];  /*   操作数   */
  15. uchar operator;                                         /*   操作符   */
  16.   
  17. Lint number(uchar*  );//将字符串化为整数
  18. uchar keyscan(); //键盘扫描
  19. void buf(Lint value); //更新显示缓存
  20. void disp(void);//显示
  21. void delay(uint);//延时
  22. Lint compute(Lint va1,Lint va2,uchar opera);//运算

  23. uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};

  24. uchar dbuf[6] = {16,16,16,16,16,16};                    /*   显示缓存   */

  25. /*   延时函数   */               
  26. void delay(uint z)
  27. {
  28. uint x,y;
  29. for(x=z;x>0;x--)
  30.         for(y=110;y>0;y--);
  31. }
  32. /*******************************************
  33.               键盘扫描程序
  34.        将按键转化为字符并作为输出
  35.     ','#'分别表示清零键和没有键按下
  36. *******************************************/

  37. uchar keyscan()
  38. {
  39.         uchar key;/*   按键值标记变量    */
  40.        
  41.         P1=0xfe;  //扫描键盘第1行   
  42.         while((P1 & 0xf0) != 0xf0)                     /*      有按键按下     */
  43.         {
  44.                 delay(3);                                                /*      去抖动延时     */
  45.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次确认     */
  46.                 {
  47.                         switch(P1)
  48.                         {
  49.                                 case 0xee: key='7';break;
  50.                                 case 0xde: key='8';break;
  51.                                 case 0xbe: key='9';break;
  52.                                 case 0x7e: key='/';break;
  53.                                 default: key='#';
  54.                         }
  55.                         while((P1&0xf0)!=0xf0);
  56.                 }
  57.         }
  58.        
  59.         P1=0xfd;  //扫描键盘第2行   
  60.         while((P1 & 0xf0) != 0xf0)                     /*      有按键按下     */
  61.         {
  62.                 delay(3);                                                /*      去抖动延时     */
  63.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次确认     */
  64.                 {
  65.                         switch(P1)
  66.                         {
  67.                                 case 0xed: key='4';break;
  68.                                 case 0xdd: key='5';break;
  69.                                 case 0xbd: key='6';break;
  70.                                 case 0x7d: key='*';break;
  71.                                 default: key='#';
  72.                         }
  73.                         while((P1&0xf0)!=0xf0);
  74.                 }
  75.         }
  76.        
  77.         P1=0xfb;  //扫描键盘第3行   
  78.         while((P1 & 0xf0) != 0xf0)                     /*      有按键按下     */
  79.         {
  80.                 delay(3);                                                /*      去抖动延时     */
  81.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次确认     */
  82.                 {
  83.                         switch(P1)
  84.                         {
  85.                                 case 0xeb: key='1';break;
  86.                                 case 0xdb: key='2';break;
  87.                                 case 0xbb: key='3';break;
  88.                                 case 0x7b: key='-';break;
  89.                                 default: key='#';
  90.                         }
  91.                         while((P1&0xf0)!=0xf0);
  92.                 }
  93.         }
  94.        
  95.         P1=0xf7;  //扫描键盘第4行   
  96.         while((P1 & 0xf0) != 0xf0)                     /*      有按键按下     */
  97.         {
  98.                 delay(3);                                                /*      去抖动延时     */
  99.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次确认     */
  100.                 {
  101.                         switch(P1)
  102.                         {
  103.                                 case 0xe7: key=';break;
  104.                                 case 0xd7: key='0';break;
  105.                                 case 0xb7: key='=';break;
  106.                                 case 0x77: key='+';break;
  107.                                 default: key='#';
  108.                         }
  109.                         while((P1&0xf0)!=0xf0);
  110.                 }
  111.         }
  112.        
  113.         return key;
  114.        
  115. }

  116. void main()
  117. {
  118.        
  119.         Lint value1, value2, result;                   /*    数值1,数值2,结果    */
  120.         uchar ckey, cut1 = 0, cut2 = 0;  /*    ckey键盘输入字符    */
  121.         uchar operator;                               /*         运算符         */
  122.         uchar i, bool = 0,  t=0 ;
  123.         Cont=0x81;
  124.         P1=0xff;

  125. init:
  126.     buf(0);//初始化
  127.         disp();
  128.         value1=value2=0 ;
  129.         result = 0;
  130.         cut1 = cut2 = 0;
  131.         bool = 0;                        /*操作数标识符*/         
  132.        
  133.         t = 0 ;                                 /*连续运算*/
  134.        
  135.         for(i = 0;i < 7;i++)
  136.         {
  137.                 operand1[i] = '\0';
  138.                 operand2[i] = '\0';
  139.         }                                  /*         初始化         */
  140.        
  141.         while(1)
  142.         {
  143.                 ckey=keyscan();//读键盘值
  144.                 if(ckey!='#')
  145.                 {
  146.                         if(isdigit(ckey))/*  isdigit函数,字符是阿拉伯数字返回非0值,否则返回0  */
  147.                         {
  148.                                 switch(bool)
  149.                                 {
  150.                                         case 0:
  151.                                                 if(cut1>5)
  152.                                                 {
  153.                                                         value1=E;buf(value1);disp();break;
  154.                                                 }
  155.                                                 operand1[cut1] = ckey;                       
  156.                                                 operand1[cut1+1] = '\0';
  157.                                                 value1 = number(operand1);  /*  将字符串转化为整数  */
  158.                                                 cut1++;       
  159.                                                 buf(value1);
  160.                                                 disp();
  161.                                                 break;
  162.                                         case 1:
  163.                                                 if(cut2 > 5)
  164.                                                 {
  165.                                                     value2 = E ; buf(value2); disp() ; break ;
  166.                                                 }
  167.                                                 t = 1 ;
  168.                                                 operand2[cut2] = ckey;
  169.                                                 operand2[cut2+1] = '\0';
  170.                                                 value2 = number(operand2);
  171.                                                 cut2++;
  172.                                                 buf(value2);
  173.                                                 disp();
  174.                                                 break;
  175.                                         default: break;
  176.                                 }
  177.                         }
  178.                         else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
  179.                         {
  180.                                 bool=1;
  181.                                 if(t==1) //判断是否为连续运算
  182.                                 {
  183.                                         value1=compute(value1,value2,operator);     /*  显示上一步运算结果  */
  184.                                         cut2 = 0 ;
  185.                                  }
  186.                                 buf(value1);
  187.                                 disp();
  188.                                 operator = ckey;
  189.                                 //s = 0 ;  
  190.                         }
  191.                         else if(ckey=='=') //计算结果
  192.                         {
  193.                                 result= compute(value1,value2,operator);
  194.                                 buf(result);
  195.                                 disp();
  196.                                 while(1)
  197.                                 {
  198.                                         ckey=keyscan();
  199.                                         if(ckey==')  //若按下清零键跳回开始
  200.                                            goto init;
  201.                                         else{
  202.                                                 buf(result);
  203.                                                 disp();
  204.                                         }                                         
  205.                                 }
  206.                         }
  207.                         else if(ckey==') //若按下清零键跳回开始
  208.                         {
  209.                                 goto init;
  210.                         }
  211.                  }
  212.                  disp();
  213.         }
  214. }

  215. /******************************************
  216.                  number函数
  217.                      将字符串转化为整数
  218. *******************************************/

  219. Lint number(uchar operand[] )
  220. {
  221.         Lint n=0, i, j ;
  222.         for(i=0 ; i<6 ; i++ )
  223.         {
  224.            if(operand[i]=='\0'){ break ; }
  225.            n=n*10 ;                                                                  
  226.            j=operand[i]-'0' ;                                           
  227.            n=n+j ;
  228.         }
  229.         return n ;
  230. }

  231. /******************************************
  232.                  运算函数

  233. 输入:操作数和操作符
  234. 输出:计算结果
  235. *******************************************/
  236. Lint compute(Lint va1,Lint va2,uchar opera)
  237. {
  238.         Lint result;
  239.         switch(opera)
  240.         {
  241.                 case '+':
  242.                         result=va1+va2;
  243.                         break;
  244.                 case '-':
  245.                         if(va1<va2){
  246.                                 result=E;
  247.                                 break;
  248.                         }
  249.                     else{
  250.                             result=va1-va2;
  251.                             break;
  252.                         }
  253.                 case '*':
  254.                         result=va1*va2;
  255.                         break;
  256.                 case '/':
  257.                         if(va2==0){
  258.                                 result=E;
  259.                                 break;
  260.                         }
  261.                         else{
  262.                                 result=va1/va2;
  263.                                 break;
  264.                         }
  265.                 default:
  266.                         result=E;
  267.                         break;
  268.         }
  269.         return result;
  270. }       

  271. /*******************************************
  272.               更新显示缓存

  273. 输入:无符号整数
  274. 输出:将输入送入显示缓存,溢出或出错显示E
  275. *******************************************/
  276. void buf(Lint value)
  277. {
  278.         uchar i;
  279.         if(value==0)
  280.         {
  281.                 dbuf[5]=0;
  282.                 i=4;
  283.         }
  284.         else if(value==E||value>99999)
  285.         {
  286.                 dbuf[5]=15;///////////////////////////////////////
  287.                 i=4;
  288.         }
  289.         else{
  290.                 for(i=5;value>0;i--){
  291.                         dbuf[i]=value%10;
  292.                         value/=10;
  293.                 }
  294.         }
  295.         for(i=i+1;i>0;i--){
  296.                 dbuf[i-1]=16;
  297.         }
  298. }

  299. /*******************************************
  300.                显示函数      
  301. *******************************************/
  302. void disp(void)
  303. {
  304.         uchar i,j;
  305.         i=0xfe;
  306.         for(j=0;j<6;j++)
  307.         {
  308.                 PB=i;
  309.                 PA=table[dbuf[j]];
  310.                 i=_crol_(i,1);
  311.                 delay(3);
  312.                 PA=0xff;
  313.         }

  314. }
复制代码
回复

使用道具 举报

地板
ID:332444 发表于 2020-7-14 14:29 | 只看该作者
回复

使用道具 举报

5#
ID:332444 发表于 2020-7-14 14:41 | 只看该作者
先行调试显示部分,认为设置从1位到6位的数。
回复

使用道具 举报

6#
ID:789121 发表于 2020-7-15 14:20 | 只看该作者
rjn 发表于 2020-7-14 11:49
程序放在了压缩包里,我是用c语言写的,要求是要使用8255,但我可能还是不太会用,我把代码贴在下面了, ...

之前没注意看,你的按键扫描电路是有问题的,不应该接地,具体你可以参考网上的图。
程序最后void dips()里面将i=_crol_(i,1);改成i=i<<1;是可以解决只显示一位的问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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