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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1599|回復: 2
打印 上一主題 下一主題
收起左側

單片機EC11編碼器數碼管菜單程序算法問題

[復制鏈接]
跳轉到指定樓層
樓主
小弟初學單片機,正在寫一個EC11數碼管菜單的程序,遇到問題搞不定,特來發帖請教。

實現功能:EC11數碼管菜單的子功能,上電后左右旋轉增減數值。按鈕長按三秒后,個位閃動,進入調整狀態。旋轉按鈕,數值加減1,可自動進位;短按一次,十位閃動,數值加減10,逢100自動進位;再短按一次,百位閃動,數值加減100。

加值時候正常,問題出在對百位減值的時候。假如現在值是134,百位閃動。這時旋鈕左轉一格,百位應該變成0,同時改成十位閃動;若旋鈕再左旋3格,十位變成0,同時改成個位閃動。在十位或個位閃動的時候,短按按鈕,閃動的位數應該自由升位,但是現在不行。

(就是說在百位變成0時,閃動標記n應該由1變成2,但是只變一次就行了,不要再被while循環掃描。現在是一直被while掃描,導致短按按鈕時數值2降不下來)我這塊代碼肯定是寫錯了,但我搞了好幾天,能力有限,實在想不出來解決方法,故此發帖求助。

減值這塊有點繞,但愿我上面說清楚了。下面貼出單片機代碼,請大佬不吝指導。

#include  "STC8G.h"
#include  "TM1650.h"

char n=3;                        //閃動位數
unsigned char flag_1ms=0;  //時間基線1ms
unsigned int flag_300ms=0; //閃動間隔時長
bit Active_Menu=0;       //激活設置標志
bit flag=0;                //閃動標志

//sbit LED=P1^1;            //按鈕測試

sbit EC11_A=P3^2;          //加值
sbit EC11_B=P3^3;          //減值
sbit K3 = P3^4;            //設置鍵


