發表文章

Leetcode-TwoSum

圖片
今天心血來潮了完成人生第一題leetcode /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* nums, int numsSize, int target) { int *a= (int*)malloc(2*sizeof(int)); for(int i=0; i<numsSize; i++){ for(int j=i+1; j<numsSize; j++){ if(nums[i]+nums[j]==target&&i!=j){ a[0]=i; a[1]=j; //return a; } } } return a; } 詳細之後再補

危機處理-藍芽傳送字元(HC-05)

圖片
今天來補個用藍芽傳字元給M0的程式碼 使用的藍芽模組是HC-05(主從合一),之後有空再補上HC-05的設定 查了查資料發現藍牙傳輸的方式不會對傳輸內容做任何的手腳(應該說調變?)等效於一條RS-232傳輸線 所以關於藍牙與板子的溝通就是通過UART協定去寫 而NUC140關於UART的腳位如下 (擷取自樹德科技大學資訊工程系 吳鴻志副教授之PPT) 我測試用的程式碼如下: #include <stdio.h> #include "NUC1xx.h" #include "Driver\DrvSYS.h" #include "Driver\DrvGPIO.h" #include "Driver\DrvSPI.h" #include "LCD_Driver.h" #include "ScanKey.h" #include "Seven_Segment.h" #include "LCD_Driver_Extend.h" #include "Driver/DrvUART.h" #define DATASIZE 1 uint8_t mode; extern unsigned char Ascii[]; unsigned char TEXT1[16]="Keypad = "; unsigned char LCD_Point[64]; unsigned char DisplayBuf[8*128]; int main(void) { UNLOCKREG(); DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); SysTimerDelay(5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); LOCKREG(); Initial_pannel(); //call initial pannel f...

危機處理- 絶対に賣不出去的碼表

圖片
各位同學今天要做的是碼表 就是在跑1600那種老師可以拿來記錄秒數的碼表 是不是很簡單呢,真的很簡單~ 那我們就先來處理名次紀錄的部分 名次(秒數)紀錄: 在 void RTC_IRQHandler ( void ) 函式下尻入下列程式碼判讀鍵盤跟print出時間 歐對記得宣告 TEXT 陣列兄弟們還有 變數N 變數N 在這裡的主要功能是保持紀錄的優先順序(key1被按之前key2,key3都不能按,etc) key=Scankey();//讀取鍵盤值 if(key==1&&N==0){ N=1; sprintf(TEXT3,"%02d:%02d:%02d",sCurTime.u32cHour ,sCurTime.u32cMinute,sCurTime.u32cSecond); print_lcd(2, TEXT3); } if(key==2&&N==1){ N=2; sprintf(TEXT4,"%02d:%02d:%02d",sCurTime.u32cHour ,sCurTime.u32cMinute,sCurTime.u32cSecond); print_lcd(1, TEXT4); } if(key==3&&N==2){ N=3; sprintf(TEXT5,"%02d:%02d:%02d",sCurTime.u32cHour ,sCurTime.u32cMinute,sCurTime.u32cSecond); print_lcd(0, TEXT5); } 接下來要弄暫停跟重制: 一樣都放在 void RTC_IRQHandler ( void ) 函式下 1.暫停基本上跟記錄秒數一樣,就是把跑秒數的那一行拿來print按下key4當的秒數 但是! 此時要把不停更新當前秒數的程式碼暫停(下一段會說明) 2.重制很簡單就是先清除螢幕在重啟RTC if(key==4){ //暫停 N=4; sprintf(TEXT6,"%02d:%02d:%02d",sCurTime.u32cHour ,sCurTime.u32cMinute...

危機處理-原來是LCD的部分阿~(附壓縮檔)

圖片
又到了交作業了時間了各位同學 今天的作業是利用光敏電阻(ADC)改變LCD上的電池顯示 錒......其實就是考你LCD阿 記得助教說多大都沒問題整個螢幕都可以所以我就畫了一個這樣的東西XD(彩蛋自己找) 總共畫了四張(電池一格,兩格...etc) 之後用軟體轉換成txt檔案 battery1.txt battery2.txt battery3.txt battery4.txt 之後記得 宣告 R! 判斷試的部分就直接用 draw_LCD() 函式整個畫出來 (記得add跟在主程式include driver_Extend.c ) if(ADC->ADDR[5].RSLT>2000){ Duty_Cycle=0; draw_LCD(battery1); } else if(ADC->ADDR[5].RSLT>1000){ Duty_Cycle=25; draw_LCD(battery2); } else if(ADC->ADDR[5].RSLT>800){ Duty_Cycle=50; draw_LCD(battery3); } else if(ADC->ADDR[5].RSLT>600){ Duty_Cycle=75; draw_LCD(battery4); } 最後壓縮檔附上 點我

危機處理-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...