發表文章

目前顯示的是 11月, 2018的文章

危機處理-ADC光感螢幕很carry

圖片
今天我們要來做的是手機的背光感測 大概就是 環境光 亮 -->背光變 亮                  環境光 暗 -->背光變 暗 光感判斷式: 為了可讀性的關係所以定義了 Duty_Cycle / CMR / CNR 去明確的表達工作週期。 要用此方法 記得宣告變數! 不然也可以直接   PWMA->CMR0 = (欲使用之數值); 而亮度數值就自己去試6 CMR = (Duty_Cycle * CNR) / 100; //Duty Cycle(Unit:%) PWMA->CMR0 = CMR; if (ADC->ADDR[5].RSLT > 3000){ Duty_Cycle = 0; //DrvSYS_Delay(200000); } else if (ADC->ADDR[5].RSLT > 2700){ Duty_Cycle = 25; } else if (ADC->ADDR[5].RSLT > 2400){ Duty_Cycle = 50; } else if (ADC->ADDR[5].RSLT > 1600){ Duty_Cycle = 75; } 最後還有ADC的宣告: SYS->GPAMFP.ADC5_AD8=1; //使用GPA5 ADC->ADCHER.CHEN = 0x20; //0x20 = 0010 0000//選定第五通道

危機處理-外部中斷作業

圖片
各位同學來寫作業囉!!! 基本上就是做一個倒車雷達的概念 而範例檔已經很佛的幫你寫好了超音波測距跟馬達轉動還有蜂鳴器的程式碼 所以基本上就用裡面的 distance 變數去判定距離 然後再用上次課堂作業的概念(時間中斷的frequency)去控制馬達轉速跟蜂鳴器的 頻率 距離判斷: 用很簡單的if/else if(n==0){ TIMER0->TCMPR = 2000000; } if(n==1){ TIMER0->TCMPR = 1000000; } if(n==2){ TIMER0->TCMPR = 500000; } if(m==3){ TIMER0->TCMPR = 0; } 外部中斷: m 為判斷外部中斷是否啟動的變數 void EINT1Callback(void) { m=3; //顯示警報以及三短音 print_lcd(3,"ALARM!!"); for(int i=0;i<3;i++){ DrvGPIO_ClrBit(E_GPB,11); DrvSYS_Delay(85000); DrvGPIO_SetBit(E_GPB,11); DrvSYS_Delay(250000); } /*for(int i=0;i<4;i++){ DrvSYS_Delay(250000); }*/ print_lcd(3," "); } 馬達控制: void TMR1_IRQHandler(){ TIMER1-&gt;TISR.TIF = 1; // clear Interrupt flag //轉速控制 if(n==0||n==3){ TIMER1-&gt;TCMPR = 1250; //800Hz } if(n==1){ TIMER1-&gt;TCMPR = 2500; //400Hz } if(

危機處理-不知道該怎麼說的TIMER

圖片
究竟是道德的淪喪還是人性的崩壞使我們要用內部中斷去做timer呢 同學,請讓我們繼續看下去....... 因為這次題目會用到LCD相關的控制 所以相關的Source File 都要給他催落 1.  LCD_Driver.c 2.  LCD_Driver_Extend.c 3.  LCD_Point_Picture.C 其中 LCD_Driver_Extend.c新增了16*16的"電"字圖形 /*圖形 電2*/ unsigned char cyee[16][16]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0}, {1,0,1,1,1,1,0,1,0,1,1,1,1,0,1,0}, {1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0}, {1,0,1,1,1,1,0,1,0,1,1,1,1,0,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, {0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, {0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0}, }; 還有在 LCD_Driver_Extend.c 新增了 draw_cyee 函式 //繪圖函式16X16像素 " 電 " //圖片陣列,X座標,Y座標 void draw_cyee(unsigned char *buffer, unsigned cha

危機處理-呼吸燈

圖片
阿阿阿,去夏威夷爽了一個禮拜來補個上禮拜作業 主程式不難,比較麻煩的部分是PWM的設定 主程式: while(1){ int n; key=Scankey(); DrvSYS_Delay(15000); //if(key!=0)break; if(key==1&&n!=1){ light1(1); n=1; } if(key==2&&n!=2){ light2(1); n=2; } if(key==3&&n!=3){ light3(1); n=3; } if(key==4&&n!=4){ light4(1); n=4; } } light 函式: 原理就是此函式指定的燈會漸亮(for迴圈) 同時其他任何有亮的燈都會漸暗( if(Duty_Cycle<100) ) void light1(int x){ //if(x==0)K=-K; for(int i=0; i<10; i++){ Duty_CycleA=Duty_CycleA-K*10; CMRA = (Duty_CycleA*CNRA)/100 ; //Duty Cycle(Unit:%) PWMA->CMR0=CMRA; if(Duty_CycleB<100){ Duty_CycleB=Duty_CycleB+K*10; CMRB = (Duty_CycleB*CNRB)/100 ; //Duty Cycle(Unit:%) PWMA->CMR1=CMRB; } if(Duty_CycleC<100){ Duty_CycleC=Duty_CycleC+K*10; CMRC = (Duty_CycleC*CNRC)/100 ; //Duty Cycle(Unit:%) PWMA->CMR2=CMRC; }