int number=134;//顯示數值初始化
//-----------------------------------------------------------------
unsigned char code SEG7[] = {0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char LedBuff[] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned char ucDigDot[8];//要顯示的8個小數點
int num[] = {0, 0, 0, 0};

void display();
void EC11_K3_Scan();
int Jia_jian(int Value);
int EC11_Scan(int EC11_value);


void EC11_K3_Scan()    //EC11按鍵功能
{
static unsigned int K3_press_time=0;     //按鍵計時變量
static bit K3_sign=0;  //按鍵狀態標志
   
                    if(K3==0)  //按鍵按下
                    {
                K3_press_time++;
                        
                if(K3_press_time>3000)
                                    
                      K3_press_time=3001; //防止溢出
                                
                if(K3_press_time>10 && K3_sign==0) //10ms消抖
                                    
                      K3_sign=1; //確認按鍵按下
                                
                if(K3_press_time==3000)  //判斷按下3s有效
                            {
                                                            
                                Active_Menu=~Active_Menu;
                           
                                if(Active_Menu==0) flag=0;
                                
                            //LED=!LED;  //按鍵測試
                            }     
                    }
        else        //短按或按下后松手
        {
                if(K3_sign==1)//判斷是按鍵按下后松手
                {
                                    K3_sign=0;
                        
                                            if(K3_press_time<1000)//小于1s判斷短按
                       
                                          
                                                if(Active_Menu==1)     
                    
                                                {
                                                    n--;                 //個位、十位、百位切換
                                                if (n <0) n = 3;
                                                }
                    
                            //LED=!LED; //任務按鍵測試
                        if(K3_press_time>=1000 && K3_press_time<3000);//大于1s有效
                    
                               //任務
                }
                K3_press_time=0;

        }
}


int Jia_jian( int Value)  //加減值函數

{

     {num[0]=Value/1000;
        num[1]=(Value/100)%10;
        num[2]=(Value/10)%10;
        num[3]=Value%10;}

        Value=EC11_Scan(Value);

                          if (Value<100&&Value>10)   //有問題的代碼
                                      n=2;                       //有問題的代碼
                            else if (Value<10&&Value>0)//有問題的代碼
                                      n=3;                       //有問題的代碼

                           
                           
                            if (Value<0)
                            Value=0;
        
                            if (Value>9999) Value=0;
                           
                           

        display();

return Value;
    }

void display()//1650顯示
{
    unsigned char i;
    unsigned char j;
   
        for(i = 0; i < 4; i++)
   
                LedBuff[ i] = num[ i];
   
        if (flag)
                LedBuff[n] = 10;
        
   for(j=0;j<4;j++)
   Set1650(DIG_BIT_CODE[j],SEG7[LedBuff[j]]);               
}

void Timer1Init(void)        //1毫秒@11.0592MHz
{
    AUXR &= 0xBF;        //定時器時鐘12T模式
    TMOD &= 0x0F;        //設置定時器模式
    TL1 = 0x66;            //設置定時初始值
    TH1 = 0xFC;            //設置定時初始值
    TF1 = 0;                //清除TF1標志
    TR1 = 1;                //定時器1開始計時
   
    EA=1;                //開總中斷
  ET1=1;            //開定時器T1中斷
}
//---------------------------------------

void main()
{
   
    P0M1 = 0x00;   P0M0 = 0x00;   //設置為準雙向口
  P1M1 = 0x00;   P1M0 = 0x00;   //設置為準雙向口
  P2M1 = 0x00;   P2M0 = 0x00;   //設置為準雙向口
  P3M1 = 0x00;   P3M0 = 0x00;   //設置為準雙向口
  P4M1 = 0x00;   P4M0 = 0x00;   //設置為準雙向口
  P5M1 = 0x00;   P5M0 = 0x00;   //設置為準雙向口
  P6M1 = 0x00;   P6M0 = 0x00;   //設置為準雙向口
  P7M1 = 0x00;   P7M0 = 0x00;   //設置為準雙向口
        
  P_SW2 |= 0x80;     //準雙向口(或開漏模式) + 內部上拉
    P3PU=0xc0;
   
    Timer1Init();//定時器1初始化
    Init1650();//1650初始化
   
while(1)
    {
        if(flag_1ms==1)
        {
                flag_1ms=0;
                number=Jia_jian(number);
                EC11_K3_Scan();         
        }
}
}

//---------------------------------------

void T1_time() interrupt 3   //定時器T1的中斷序號為3,T1的中斷服務函數
{
   
    flag_1ms=1;
    if(Active_Menu==1)
    flag_300ms++;
    if(flag_300ms==300)
    {
            flag_300ms=0;
            flag = ~flag;//閃動標志
    }
}

/*********************************

* @函數名:EC11_Scan

* @描  述:判斷方向,計算旋轉的值。個位閃動+/-1;十位閃動+/-10;百位閃動+/-100。

* @參  數:EC11_value

* @返回值:EC11_value

*********************************/

int EC11_Scan(int EC11_value)

{
      static bit EC11_Flag=0,Left_Flag=0,Right_Flag=0;
    if((EC11_A)&&(EC11_B))  //兩個都是1,表示開始第一個脈沖
    {
  EC11_Flag =1 ;//標記為第一個信號收到,可以進行下一個信號
    }
    if(EC11_A!=EC11_B)//第二個信號
    {
   Left_Flag = EC11_A ; //記錄AB的信號狀態
   Right_Flag = EC11_B ;
    }
    if(EC11_Flag)  
        {
   if((EC11_A==0)&&(EC11_B==0))  // 第三個信號,處理第二個信號的值
           {
      if(Left_Flag)  //左轉
                        {
                 if (n==1)            //百位閃動
                            EC11_value-=100;    //百位閃動-100
                     else if (n==2)       //十位閃動
                          EC11_value-=10;        //十位閃動-10
                     else if (n==3)          //個位閃動
                       EC11_value--;            //個位閃動-1
                        }
                    else if(Right_Flag)
                        {
                 if (n==1)            //百位閃動
                            EC11_value+=100;  //百位閃動+100
                     else if (n==2)       //十位閃動
                          EC11_value+=10;   //十位閃動+10
                     else if (n==3)          //個位閃動
                            EC11_value++;          //個位閃動+1            
                        }
             EC11_Flag = 0; //把標志位清零,等待下一個周期            
           }
        }   
    return EC11_value;
}


EC11數碼管閃動.rar

6.75 KB, 下載次數: 21

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-11-13 22:19 | 只看該作者
n的值被if (Value<100&&Value>10)和else if (Value<10&&Value>0)定死了
建議修改如下,n只會在value有改變時才賦值


回復

使用道具 舉報

板凳
ID:1044091 發表于 2022-11-14 16:55 | 只看該作者
lkc8210 發表于 2022-11-13 22:19
n的值被if (Value10)和else if (Value0)定死了
建議修改如下,n只會在value有改變時才賦值

感謝大佬指導!在你的思路基礎上結合整個程序我又補充了一些代碼,從執行結果上看是對的,不過我自己已經徹底暈了全靠仿真一步步驗證出來的。等頭腦清醒的時候再優化下吧!




回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热这里都是精品 | av国产精品 | 久久成人免费 | 鲁一鲁资源影视 | 中文字幕国产精品视频 | 国产午夜在线 | 一区二区三区精品视频 | 99精品一区二区 | 精品日韩欧美一区二区 | 超碰97人人人人人蜜桃 | 美女日皮网站 | 国产精品2区 | 日本一区二区三区四区 | 中文字幕亚洲一区二区va在线 | 婷婷色国产偷v国产偷v小说 | 久久久国产精品 | 久久久久一区二区三区 | 欧美日韩不卡合集视频 | 久久久妇女国产精品影视 | 久久精品国产一区二区电影 | 羞羞视频一区二区 | 天堂成人国产精品一区 | 久久亚| 狠狠操狠狠干 | 一区二区中文字幕 | 日本a视频| 日韩精品一区二区三区在线播放 | 日韩av免费在线电影 | 日韩在线视频免费观看 | 中文在线一区二区 | 免费观看毛片 | 久久精品成人 | 日韩欧美精品一区 | 在线亚洲免费视频 | 日本不卡免费新一二三区 | 天天弄 | 欧美国产视频 | 国产日产精品一区二区三区四区 | 91免费高清视频 | 亚洲欧美视频一区 | 日韩欧美手机在线 |