久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

簡易單片機(jī)計(jì)算器程序 LED數(shù)碼管的顯示出錯(cuò)

查看數(shù): 2709 | 評(píng)論數(shù): 5 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
rjn
發(fā)布時(shí)間: 2020-7-13 12:57

正文摘要:

我在個(gè)簡易的計(jì)算器,想要能夠?qū)崿F(xiàn)加減乘除、清零。用到AT89C51,8255A,74LS373,6位LED數(shù)碼管,不知為什么LED總是顯示同一個(gè)數(shù)字而且只顯示一位,哪位大佬可以救救我嗎?能幫我看看是哪里出錯(cuò)了嗎?

回復(fù)

ID:789121 發(fā)表于 2020-7-15 14:20
rjn 發(fā)表于 2020-7-14 11:49
程序放在了壓縮包里,我是用c語言寫的,要求是要使用8255,但我可能還是不太會(huì)用,我把代碼貼在下面了, ...

之前沒注意看,你的按鍵掃描電路是有問題的,不應(yīng)該接地,具體你可以參考網(wǎng)上的圖。
程序最后void dips()里面將i=_crol_(i,1);改成i=i<<1;是可以解決只顯示一位的問題
ID:332444 發(fā)表于 2020-7-14 14:41
先行調(diào)試顯示部分,認(rèn)為設(shè)置從1位到6位的數(shù)。
ID:332444 發(fā)表于 2020-7-14 14:29
ID:802095 發(fā)表于 2020-7-14 11:49
不要黑 發(fā)表于 2020-7-13 15:39
沒有程序,只能猜測數(shù)碼管位選有問題。看你這圖是用匯編寫的么?如果不是,可以嘗試用P2口控制8255

程序放在了壓縮包里,我是用c語言寫的,要求是要使用8255,但我可能還是不太會(huì)用,我把代碼貼在下面了,求大佬相助~


  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];  /*   操作數(shù)   */
  15. uchar operator;                                         /*   操作符   */
  16.   
  17. Lint number(uchar*  );//將字符串化為整數(shù)
  18. uchar keyscan(); //鍵盤掃描
  19. void buf(Lint value); //更新顯示緩存
  20. void disp(void);//顯示
  21. void delay(uint);//延時(shí)
  22. Lint compute(Lint va1,Lint va2,uchar opera);//運(yùn)算

  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. /*   延時(shí)函數(shù)   */               
  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.        將按鍵轉(zhuǎn)化為字符并作為輸出
  35.     ','#'分別表示清零鍵和沒有鍵按下
  36. *******************************************/

  37. uchar keyscan()
  38. {
  39.         uchar key;/*   按鍵值標(biāo)記變量    */
  40.        
  41.         P1=0xfe;  //掃描鍵盤第1行   
  42.         while((P1 & 0xf0) != 0xf0)                     /*      有按鍵按下     */
  43.         {
  44.                 delay(3);                                                /*      去抖動(dòng)延時(shí)     */
  45.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次確認(rèn)     */
  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);                                                /*      去抖動(dòng)延時(shí)     */
  63.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次確認(rèn)     */
  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);                                                /*      去抖動(dòng)延時(shí)     */
  81.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次確認(rèn)     */
  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);                                                /*      去抖動(dòng)延時(shí)     */
  99.                 while((P1 & 0xf0) != 0xf0)                                   /*      再次確認(rèn)     */
  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;                   /*    數(shù)值1,數(shù)值2,結(jié)果    */
  120.         uchar ckey, cut1 = 0, cut2 = 0;  /*    ckey鍵盤輸入字符    */
  121.         uchar operator;                               /*         運(yùn)算符         */
  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;                        /*操作數(shù)標(biāo)識(shí)符*/         
  132.        
  133.         t = 0 ;                                 /*連續(xù)運(yùn)算*/
  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函數(shù),字符是阿拉伯?dāng)?shù)字返回非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);  /*  將字符串轉(zhuǎn)化為整數(shù)  */
  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) //判斷是否為連續(xù)運(yùn)算
  182.                                 {
  183.                                         value1=compute(value1,value2,operator);     /*  顯示上一步運(yùn)算結(jié)果  */
  184.                                         cut2 = 0 ;
  185.                                  }
  186.                                 buf(value1);
  187.                                 disp();
  188.                                 operator = ckey;
  189.                                 //s = 0 ;  
  190.                         }
  191.                         else if(ckey=='=') //計(jì)算結(jié)果
  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函數(shù)
  217.                      將字符串轉(zhuǎn)化為整數(shù)
  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.                  運(yùn)算函數(shù)

  233. 輸入:操作數(shù)和操作符
  234. 輸出:計(jì)算結(jié)果
  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. 輸入:無符號(hào)整數(shù)
  274. 輸出:將輸入送入顯示緩存,溢出或出錯(cuò)顯示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.                顯示函數(shù)      
  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. }
復(fù)制代碼
ID:789121 發(fā)表于 2020-7-13 15:39
沒有程序,只能猜測數(shù)碼管位選有問題。看你這圖是用匯編寫的么?如果不是,可以嘗試用P2口控制8255

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费av一区 | 午夜黄色影院 | 国产激情一区二区三区 | 激情亚洲| 国产精品网址 | 亚洲综合区| 国产一区二区三区色淫影院 | 亚洲一区欧美一区 | 黄网站在线播放 | 一区二区三区精品视频 | 人人性人人性碰国产 | 日韩一二区 | 一区二区三区四区电影视频在线观看 | 超碰免费在线 | 国产视频精品区 | 国产一区二区三区四区五区加勒比 | 国产精品久久二区 | 日本精品视频在线观看 | 国产精品久久在线观看 | 国产成人一区 | 日韩视频一区在线观看 | 国产伦精品一区二区三区精品视频 | 亚洲高清视频在线 | 欧美一级免费片 | 亚洲国产精品一区二区第一页 | 黄色av观看| 在线观看视频一区 | 免费国产黄网站在线观看视频 | 一区二区成人 | 在线免费观看日本视频 | 欧美日韩高清在线观看 | 黄网站涩免费蜜桃网站 | 涩涩鲁亚洲精品一区二区 | 免费精品一区 | 久久国产精品网站 | 亚洲一区 | 亚洲中午字幕 | 曰批视频在线观看 | 亚洲国产精品视频一区 | 国产精品久久精品 | 日韩免费一级 |