欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機+1602多重數據顯示程序問題 有實時數據 有按鍵值數據 無法正常工作 [打印本頁]

作者: 不將就123    時間: 2019-11-10 16:02
標題: 單片機+1602多重數據顯示程序問題 有實時數據 有按鍵值數據 無法正常工作
這是部分代碼  全部代碼功能量比較大    無法全部貼上來   我簡單的描述一下我遇到的問題   
  1.  在沒有 “disp_adc_voltage();             //顯示電壓數據到顯示屏”      這個函數的時候,我的1602可以隨時顯示我的 編碼器按鍵數值我要多少直接轉動就是了 但不是實時數據  也就是按鍵在轉動的時候才有按鍵值發生變化


  2. 加入了這個函數“disp_adc_voltage();  ”后就不行了  在改變按鍵值就無法進入“ keyscan();”這個函數了 ,就算進了 也是不準的 轉動按鍵數值也不會變化 要很久才變化     這個disp_adc_voltage();  “”是顯示電壓的   電壓顯示是實時數據    是不是因為1602有實時數據寫入  然后在轉動按鍵無法寫入按鍵新的數據了啊



  3.要解決這個問題該怎么弄啊   是讓  ADC 顯示 為間歇性的嗎     請高手指點一下     我百度了 也看論壇了  但是沒有類似這樣的問題  

單片機源程序如下:

#include <STC12C5A60S2.H>

#include "all_function_api.h"

#include "stdint.h"

sbit  LED = P3^7;

sbit  LED_1 = P3^6;

sbit  key  = P3^0;


sbit    Pin_Portry_Sd=P2^2;

/*--------------------------------
功能:該變量用于保存按鍵值1
--------------------------------*/
extern uint8_t  Sd_Key_Value ;



/*--------------------------------
功能: 該變量用于保存按鍵值2
---------------------------------*/
extern uint8_t  Sd_Key_Value2 ;


/*---------------------------------
功能:該變量用于保存按鍵值3
---------------------------------*/
extern uint8_t  Sd_Key_Value3 ;


unsigned char keyjishu=0;




/*-------------------------------
多功能按鍵實現
--------------------------------*/
void  keyscan()
{
        

        //在初始化 第二屏幕類容之前用了清屏指令,故從新寫入顯示屏的地址
        //第一排為 0x80  第二排為 0xc0  要記住哦
                //利用switch 來切換,這個條件語句切換的更多 更有優勢一些
                   if(Pin_Portry_Sd !=1)
                     {
                           
                           delay_5ms(20);   //消抖
                     
                      if(Pin_Portry_Sd !=1)
                            {

                                while(!Pin_Portry_Sd);
                                keyjishu++;

                            }

                          }

                         switch(keyjishu)
                         {
                            case 1 :
                              {
                                         
                                
                        //        CR=1;                    
                                   lcd_write_com(0x80); //光標位置 第一位就是0可以不加   你要在第幾位開始顯示就是顯示屏格數-1 例如第3位 就是+2即可
                        lcd_write_com(0x0f);  //光標閃爍                                   
                                if(Data_key_freq(&Sd_Key_Value));
                        
                            }
                               break;
                  
                        
                            case 2 :
                              {
                             
                                 keyjishu=3;               //這里直接賦值是為了在打開混頻的時候減少一次按鍵,就直接調整旋鈕即可調整混頻
                                 lcd_write_com(0x80+14);  //寫入‘O’的地址
                                 write_date_('O');
                                 lcd_write_com(0x80+15); //寫入‘N’的地址
                                 write_date_('N');
                                 TR1 = 1;                             
                           }

                            break;
                  
                  
                          case 3 :
                              {
                             
                                    lcd_write_com(0x80+6);           //寫入‘F’光標地址
                                    if(Data_key_freq_2(&Sd_Key_Value2));
                           
                           }
                             break;
               
                          
                           case 4 :
                              {


                           
                            // keyjishu=1;          //  這里清為1 表示在關閉混頻的時候減少一次按鍵直接調整主頻    如果清0 就要增加幾次按鍵 很麻煩                     
                                    lcd_write_com(0x80+14);
                                 write_date_('O');                //寫入‘O’的地址
                                 lcd_write_com(0x80+15);
                                 write_date_('F');                //寫入‘F’的地址
                                 lcd_write_com(0x0c);
                                    TR1 = 0;                                 //關閉定時器  關閉混頻
                           }   
                              break;
                 
                           case 5 :
                              {
                             CR=1;
                                 lcd_write_com(0x0f);  //光標閃爍
                                 lcd_write_com(0xc0);  //寫入光標地址
                                 if(Data_key_duty_3(&Sd_Key_Value3));
                           
                           }   
                              break;

                        
                       }

                           if(6 == keyjishu)
                                {
                                   keyjishu=1;
                                
                                }
                        
                  
                  
}

/*------------------------
主函數 主函數入口
--------------------------*/
void main()                                               
{                  
                  //1602初始化
          lcd_init();

                  //開機畫面1 初始化
                  Boot_screen_init_0();
               
                  //開機密碼檢測,當密
                  //碼輸入成功,進入程序
                  kaijimima_key_init();


                   //開機畫面2 初始化
                  Boot_screen_init_1();

                  //PWM PCA寄存器初始化
                  PCAregister_init();

                  //E2PROM初始化
                  E2PROM_init();

                  //定時器1初始化
                  Timer1_Init();

                  //定時器0 初始化
          Timer0_Init();

                  //ADC配置 初始化
                  Init_ADC();

                  //關閉定時器T1  防止一進來就啟動混頻
                  TR1 = 0;                                          

                 
/*--------------------------
大循環
---------------------------*/                 
while(1)
{
                 
               
                         keyscan();                                                 //功能按鍵函數
                     disp_adc_voltage();             //顯示電壓數據到顯示屏
                        

                        
               
                         ZPgengxin(Sd_Key_Value);         //把變化的數據寫入到定時器PCA時鐘里面 來改變主頻數據

                         disp_ZPzankongbi(Sd_Key_Value3); //把占空比變化的值寫到顯示屏里面


                 disp_zhuping(Sd_Key_Value);             //從24c02第4扇區里面把數據讀出來,達到復位掉電存儲的效果         
                  

                     disp_fuping(Sd_Key_Value2);           //把副頻的值顯示屏到屏幕上
                        

                           
                //        Duty_Cycle(Sd_Key_Value2);          //副頻變化寫入到函數里面; 備用 直接賦值到 定時器里面

                        
        

                        
               



                         CCAP1H =CCAP1L = Sd_Key_Value3; //把占空比變化的值寫到PCA寄存器里面
                         CCAP0H =CCAP0L = Sd_Key_Value3; //把占空比變化的值寫到PCA寄存器里面

                        

                         OVP_ADC_1();                    //過壓保護

        //                disp(AT_24c02_read(1));             //從24c02第4扇區里面把數據讀出來,達到復位掉電存儲的效果


                //        disp_fuping(Sd_Key_Value2);   //同時把副頻的變化顯示出來;


           //        AT_24c02_Write( 2, Sd_Key_Value2);  //同時寫到24C02的第4扇區

                //        disp(Sd_Key_Value);
                                
                          
                 
                   // if(Data_key(&Sd_Key_Value));  
                  //  Data_key();//不停的掃描開關函數是否發生變化
  }
                  
                  
   
}

作者: 不將就123    時間: 2019-11-11 10:01
感謝各位大佬的幫助    這個問題又被我突破了     開始我的軟件沒法仿真   沒有破解   后面破解了   仿真了一下   發現問題在ADC求平均值100次里面耗時太長  導致程序一時半會退不出  ADC      




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1