找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1145|回复: 9
收起左侧

想要加个数码管显示0-A档位,但单片机P1口只有6个引脚 怎么办?

[复制链接]
ID:980756 发表于 2021-11-20 18:32 来自手机 | 显示全部楼层 |阅读模式
求各位大佬指点一下,想要加个数码管显示0-A档位,但是单机片用的是STC15W408AS  16引脚的,P1口只有6个引脚,不知道怎么办
  1.          #include<reg52.h>   //代入头文件//

  2.          #include <intrins.h>  // 用空操作  _nop_   时要加这句//


  3.      #define ulong unsigned long //宏定义变量类型    0----4294967295/

  4.          #define uint unsigned int //宏定义变量类型    0----65535/

  5.          #define uchar unsigned char//        宏定义变量类型          0-255/

  6.          uchar jlu;  //几率-----------------=======

  7.    

  8.          uint t00,b00,t01,b01;  //X0输入滤波变量
  9.                                                   
  10.      uint t10,b10,t11,b11;  //X1输入滤波变量

  11.      uint t20,b20,t21,b21;  //X2输入滤波变量

  12.       uint b,k1,ks,b1,k2,ty,t3,b3,k3;  //标志量
  13.          
  14.       uint t0,t2;//长按加减键0.7秒也会变一档或停

  15.     uint lbcs=5;            //0--65535,输入滤波常数,可以为5到10毫秒,长按用300到700毫秒,一改全改。


  16. sfr P3M1=0xB1;  //A//

  17. sfr P3M0=0xB2;  //B//P3口特殊寄存器声明   sfr P3M1=0xb1; sfr P3M0=0xb2; B可用小写b吗?

  18.   //  P3M1=0x0;  //C//
  19.    // P3M0=0x4;  // D//   3.2脚为推挽输出,其他是准双向口,这两句放在主程序里
  20.                  //    如果全是准双向口,上面ABCD4句可以不要
  21.    
  22.                                //// 3个输入如下
  23.     sbit X0=P3^3;   //减速 D0   
  24.     sbit X1=P3^6;   //停(点焊)   D1   
  25.    sbit X2=P3^7; //加速    D2
  26.                      
  27.                  
  28.      

  29.       
  30.     sbit Y0=P3^2;      //1输出



  31. void  main( )//主程序
  32. {
  33.        TMOD=0x01; //  TMOD=0x11;//设置定时器0为工作方式1//  
  34.             TH0=(65536-1000)/256;  //12MHZ,1MS一次中断,商//
  35.             TL0=(65536-1000)%256;  //低四位装数=余数//
  36.                               
  37.         EA=1;       //开总中断//

  38.             ET0=1;      //开定时器0中断

  39.                 TR0=1;//启动定时器0//397//
  40.                                                              // X0=1;//把P3.3 复位脚 RST OUT-LOW 设置为高电平==========????????????????????????
  41.         Y0=0;//出0,停止

  42.     P3M1=0x0;// 高8位为0000 0000
  43.     P3M0=0x4;  //低8位为0000 0100   3.2脚为推挽输出,串联1K电阻到地,有4毫安电流。其他是准双向口串联1K电阻到地只有13微安 ( 写成 P3M1=0x00;  P3M0=0x40;不行,已经验证了)。




  44.   while(1)//大循环
  45. {

  46.                         jlu=0;//几率------

  47.                                 //以下是你的编程区=========================================                                
  48.                           
  49.                           


  50.                       //以下你不要编程=========================================

  51.                     while(jlu<1)          //几率-------
  52.                         
  53.                           {_nop_();  _nop_();         _nop_(); }
  54.                                     
  55.                                                 
  56.                 }

  57. }



  58.                                           

  59. void exter0() interrupt 1         //定时器0的中断程序//定时器1的中断程序 void exter1() interrupt 3//
  60. {           
  61.         TH0=(65536-1000)/256;         //重装数12MHz 1000=1ms,如果不重装,默认数是65536,不是想要的10000//
  62.         TL0=(65536-1000)%256;
  63.                
  64.                  
  65.              //X0滤波
  66.                 if(X0==0) {t00++;t01=0;}
  67.                 if(t00==lbcs){b00=1;b01=0; }        //b00=1,就是按下
  68.                 if(b00==1) t00=0;

  69.                 if(X0==1) {t01++;t00=0;}
  70.                 if(t01==lbcs){b01=1;b00=0; }  //b01=1,就是松手
  71.                 if(b01==1) t01=0;

  72.         //X1滤波
  73.                 if(X1==0) {t10++;t11=0;}
  74.                 if(t10==lbcs){b10=1;b11=0; }        //b10=1,就是按下
  75.                 if(b10==1) t10=0;

  76.                 if(X1==1) {t11++;t10=0;}
  77.                 if(t11==lbcs){b11=1;b10=0; }  //b11=1,就是松手
  78.                 if(b11==1) t11=0;   
  79.                  
  80.                
  81.                  //X2滤波
  82.                 if(X2==0) {t20++;t21=0;}
  83.                 if(t20==lbcs){b20=1;b21=0; }        //b20=1,就是按下
  84.                 if(b20==1) t20=0;

  85.                 if(X2==1) {t21++;t20=0;}
  86.                 if(t21==lbcs){b21=1;b20=0; }  //b21=1,就是松手
  87.                 if(b21==1) t21=0;  
  88.                
  89.         
  90.         

  91.         

  92.         //以下是你的编程区=======================================

  93.      if(b20==1){b=1;k1=0;}

  94.      if(b==1){   if(b21==1)
  95.                   {
  96.                     b=0;
  97.                     k1=1;


  98.                   }
  99.                
  100.               }

  101.       if(k1==1){  k1=0;
  102.   
  103.                   if(ks<10)ks++;
  104.                 }
  105.                                        //X2  P3.7加档,用加键改变ks值



  106. if(b00==1){b1=1;k2=0;}

  107.      if(b1==1){   if(b01==1)
  108.                   {
  109.                     b1=0;
  110.                     k2=1;


  111.                   }
  112.                
  113.               }

  114.       if(k2==1){  k2=0;
  115.   
  116.                   if(ks>0)ks--;
  117.                 }
  118.                                        //X0  P3.3减档,用减键改变ks值



  119.   

  120.        //到这,KS值会运随加减键在0--10范围变化,以下就根据k值做相应工作
  121.    


  122.         




  123.   
  124.                                                                        
  125. if(ks==1){                                             //1档开始  按下按键并松手,1秒后通电10ms,实际10-4ms行程=6ms焊接时间

  126.                       if(b10==1){b3=1;k3=0;}

  127.                      if(b3==1){   if(b11==1)
  128.                                 {
  129.                                   b3=0;
  130.                                   k3=1;
  131.                                  }
  132.                               }


  133.                       if(k3==1){  t3++;
  134.                              if(t3==1000)  Y0=1;   //延迟1秒
  135.                              if(t3==1010) {Y0=0;   //差值为10ms,10-4ms行程=6ms焊接时间
  136.                                            t3=0;
  137.                                            k3=0;
  138.                                            }   
  139.                                 }
  140.                   
  141.           }                 //1档      //X1  P3.6  停键  6ms        //1档结束                                            
  142.                                       


  143.                                  
  144.   if(ks==2){                                             //2档开始

  145.                       if(b10==1){b3=1;k3=0;}

  146.                      if(b3==1){   if(b11==1)
  147.                                 {
  148.                                   b3=0;
  149.                                   k3=1;
  150.                                  }
  151.                               }


  152.                       if(k3==1){  t3++;
  153.                              if(t3==1000)  Y0=1;   //延迟1秒
  154.                              if(t3==1011) {Y0=0;   //差值为11ms,11-4ms行程=7ms焊接时间
  155.                                            t3=0;
  156.                                            k3=0;
  157.                                            }   
  158.                                 }
  159.                   
  160.           }                 //2档      //X1  P3.6  停键  7ms        //2档结束   
  161.                                                 
  162.                                                                            
  163.                  
  164. if(ks==3){                                             //3档开始

  165.                       if(b10==1){b3=1;k3=0;}

  166.                      if(b3==1){   if(b11==1)
  167.                                 {
  168.                                   b3=0;
  169.                                   k3=1;
  170.                                  }
  171.                               }


  172.                       if(k3==1){  t3++;
  173.                              if(t3==1000)  Y0=1;   //延迟1秒
  174.                              if(t3==1012) {Y0=0;   //差值为12ms,12-4ms行程=8ms焊接时间
  175.                                            t3=0;
  176.                                            k3=0;
  177.                                            }   
  178.                                 }
  179.                   
  180.           }                 //3档      //X1  P3.6  停键  8ms        //3档结束                                                                              

  181.   
  182.                                  
  183. if(ks==4){                                             //4档开始

  184.                       if(b10==1){b3=1;k3=0;}

  185.                      if(b3==1){   if(b11==1)
  186.                                 {
  187.                                   b3=0;
  188.                                   k3=1;
  189.                                  }
  190.                               }


  191.                       if(k3==1){  t3++;
  192.                              if(t3==1000)  Y0=1;   //延迟1秒
  193.                              if(t3==1013) {Y0=0;   //差值为13ms,13-4ms行程=9ms焊接时间
  194.                                            t3=0;
  195.                                            k3=0;
  196.                                            }   
  197.                                 }
  198.                   
  199.           }                 //4档      //X1  P3.6  停键  8ms        //4档结束  



  200. if(ks==5){                                             //5档开始

  201.                       if(b10==1){b3=1;k3=0;}

  202.                      if(b3==1){   if(b11==1)
  203.                                 {
  204.                                   b3=0;
  205.                                   k3=1;
  206.                                  }
  207.                               }


  208.                       if(k3==1){  t3++;
  209.                              if(t3==1000)  Y0=1;   //延迟1秒
  210.                              if(t3==1014) {Y0=0;   //差值为14ms,14-4ms行程=10ms焊接时间
  211.                                            t3=0;
  212.                                            k3=0;
  213.                                            }   
  214.                                 }
  215.                   
  216.           }                 //5档      //X1  P3.6  停键  10ms        //5档结束  

  217.   
  218. if(ks==6){                                             //6档开始

  219.                       if(b10==1){b3=1;k3=0;}

  220.                      if(b3==1){   if(b11==1)
  221.                                 {
  222.                                   b3=0;
  223.                                   k3=1;
  224.                                  }
  225.                               }


  226.                       if(k3==1){  t3++;
  227.                              if(t3==1000)  Y0=1;   //延迟1秒
  228.                              if(t3==1015) {Y0=0;   //差值为15ms,15-4ms行程=11ms焊接时间
  229.                                            t3=0;
  230.                                            k3=0;
  231.                                            }   
  232.                                 }
  233.                   
  234.           }                 //6档      //X1  P3.6  停键  11ms        //6档结束         



  235. if(ks==7){                                             //7档开始

  236.                       if(b10==1){b3=1;k3=0;}

  237.                      if(b3==1){   if(b11==1)
  238.                                 {
  239.                                   b3=0;
  240.                                   k3=1;
  241.                                  }
  242.                               }


  243.                       if(k3==1){  t3++;
  244.                              if(t3==1000)  Y0=1;   //延迟1秒
  245.                              if(t3==1016) {Y0=0;   //差值为16ms,16-4ms行程=11ms焊接时间
  246.                                            t3=0;
  247.                                            k3=0;
  248.                                            }   
  249.                                 }
  250.                   
  251.           }                 //7档      //X1  P3.6  停键  11ms        //7档结束  

  252. if(ks==8){                                             //8档开始

  253.                       if(b10==1){b3=1;k3=0;}

  254.                      if(b3==1){   if(b11==1)
  255.                                 {
  256.                                   b3=0;
  257.                                   k3=1;
  258.                                  }
  259.                               }


  260.                       if(k3==1){  t3++;
  261.                              if(t3==1000)  Y0=1;   //延迟1秒
  262.                              if(t3==1017) {Y0=0;   //差值为17ms,17-4ms行程=13ms焊接时间
  263.                                            t3=0;
  264.                                            k3=0;
  265.                                            }   
  266.                                 }
  267.                   
  268.           }                 //8档      //X1  P3.6  停键  13ms        //8档结束  


  269. if(ks==9){                                             //9档开始

  270.                       if(b10==1){b3=1;k3=0;}

  271.                      if(b3==1){   if(b11==1)
  272.                                 {
  273.                                   b3=0;
  274.                                   k3=1;
  275.                                  }
  276.                               }


  277.                       if(k3==1){  t3++;
  278.                              if(t3==1000)  Y0=1;   //延迟1秒
  279.                              if(t3==1018) {Y0=0;   //差值为18ms,18-4ms行程=14ms焊接时间
  280.                                            t3=0;
  281.                                            k3=0;
  282.                                            }   
  283.                                 }
  284.                   
  285.           }                 //9档      //X1  P3.6  停键  14ms        //9档结束


  286. if(ks==10){                                             //10档开始

  287.                       if(b10==1){b3=1;k3=0;}

  288.                      if(b3==1){   if(b11==1)
  289.                                 {
  290.                                   b3=0;
  291.                                   k3=1;
  292.                                  }
  293.                               }


  294.                       if(k3==1){  t3++;
  295.                              if(t3==1000)  Y0=1;   //延迟1秒
  296.                              if(t3==1019) {Y0=0;   //差值为19ms,19-4ms行程=15ms焊接时间
  297.                                            t3=0;
  298.                                            k3=0;
  299.                                            }   
  300.                                 }
  301.                   
  302.           }                 //10档      //X1  P3.6  停键  15ms        //10档结束  


  303.    //以下你不要编程=========================================

  304.             jlu=1;//几率---------
复制代码
回复

使用道具 举报

ID:332444 发表于 2021-11-20 19:35 | 显示全部楼层
可外接74HC595
回复

使用道具 举报

ID:235200 发表于 2021-11-20 22:03 | 显示全部楼层
加一个74HC595或者MAX7219进行扩展就可以了
回复

使用道具 举报

ID:624769 发表于 2021-11-21 00:34 | 显示全部楼层
我一般是把  P10~P15 加上 P36~P37
然后:
          P3 &= 0x0f;
          P3 |= (0xf0 & LED_Buf);
          P1 = LED_Buf;

偶尔也会  P10~P15 加上 P5
然后: P1 = LED_Buf;
           P5 = (LED_Buf >>2);

看你喜欢了。
回复

使用道具 举报

ID:213173 发表于 2021-11-21 08:38 | 显示全部楼层
STC15W408AS-16DIP的引脚在不增加扩展芯片完全能够满足楼主的这款应用。P1.0~P1.5、P3.6、P3.7用作数码管段驱动,方便编程。P5.4、P5.5用作数码管2位驱动,预置输出增减量可以在1~99设置,并保存在EEPROM中,掉电不会丢失。按键放在P3.0~P3.2,不会影响在线下载更新用户程序,P3.3输出。
段码驱动示例:
void Px(unsigned char i)//i=段码
{
        P1&=0xc0;                //P1低6位清0
        P1|=(i&0x3F);        //P1低6位赋值
        P3&=0x3f;                //P3高2位清0,其它位不变
        P3|=(i&0xc0);        //P3高2位赋值,其它位不变
}
回复

使用道具 举报

ID:980756 发表于 2021-11-21 23:31 来自手机 | 显示全部楼层
xianfajushi 发表于 2021-11-20 19:35
可外接74HC595

谢谢指点
回复

使用道具 举报

ID:980756 发表于 2021-11-21 23:32 来自手机 | 显示全部楼层
csmyldl 发表于 2021-11-20 22:03
加一个74HC595或者MAX7219进行扩展就可以了

谢谢指点
回复

使用道具 举报

ID:980756 发表于 2021-11-21 23:32 来自手机 | 显示全部楼层
188610329 发表于 2021-11-21 00:34
我一般是把  P10~P15 加上 P36~P37
然后:
          P3 &= 0x0f;

谢谢指点
回复

使用道具 举报

ID:980756 发表于 2021-11-21 23:35 来自手机 | 显示全部楼层
wulin 发表于 2021-11-21 08:38
STC15W408AS-16DIP的引脚在不增加扩展芯片完全能够满足楼主的这款应用。P1.0~P1.5、P3.6、P3.7用作数码管段 ...

多谢大佬指点,本人是在太菜了,一位数码管都不知道怎么写,两位数码管完全不懂,能求大佬给改改程序嘛
回复

使用道具 举报

ID:980756 发表于 2021-11-26 18:15 来自手机 | 显示全部楼层
我们159 发表于 2021-11-21 23:35
多谢大佬指点,本人是在太菜了,一位数码管都不知道怎么写,两位数码管完全不懂,能求大佬给改改程序嘛

已经改好了,明白了就特别简单,就加了几行代码数码管就可以显示档位了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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