|
最近想玩玩stm32的ad功能,看到網上ds0201的示波器是開源的!淘寶的店主也很熱情,給了我1.1版的源代碼
是IAR編譯器
我把它移植到KEIL下,為了提高速度,我使用fsmc方式驅動lcd顯示
現在還有點小問題,正在解決中。。(波形有點重疊)
資料下載:
stm32示波器.zip
(2.36 MB, 下載次數: 110)
2016-11-15 12:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
ds0201.rar
(20.64 KB, 下載次數: 69)
2016-11-15 12:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
主程序預覽:
- /**************************************************************
- DQ-STM32開發板試驗程序
- 2.4寸 示波器顯示實例(FSMC液晶接口)
- 源程序由IAR移植
-
- ****************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "fsmc_sram.h"
- #include "Function.h"
- #include "Lcd.h"
- #include "HW_V1_Config.h"
- #include "misc.h"
- #include "stm32f10x_it.h"
- #include "Calculate.h"
- #include "stm32f10x_usart.h"
- #include "stdio.h"
- /*******************************************************************************
- * Function Name : main
- * Description : Main program
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- int main(void)
- {
- unsigned int i;
-
- RCC_Configuration(); /* 系統時鐘初始化 */
- NVIC_Configuration(); /*GPIO端口配置*/
- GPIO_Configuration();
- DMA_Configuration();
- ADC_Configuration();
- Timer_Configuration();
- USART_Configuration(); /* 串口初始化 */
- LCD_Initial(); /*液晶初始化*/
- Clear_Screen(BLACK); //清屏幕
- Display_Logo(30,150);
-
- /*----------顯示開機提示信息頁面----------*/
- Display_Str(8, 87, GRN,PRN, " System Initialize...");
- Display_Str(8, 55, GRN,PRN, " Please Wait");
- Display_Str(8, 23, YEL,PRN, " Snail Dongbin Oscilloscope Ver 1.0 ");
- printf("\n\r snail_dongbin 示波器實驗 ! \n\r");
- Delay_Counter=1000;
- while (Delay_Counter)
- {
- Battery_Detect(); //電池電量檢測
- for(i=0; i<300; ++i) Signal_Buffer[i]=120;
- for(i=0; i<0x1000; ++i) Scan_Buffer[i]=1940;
- };
- /*示波器工作頁面顯示初始化*/
- Clear_Screen(BLACK); //清屏幕
- Display_Grid(); //顯示背景網格
- Display_Frame();
- /* 主循環 */
- while (1)
- {
- Update_Item();
- Scan_Wave();
- if(Key_Buffer!=0)
- {
- Update[Item]=1;
- if(Key_Buffer==KEYCODE_PLAY)
- {
- Update[15]=1;
- if(Item_Index[RUNNING_STATUS]==RUN)
- Item_Index[RUNNING_STATUS]=HOLD;
- else
- {
- ADC_Start();
- Item_Index[RUNNING_STATUS]=RUN;
- Sync=0;
- }
- }
- switch (Item)
- {
- case SYNC_MODE:
- if(Key_Buffer==KEYCODE_LEFT) Item=TRIG_LEVEL;
- if(Key_Buffer==KEYCODE_RIGHT) Item=Y_SENSITIVITY;
- if(Key_Buffer==KEYCODE_DOWN){ //指向下一種掃描同步方式
- if(Item_Index[SYNC_MODE]>0) Item_Index[SYNC_MODE]--;
- else Item_Index[SYNC_MODE]=3;
- ADC_Start();
- Sync=0;
- Frame=0;
- Item_Index[RUNNING_STATUS]=RUN;
- Update[RUNNING_STATUS]=1;
- }
- if(Key_Buffer==KEYCODE_UP){ //指向上一種掃描同步方式
- if(Item_Index[SYNC_MODE]<3) Item_Index[SYNC_MODE]++;
- else Item_Index[SYNC_MODE]=0;
- ADC_Start();
- Sync=0;
- Frame=0;
- Item_Index[RUNNING_STATUS]=RUN;
- Update[RUNNING_STATUS]=1;
- }
- break;
-
- case Y_SENSITIVITY:
- if(Key_Buffer==KEYCODE_LEFT) Item=SYNC_MODE;
- if(Key_Buffer==KEYCODE_RIGHT) Item=X_SENSITIVITY;
- if(Key_Buffer==KEYCODE_UP){
- Erase_Wave(MODEL);
- ADC_Start();
- Sync=0;
- if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]<9))
- Item_Index[Y_SENSITIVITY]++; //輸入探頭衰減=1時
- if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]<18))
- Item_Index[Y_SENSITIVITY]++; //輸入探頭衰減=10時
- }
- if(Key_Buffer==KEYCODE_DOWN){
- Erase_Wave(MODEL);
- ADC_Start();
- Sync=0;
- if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]>0))
- Item_Index[Y_SENSITIVITY]--; //輸入探頭衰減=1時
- if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]>11))
- Item_Index[Y_SENSITIVITY]--; //輸入探頭衰減=10時
- }
- if(Item_Index[Y_SENSITIVITY]!=Ref_Buffer [302]) Hide_Ref=1;
- break;
-
- case X_SENSITIVITY:
- if(Key_Buffer==KEYCODE_LEFT) Item=Y_SENSITIVITY;
- if(Key_Buffer==KEYCODE_RIGHT) Item=Y_POSITION;
- if((Key_Buffer==KEYCODE_UP)&&(Item_Index[X_SENSITIVITY]<21)){
- Item_Index[X_SENSITIVITY]++;
- Erase_Wave(MODEL);
- ADC_Start();
- Sync=0;
- }
- if((Key_Buffer==KEYCODE_DOWN)&&(Item_Index[X_SENSITIVITY]>0)){
- Item_Index[X_SENSITIVITY]--;
- Erase_Wave(MODEL);
- ADC_Start();
- Sync=0;
- }
- if(Item_Index[X_SENSITIVITY]!=Ref_Buffer [303]) Hide_Ref=1;
- break;
- case Y_POSITION:
- if(Key_Buffer==KEYCODE_LEFT) Item=X_SENSITIVITY;
- if(Key_Buffer==KEYCODE_RIGHT) Item=MEASUR_KIND;
- if((Key_Buffer==KEYCODE_UP)&&(v0<MAX_Y)){
- Erase_Wave(MODEL);
- Erase_Wave(CURVE);
- Erase_Dot_v0();
- Erase_Vn(v0);
- v0++;
- Hide_v0=0;
- } //'垂直位移'基線上移,顯示基線。
- if((Key_Buffer==KEYCODE_DOWN)&&(v0>(MIN_Y+1))){
- Erase_Wave(MODEL);
- Erase_Wave(CURVE);
- Erase_Dot_v0();
- Erase_Vn(v0);
- v0--;
- Hide_v0=0;
- } //'垂直位移'基線下移,顯示基線。
- if(Key_Buffer==KEYCODE_MANU)
- Hide_v0=1-Hide_v0; //(顯示/消隱)垂直位移基線。
- break;
- case MEASUR_KIND:
- if(Key_Buffer==KEYCODE_LEFT) Item=Y_POSITION;
- if(Key_Buffer==KEYCODE_RIGHT){
- Hide_vs=0;
- Item=TRIG_SENSITIVITY;
- }
- if(Key_Buffer==KEYCODE_UP){
- if(Item_Index[MEASUR_KIND]<2) Item_Index[MEASUR_KIND]++; //選擇下一種測量類型
- else Item_Index[MEASUR_KIND]=0;
- }
- if(Key_Buffer==KEYCODE_DOWN){
- if(Item_Index[MEASUR_KIND]>0) Item_Index[MEASUR_KIND]--; //選擇上一種測量類型
- else Item_Index[MEASUR_KIND]=2;
- }
- break; //測量類型共有:FREQN、CYCLE、DUTY 3種
- case POWER_INFOMATION:
- if(Key_Buffer==KEYCODE_LEFT) Item=MEASUR_KIND;
- if(Key_Buffer==KEYCODE_DOWN) Item=TRIG_SENSITIVITY;
- break; //供電方式共有:BATT(FULL、HALF、FEW、EMPTY)、USB 5種狀態
- case TRIG_SENSITIVITY:
- if(Key_Buffer==KEYCODE_UP){
- Hide_vs=1;
- Item=MEASUR_KIND;
- Update[Y_VERNIER_2]=1;
- }
- if(Key_Buffer==KEYCODE_DOWN){
- Item=TRIG_SLOPE;
- Hide_vs=1;
- }
- if((Key_Buffer==KEYCODE_RIGHT)&&((Item_Index[TRIG_SENSITIVITY]+vt)<(MAX_Y-1))
- &&((vt-Item_Index[TRIG_SENSITIVITY])>(MIN_Y+3))){
- Item_Index[TRIG_SENSITIVITY]++; //降低觸發靈敏度
- }
- if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[TRIG_SENSITIVITY]>0)){
- temp=vt;
- vt=temp+Item_Index[TRIG_SENSITIVITY];
- Erase_Vn(vt);
- vt=temp-Item_Index[TRIG_SENSITIVITY];
- Erase_Vn(vt);
- vt=temp;
- Item_Index[TRIG_SENSITIVITY]--; //提高觸發靈敏度
- }
- break;
- case TRIG_SLOPE:
- if(Key_Buffer==KEYCODE_UP){
- Hide_vs=0;
- Item=TRIG_SENSITIVITY;
- }
- if(Key_Buffer==KEYCODE_DOWN) Item=INPUT_ATTENUATOR;
- if((Key_Buffer==KEYCODE_LEFT)||(Key_Buffer==KEYCODE_RIGHT)){
- Item_Index[TRIG_SLOPE]=1-Item_Index[TRIG_SLOPE]; //選擇(上升沿觸發/下降沿觸發)
- }
- break;
- case INPUT_ATTENUATOR:
- if(Key_Buffer==KEYCODE_UP) Item=TRIG_SLOPE;
- if(Key_Buffer==KEYCODE_DOWN){
- if(SD_Card_ON()==0) Item=SAVE_WAVE_CURVE;
- else Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設定'
- }
- if((Key_Buffer==KEYCODE_LEFT)||(Key_Buffer==KEYCODE_RIGHT)){
- Erase_Wave(MODEL);
- Erase_Wave(CURVE);
- Item_Index[INPUT_ATTENUATOR]=1-Item_Index[INPUT_ATTENUATOR]; //(×1/×0.1)輸入衰減選擇
- }
- if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]>9))
- Item_Index[Y_SENSITIVITY]-=9;
- if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]<10))
- Item_Index[Y_SENSITIVITY]+=9;
- break;
-
- case SAVE_WAVE_CURVE:
- if(SD_Card_ON()==0) //有SD卡
- {
- // if(Key_Buffer==KEYCODE_UP) Item=INPUT_ATTENUATOR;
- // if(Key_Buffer==KEYCODE_DOWN) Item=LOAD_WAVE_CURVE;
- // if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[SAVE_WAVE_CURVE]<255))
- // Item_Index[SAVE_WAVE_CURVE]++; //波形文件序號號+1
- // if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[SAVE_WAVE_CURVE]>1))
- // Item_Index[SAVE_WAVE_CURVE]--; //波形文件序號號-1
- // if(Key_Buffer==KEYCODE_MANU){ //按'M'鍵
- // Update[SAVE_WAVE_CURVE]=0;
- // Cursor_Counter=0;
- // Char_to_Str(FileNum, Item_Index[SAVE_WAVE_CURVE]);
- // if(FAT_Info()==0){
- // if(Open_File(FileNum)==0){
- // for(i=0; i<300; ++i) {
- // SectorBuff[i+2]=View_Buffer[i];
- // }
- // SectorBuff[0]=0;
- // SectorBuff[1]=0;
- // SectorBuff[302]=(unsigned char)Item_Index[Y_SENSITIVITY];
- // SectorBuff[303]=(unsigned char)Item_Index[X_SENSITIVITY];
- // if(Write_File()==0){
- // Item_Index[LOAD_WAVE_CURVE]=Item_Index[SAVE_WAVE_CURVE]; //將當前寫入的文件序號定為讀取文件序號缺省值
- // if(Item_Index[SAVE_WAVE_CURVE]<255){
- // Item_Index[SAVE_WAVE_CURVE]++;
- // }
- // Update[SAVE_WAVE_CURVE]=1;
- // } else Display_Str(89,2,WHITE,PRN,"!FileWriteErr!");
- // } else Display_Str(89,2,WHITE,PRN,"!File NoPlace!");
- // } else Display_Str(89,2,WHITE,PRN,"!Micro SD Err!");
- // }
- } else {
- Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設定'
- }
- break;
- // case LOAD_WAVE_CURVE:
- // if(SD_Card_ON()==0){
- // if(Key_Buffer==KEYCODE_UP) Item=SAVE_WAVE_CURVE;
- // if(Key_Buffer==KEYCODE_DOWN) Item=OUTPUT_FREQUENCY;
- // if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[LOAD_WAVE_CURVE]<255))
- // Item_Index[LOAD_WAVE_CURVE]++; //波形文件序號號+1
- // if((Key_Buffer==KEYCODE_LEFT)&&((Item_Index[LOAD_WAVE_CURVE])>1))
- // Item_Index[LOAD_WAVE_CURVE]--; //波形文件序號號-1
- // if(Key_Buffer==KEYCODE_MANU) { //按'M'鍵
- // Erase_Wave(MODEL);
- // Update[LOAD_WAVE_CURVE]=0;
- // Cursor_Counter=0;
- // Char_to_Str(FileNum, Item_Index[LOAD_WAVE_CURVE]);
- // if(FAT_Info()==0){
- // if(Open_File(FileNum)==0){
- // if(Read_File()==0){
- // for(i=0; i<300; ++i) {
- // Ref_Buffer[i]=SectorBuff[i+2];
- // }
- // if(SectorBuff[302]<12){
- // Item_Index[Y_SENSITIVITY]=SectorBuff[302];
- // }else{
- // Item_Index[Y_SENSITIVITY]=4;
- // }
- // if(SectorBuff[303]<22){
- // Item_Index[X_SENSITIVITY]=SectorBuff[303];
- // }else{
- // Item_Index[X_SENSITIVITY]=8;
- // }
- // } else Display_Str(89,2,WHITE,PRN,"!File ReadErr!");
- // } else Display_Str(89,2,WHITE,PRN,"!File NoFound!");
- // } else Display_Str(89,2,WHITE,PRN,"!Micro SD Err!");
- // Hide_Ref=0;//;顯示新參考樣本波形
- // }
- // } else Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設定'
- // break;
- case OUTPUT_FREQUENCY:
- if(Key_Buffer==KEYCODE_UP) {
- if(SD_Card_ON()==0) Item=LOAD_WAVE_CURVE;
- else Item=INPUT_ATTENUATOR; //若無SD卡,則指向'輸入衰減選擇'
- }
- if(Key_Buffer==KEYCODE_DOWN) Item=X_VERNIER_2;
- if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[OUTPUT_FREQUENCY]<15))
- Item_Index[OUTPUT_FREQUENCY]++; //基準頻率輸出提高一檔
- if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[OUTPUT_FREQUENCY]>0))
- Item_Index[OUTPUT_FREQUENCY]--; //基準頻率輸出降低一檔
- break;
- case X_VERNIER_2:
- if(Key_Buffer==KEYCODE_UP) Item=OUTPUT_FREQUENCY;
- if(Key_Buffer==KEYCODE_DOWN) Item=X_VERNIER_1;
- if(Key_Buffer==KEYCODE_MANU){
- Hide_t2=1-Hide_t2; //(顯示/消隱)水平測量游標T2
- Erase_Ti(t2);
- }
- if((Key_Buffer==KEYCODE_RIGHT)&&(t2<MAX_X)) { //時間測量游標線2右移
- Erase_Dot_ti(t2);
- Erase_Ti(t2);
- t2++;
- Hide_t1=0;
- Hide_t2=0;
- }
- if((Key_Buffer==KEYCODE_LEFT)&&(t2>MIN_X+1)) { //時間測量游標線2左移
- Erase_Dot_ti(t2);
- Erase_Ti(t2);
- t2--;
- Hide_t1=0;
- Hide_t2=0;
- }
- Update[DELTA_T]=1;
- Update[VERNIERS]=1;
- break;
-
- case X_VERNIER_1:
- if(Key_Buffer==KEYCODE_UP) Item=X_VERNIER_2;
- if(Key_Buffer==KEYCODE_DOWN) {
- Item=X_POSITION;
- Draw_View_Area();
- }
- if(Key_Buffer==KEYCODE_MANU){
- Hide_t1=1-Hide_t1; //(顯示/消隱)水平測量游標T1
- Erase_Ti(t1);
- }
- if((Key_Buffer==KEYCODE_RIGHT)&&(t1<MAX_X)) { //時間測量游標線1右移
- Erase_Dot_ti(t1);
- Erase_Ti(t1);
- t1++;
- Hide_t1=0;
- Hide_t2=0;
- }
- if((Key_Buffer==KEYCODE_LEFT)&&(t1>MIN_X+1)) { //時間測量游標線1左移
- Erase_Dot_ti(t1);
- Erase_Ti(t1);
- t1--;
- Hide_t1=0;
- Hide_t2=0;
- }
- Update[DELTA_T]=1;
- Update[VERNIERS]=1;
- break;
- case X_POSITION:
- if(Key_Buffer==KEYCODE_UP) {
- Item=X_VERNIER_1;
- Erase_View_Area();
- }
- if(Key_Buffer==KEYCODE_DOWN){
- Item=Y_VERNIER_2;
- Update[Y_VERNIER_2]=1;
- Erase_View_Area();
- }
- if(Key_Buffer==KEYCODE_RIGHT){
- Stop=0;
- Item_Index[X_POSITION]++; //水平顯示窗口位置右移
- Draw_View_Area();
- }
- if(Key_Buffer==KEYCODE_LEFT){
- Stop=0;
- Item_Index[X_POSITION]--; //水平顯示窗口位置左移
- Draw_View_Area();
- }
- Update[VERNIERS]=1;
- break;
- case RUNNING_STATUS:
- if(Key_Buffer==KEYCODE_UP) Item=X_POSITION;
- if(Key_Buffer==KEYCODE_LEFT) Item =Y_VERNIER_2;
- break;
- case Y_VERNIER_2:
- if(Key_Buffer==KEYCODE_RIGHT) {
- Item=X_POSITION;
- Draw_View_Area();
- }
- if(Key_Buffer==KEYCODE_LEFT) Item=Y_VERNIER_1;
- if(Key_Buffer==KEYCODE_MANU){
- Hide_v2=1-Hide_v2; //(顯示/消隱)垂直測量游標V2。
- Erase_Vi(v2);
- }
- if((Key_Buffer==KEYCODE_UP)&&(v2<MAX_Y)){
- Erase_Dot_vi(v2);
- Erase_Vi(v2);
- v2++; //垂直測量游標V2上移
- }
- if((Key_Buffer==KEYCODE_DOWN)&&(v2>MIN_Y+1)){
- Erase_Dot_vi(v2);
- Erase_Vi(v2);
- v2--; //垂直測量游標V2下移
- }
- Update[VERNIERS]=1;
- break;
- case Y_VERNIER_1:
- if(Key_Buffer==KEYCODE_RIGHT) Item=Y_VERNIER_2; //指向'垂直測量游標V2調整'模式
- if(Key_Buffer==KEYCODE_LEFT) Item=TRIG_LEVEL; //指向'觸發電平設定'模式
- if(Key_Buffer==KEYCODE_MANU){
- Hide_v1=1-Hide_v1; //(顯示/消隱)垂直測量游標V1。
- Erase_Vi(v1);
- }
- if((Key_Buffer==KEYCODE_UP)&&(v1<MAX_Y)){
- Erase_Dot_vi(v1);
- Erase_Vi(v1);
- v1++; //垂直測量游標V2上移
- }
- if((Key_Buffer==KEYCODE_DOWN)&&(v1>MIN_Y+1)){
- Erase_Dot_vi(v1);
- Erase_Vi(v1);
- v1--; //垂直測量游標V2下移
- }
- Update[VERNIERS]=1;
- break;
- case TRIG_LEVEL:
- if(Key_Buffer==KEYCODE_RIGHT) Item=Y_VERNIER_1;
- if(Key_Buffer==KEYCODE_LEFT) Item=SYNC_MODE;
- if(Key_Buffer==KEYCODE_MANU) Hide_vt=1-Hide_vt; //(顯示/消隱)觸發電平基線
- if((Key_Buffer==KEYCODE_UP)&&(vt<(MAX_Y-Item_Index[TRIG_SENSITIVITY]))){
- Erase_Dot_vt();
- Erase_Vn(vt);
- vt++; //觸發電平游標Vt上移
- }
- if((Key_Buffer==KEYCODE_DOWN)&&(v1>(MIN_Y+5+Item_Index[TRIG_SENSITIVITY]))){
- Erase_Dot_vt();
- Erase_Vn(vt);
- vt--; //觸發電平游標Vt下移
- }
- break;
- }
- Key_Buffer=0;
- }
- }
-
- }
- /*******************************************************************************
- * Function Name : fputc
- * Description : 重定義C語言的fprint函數
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- int fputc(int ch,FILE *f)
- {
- /* Write a character to the USART */
- USART_SendData(USART1, (unsigned char) ch);
- /* Loop until the end of transmission */
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
-
- return ch;
- }
- /******************* (C) COPYRIGHT 2012 DQ.elc *****END OF FILE****/
復制代碼
|
|