找回密码
 立即注册

QQ登录

只需一步,快速开始

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

把共阴极数码管更改为共阳极数码管后,单片机程序里该怎么修改呢?

  [复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char

  3. uchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k;
  4. uchar jia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling;
  5. uchar s0,s1,s2,s3,s4,s5;          //参加运算的各个位
  6. unsigned long qian,hou;           //定义参于运算的第一个数和第二个数(前和后)。

  7. sbit beep=P2^3;                   //定义蜂鸣器管脚

  8. sbit cp1 = P2^6;                  //定义管脚
  9. sbit cp2 = P2^7;

  10. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  11.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};         //阴极编码
  12. uchar table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  13. uchar wei0=0,wei1=1,wei2=2,wei3=3,wei4=4,wei5=5,wei6=6,wei7=7;
  14. void delay(uchar i)
  15. {
  16.         for(j=i;j>0;j--)
  17.         for(k=125;k>0;k--);
  18. }



  19. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  20. {   
  21.    P0=table[a], cp1=1; delay(1), cp1=0;     
  22.          P0=~0x01, cp2=1, delay(1), cp2=0;   
  23.          P0=0xff, cp2=1, delay(1), cp2=0;   

  24.    P0=table[b], cp1=1; delay(1), cp1=0;     
  25.          P0=~0x02, cp2=1, delay(1), cp2=0;   
  26.          P0=0xff, cp2=1, delay(1), cp2=0;  

  27.    P0=table[c], cp1=1; delay(1), cp1=0;     
  28.          P0=~0x04, cp2=1, delay(1), cp2=0;   
  29.          P0=0xff, cp2=1, delay(1), cp2=0;   

  30.    P0=table[d], cp1=1; delay(1), cp1=0;     
  31.          P0=~0x08, cp2=1, delay(1), cp2=0;   
  32.          P0=0xff, cp2=1, delay(1), cp2=0;
  33.          
  34.    P0=table[e], cp1=1; delay(1), cp1=0;     
  35.          P0=~0x10, cp2=1, delay(1), cp2=0;   
  36.          P0=0xff, cp2=1, delay(1), cp2=0;   

  37.    P0=table[f], cp1=1; delay(1), cp1=0;     
  38.          P0=~0x20, cp2=1, delay(1), cp2=0;   
  39.          P0= 0xff, cp2=1, delay(1), cp2=0;


  40. }

  41. void keyscan()
  42. {
  43.     P3=0xfe;      //扫描第一行
  44.     temp=P3;
  45.     temp=temp&0xf0;
  46.     if(temp!=0xf0)
  47.     {
  48.       delay(10);
  49.       if(temp!=0xf0)
  50.       {        
  51.         temp=P3;
  52.         switch(temp)
  53.         {
  54.           case 0xee:
  55.                key=0;
  56.                                  wei++;
  57.                break;

  58.           case 0xde:
  59.                key=1;
  60.                                  wei++;
  61.                break;

  62.           case 0xbe:
  63.                key=2;
  64.                                  wei++;
  65.                break;

  66.           case 0x7e:
  67.                key=3;
  68.                                  wei++;
  69.                break;
  70.          }
  71.         while(temp!=0xf0)
  72.         {
  73.            temp=P3;
  74.            temp=temp&0xf0;
  75.            beep=0;
  76.          }
  77.          beep=1;
  78.       }
  79.     }
  80.                
  81.     P3=0xfd;   //扫描第二行
  82.     temp=P3;
  83.     temp=temp&0xf0;
  84.     if(temp!=0xf0)
  85.     {
  86.       delay(10);
  87.       if(temp!=0xf0)
  88.       {
  89.         temp=P3;
  90.         switch(temp)
  91.         {
  92.           case 0xed:
  93.                key=4;
  94.                                  wei++;
  95.                break;

  96.           case 0xdd:
  97.                key=5;
  98.                                  wei++;
  99.                break;

  100.           case 0xbd:
  101.                key=6;
  102.                                  wei++;
  103.                break;

  104.           case 0x7d:
  105.                key=7;
  106.                                  wei++;
  107.                break;
  108.          }
  109.          while(temp!=0xf0)
  110.          {
  111.            temp=P3;
  112.            temp=temp&0xf0;
  113.            beep=0;
  114.          }
  115.          beep=1;
  116.       }
  117.     }
  118.                
  119.     P3=0xfb;  //扫描第三行
  120.     temp=P3;
  121.     temp=temp&0xf0;
  122.     if(temp!=0xf0)
  123.     {
  124.       delay(10);
  125.       if(temp!=0xf0)
  126.       {
  127.         temp=P3;
  128.         switch(temp)
  129.         {
  130.           case 0xeb:
  131.                key=8;
  132.                                  wei++;
  133.                break;

  134.           case 0xdb:
  135.                key=9;
  136.                                  wei++;
  137.                break;
  138.                            
  139.           case 0xbb:
  140.                qingling=1;
  141.                break;

  142.           case 0x7b:
  143.                dengyu=1;
  144.                break;
  145.          }
  146.          while(temp!=0xf0)
  147.          {
  148.            temp=P3;
  149.            temp=temp&0xf0;
  150.            beep=0;
  151.          }
  152.          beep=1;
  153.       }
  154.       }
  155.                
  156.           P3=0xf7;   //扫描第四行
  157.     temp=P3;
  158.     temp=temp&0xf0;
  159.     if(temp!=0xf0)
  160.     {
  161.       delay(10);
  162.       if(temp!=0xf0)
  163.       {
  164.         temp=P3;
  165.         switch(temp)
  166.         {
  167.           case 0xe7:jia=1; break;
  168.                                 
  169.           case 0xd7:jian=1;break;

  170.           case 0xb7:cheng=1;break;

  171.           case 0x77:chu=1;break;

  172.         }
  173.         while(temp!=0xf0)
  174.         {
  175.            temp=P3;
  176.            temp=temp&0xf0;
  177.            beep=0;
  178.         }
  179.         beep=1;
  180.       }
  181.     }
  182. }

  183. void display0()
  184. {
  185.                 if(key!=20)
  186.                 {
  187.                           if(wei>3)wei=3;  //超出位数限制
  188.                                 switch(wei)
  189.                                 {
  190.                                         case 1:
  191.                                                         a0=key;
  192.                                                         b0=16;
  193.                                                         c0=16;
  194.                                                         d0=16;
  195.                                                         e0=16;
  196.                                                         f0=16;
  197.                                                         break;
  198.                                         case 2:
  199.                                                         b0=key;
  200.                                                         c0=16;
  201.                                                         d0=16;
  202.                                                         e0=16;
  203.                                                         f0=16;
  204.                                                         break;
  205.                                         case 3:
  206.                                                         c0=key;
  207.                                                         d0=16;
  208.                                                         e0=16;
  209.                                                         f0=16;
  210.                                                         break;
  211.                                         case 4:
  212.                                                         d0=key;
  213.                                                         e0=16;
  214.                                                         f0=16;
  215.                                                         break;
  216.                                         case 5:
  217.                                                         e0=key;
  218.                                                         f0=16;
  219.                                                         break;
  220.                                         case 6:
  221.                                                         f0=key;
  222.                                                         break;
  223.                         }
  224.                   key=20;
  225.                 }

  226.         if(a0!=16) s5=a0;    //保存第1次按下的数
  227.         if(b0!=16) s4=b0;
  228.         if(c0!=16) s3=c0;
  229.         if(d0!=16) s2=d0;
  230.         if(e0!=16) s1=e0;
  231.         if(f0!=16) s0=f0;    //保存第6次按下的数
  232.         display(a0,b0,c0,d0,e0,f0);                //显示按下的数
  233. }


  234. void main()
  235. {        
  236.           uchar gongneng;
  237.           while(1)
  238.           {
  239.                   keyscan();
  240.                   gongneng=jia|jian|cheng|chu|dengyu|qingling;
  241.                         
  242.                   if(gongneng==0)          //等待数字键
  243.                   {
  244.                           display0();        
  245.                   }
  246.                   else
  247.                   {         
  248.                           if(jia|jian|cheng|chu) //按下功能键
  249.                           {        
  250.                                         a0=16;
  251.                                         b0=16;
  252.                                         c0=16;
  253.                                         d0=16;
  254.                                         e0=16;
  255.                                         f0=16;
  256.                                        
  257.                                         if(jia)
  258.                                         {
  259.                                                 jia=0;jia0=1;jian0=0;cheng0=0;chu0=0;
  260.                                         }
  261.                                         if(jian)
  262.                                         {
  263.                                                 jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;
  264.                                         }
  265.                                         if(cheng)
  266.                                         {
  267.                                                  cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;
  268.                                         }
  269.                                         if(chu)
  270.                                         {
  271.                                                  chu=0;        jia0=0;jian0=0;cheng0=0;chu0=1;
  272.                                         }
  273.                                         switch(wei)
  274.                                         {
  275.                                                 case 1:qian=s5;break;
  276.                                                 case 2:qian=s5*10+s4;break;
  277.                                                 case 3:qian=s5*100+s4*10+s3;break;
  278.                                                 case 4:qian=s5*1000+s4*100+s3*10+s2;break;
  279.                                                 case 5:qian=s5*10000+s4*1000+s3*100+s2*10+s1;break;
  280.                                                 case 6:qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;        
  281.                                         }
  282.                                         wei=0;
  283.                                         s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  284.                                         display(a0,b0,c0,d0,e0,f0);
  285.                         }
  286.                         if(dengyu)
  287.                         {
  288.                                  dengyu=0;
  289.                                  switch(wei)
  290.                                  {
  291.                                         case 6:
  292.                                         hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
  293.                                         case 5:
  294.                                         hou=s5*10000+s4*1000+s3*100+s2*10+s1;break;
  295.                                         case 4:
  296.                                         hou=s5*1000+s4*100+s3*10+s2;break;
  297.                                         case 3:
  298.                                         hou=s5*100+s4*10+s3;break;
  299.                                         case 2:
  300.                                         hou=s5*10+s4;break;
  301.                                         case 1:
  302.                                         hou=s5;break;
  303.                                 }
  304.                                 wei=0;
  305.                                 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  306.                                 if(jia0)
  307.                                 {
  308.                                   jia0=0;        hou=qian+hou;
  309.                                 }
  310.                                 if(jian0)
  311.                                 {
  312.                                   jian0=0;        hou=qian-hou;
  313.                                 }
  314.                                 if(cheng0)
  315.                                 {
  316.                                   cheng0=0;        hou=qian*hou;
  317.                                 }
  318.                                 if(chu0)
  319.                                 {
  320.                                   chu0=0;        hou=qian/hou;
  321.                                 }
  322.                                 
  323.                                 if(hou>9801)    //超出范围后报警
  324.                                 {
  325.                                           beep=0;
  326.                                                 a0=16;b0=16;c0=16;d0=16;e0=16;f0=16;
  327.                                                 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  328.                                                 jia=0;jian=0;cheng=0;chu=0;
  329.                                                 jia0=0;jian0=0;cheng0=0;chu0=0;
  330.                                                 qingling=0;dengyu=0;
  331.                                                 qian=0;hou=0;
  332.                                                 display(a0,b0,c0,d0,e0,f0);
  333.                           }
  334.                                 else if(hou<10)
  335.                                 {
  336.                                          a0=hou;b0=16;c0=16;d0=16;e0=16;f0=16;
  337.                                 }
  338.                                 else
  339.                                 {
  340.                                          if(hou<100)a0=hou/10,b0=hou%10,c0=16,d0=16,e0=16,f0=16;
  341.                                         else
  342.                                         {
  343.                                                 if(hou<1000)a0=hou/100,b0=hou%100/10,c0=hou%10,d0=16,e0=16,f0=16;
  344.                                                 else
  345.                                                 {
  346.                                                         if(hou<10000)a0=hou/1000,b0=hou%1000/100,c0=hou%100/10,d0=hou%10,e0=16,f0=16;
  347.                                                         else
  348.                                                         {
  349.                                                                 if(hou<100000)a0=hou/10000,b0=hou%10000/1000,c0=hou%1000/100,d0=hou%100/10,e0=hou%10,f0=16;
  350.                                                                 else
  351.                                                                 {
  352.                                                                         if(hou<1000000)a0=hou/100000,b0=hou%100000/10000,c0=hou%10000/1000,d0=hou%1000/100,e0=hou%100/10,f0=hou%10;
  353.                                 
  354.                                                                 }
  355.                                                         }
  356.                                                 }
  357.                                         }
  358.                                  }
  359.                                  display(a0,b0,c0,d0,e0,f0);
  360.                         }
  361.                         if(qingling)
  362.                         {
  363.                                 beep=1;
  364.                                 a0=16;b0=16;c0=16;d0=16;e0=16;f0=16;
  365.                                 s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
  366.                                 jia=0;jian=0;cheng=0;chu=0;
  367.                                 jia0=0;jian0=0;cheng0=0;chu0=0;
  368.                                 qingling=0;dengyu=0;
  369.                                 qian=0;hou=0;
  370.                                 display(a0,b0,c0,d0,e0,f0);
  371.                         }
  372.                 }
  373.         }
  374. }
