|
最近想玩玩stm32的ad功能,看到网上ds0201的示波器是开源的!淘宝的店主也很热情,给了我1.1版的源代码
是IAR编译器
我把它移植到KEIL下,为了提高速度,我使用fsmc方式驱动lcd显示
现在还有点小问题,正在解决中。。(波形有点重叠)
资料下载:
stm32示波器.zip
(2.36 MB, 下载次数: 109)
ds0201.rar
(20.64 KB, 下载次数: 68)
主程序预览:
- /**************************************************************
- 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****/
复制代码
|
|