發表文章

目前顯示的是 2018的文章

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

圖片
各位同學今天要做的是碼表 就是在跑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

危機處理-呼吸燈

圖片
阿阿阿,去夏威夷爽了一個禮拜來補個上禮拜作業 主程式不難,比較麻煩的部分是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; }

危機處理-相關GPIO整理

圖片
今天來整理一下之前有用到的指令 LED 初始化: • GPC12設為輸出 DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); 控制: • 設定GPC12之輸出為高電位(GPC12=1) DrvGPIO_SetBit(E_GPC,12); • 設定GPC12之輸出為低電位(GPC12=0) DrvGPIO_ClrBit(E_GPC,12); 7-Segment #include "Seven_Segment.h" close_seven_segment(); show_seven_segment(3, 11);

危機處理-16X16宮格糞GAME

圖片
一開始的想法是先寫一個 draw_block函式, 只需要輸入 畫布陣列 、 圖像陣列 、 X,Y 座標即可印出整個16X16宮格。 p.s.請記得置於副函式歐同學 //繪圖函式16X16像素 //畫布陣列,主角陣列X座標,Y座標 void draw_block(unsigned char *buffer, unsigned char *pic_buffer, unsigned char *pic_buffer2, int x, int y ){ //清空九宮格大小的方塊 clr_part_pannal(buffer, 0, 60, 0, 7); //畫16x16格線 LineBresenham(buffer, 0, 0, 60, 0, 1); LineBresenham(buffer, 0, 0, 0, 60, 1); LineBresenham(buffer, 60, 60, 0, 60, 1); LineBresenham(buffer, 60, 60, 60, 0, 1); LineBresenham(buffer, 0, 15, 60, 15, 1); LineBresenham(buffer, 0, 30, 60, 30, 1); LineBresenham(buffer, 0, 45, 60, 45, 1); LineBresenham(buffer, 15, 0, 15, 60, 1); LineBresenham(buffer, 30, 0, 30, 60, 1); LineBresenham(buffer, 45, 0, 45, 60, 1); //將主角輸入至畫布上 create_picture(buffer, 15*x, 15*y, pic_buffer, 16, 16); //將地雷輸入至畫布上 create_picture(buffer, 15, 15, pic_buffer2, 16, 16); create_picture(buffer, 30, 45, pic_buffer2, 16, 16); //將畫布輸出 draw_part_LCD(buffer, 0, 60, 0, 7); } 然後開始著手主程式6 S

危機處理作業-密碼鎖

1. Ascii_Table.C 新增 /*black_block*/ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF , /*white_block*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , /*key(K)*/ 0x1C,0xF4,0x84,0xF4,0x14,0x74,0x44,0x74 , /*key(L)*/ 0x14,0x34,0x42,0x99,0xA5,0x99,0x42,0x3C , /*fish(F)*/ 0x38,0x44,0x82,0x81,0x89,0x81,0x81,0x81 , /*fish(G)*/ 0x81,0x81,0x42,0x24,0x18,0x24,0x42,0xFF , /*bigX(E)*/ 0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81 , 2.LCD_Driver.C 新增函式 void Show_graph(unsigned char x, unsigned char y,unsigned char ascii_word){ int i=0,k=0; unsigned char temp; //k=(ascii_word-32)*16; if(ascii_word==70){ //ascii_word49==>F "fish" k=1552; } else if(ascii_word==71){ //ascii_word49==>G k=1560; } else if(ascii_word==75){ //ascii_word49==>K "KEY" k=1536; } else if(ascii_word==76){ //ascii_word49==>L k=1544; } else if(ascii_word==69){

blogger設定程式碼區塊

step1.  進入版面配置 step2.  新增小工具,點選HTML/JavaScript step3.  輸入指令 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/styles/rainbow.min.css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/highlight.min.js"></script> <script>hljs.initHighlightingOnLoad();</script> *rainbow.min.css為樣式 step4. 使用方式為   <pre><code class="C"> 你的程式碼 </code></pre>  *C為使用語言 參考資料: Blogger : 如何使用程式碼區塊-HsingJung Chen’s 筆記本 http://hsingjungchen.blogspot.com/2017/03/blogger.html