复制代码


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

使用道具 举报

沙发
ID:1055754 发表于 2022-12-5 13:27 | 只看该作者
  • uchar table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};这个语句在程序里是干什么的
回复

使用道具 举报

板凳
ID:332444 发表于 2022-12-6 15:41 | 只看该作者
数码管段值取反即可 P0=table[a],改为 P0=~table[a],
回复

使用道具 举报

地板
ID:332444 发表于 2022-12-6 15:42 | 只看该作者
zyeyz 发表于 2022-12-5 13:27
  • uchar table1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};这个语句在程序里是干什么的

  • 这是位值
    回复

    使用道具 举报

    5#
    ID:1056057 发表于 2022-12-6 16:31 | 只看该作者
    把共阴极的值换成共阳极就行了
    回复

    使用道具 举报

    6#
    ID:69038 发表于 2022-12-6 17:08 | 只看该作者
    P0=~table[X]
    P3=~table1[x]
    即在所有的table、table1前加个“~”。

    评分

    参与人数 1黑币 +20 收起 理由
    admin + 20 回帖助人的奖励!

    查看全部评分

    回复

    使用道具 举报

    7#
    ID:161164 发表于 2022-12-6 18:02 | 只看该作者
    display函数内P0=的后面,
    没有波浪加波浪(~)
    有波浪不要波浪
    回复

    使用道具 举报

    8#
    ID:883242 发表于 2022-12-6 18:31 | 只看该作者
    xianfajushi 发表于 2022-12-6 15:41
    数码管段值取反即可 P0=table[a],改为 P0=~table[a],

    这个做法不合理,会增加单片机运算量。应该在table定义位置,每个初值前面加~,这样取反操作是编译器完成的,不会让单片机去操作取反。
    回复

    使用道具 举报

    9#
    ID:1034262 发表于 2022-12-6 21:55 | 只看该作者
    输出段和位都取反一下就OK。
    回复

    使用道具 举报

    10#
    ID:123289 发表于 2022-12-7 17:02 | 只看该作者
    送出的显示数据求反一下,然后再送出。
    回复

    使用道具 举报

    11#
    ID:1056324 发表于 2022-12-7 20:40 | 只看该作者
    uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};         //阴极编码
    回复

    使用道具 举报

    12#
    ID:1056324 发表于 2022-12-7 20:41 | 只看该作者
    把这个换成共阳极的值就好
    回复

    使用道具 举报

    13#
    ID:77589 发表于 2022-12-8 14:36 | 只看该作者
    所有控制输出全部按位取反就好了!!!!
    回复

    使用道具 举报

    14#
    ID:1016428 发表于 2022-12-9 11:05 | 只看该作者
    在display函数里的table前都加一个~
    回复

    使用道具 举报

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

    本版积分规则

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

    Powered by 单片机教程网

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