⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 NIOS II 的几个源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <sys/unistd.h>
#include <math.h>
#include <string.h>

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "mydata.h"
#include "draw.h"
#include "main.h"
/*************************************************/
//alt_u8 Logo_Txt1 = {"【R&C】"};
//alt_u8 Logo_Txt2 = {"百  科  融  创"};
//alt_u8 Logo_Txt3 = {"-简易数字示波器-"};
alt_u16 OldWaveDat[WAVE_DOTS];    //示波器参考格子    
alt_u16 WaveDatBuff[WAVE_DOTS]; //波形缓冲区
alt_u16 SampleTable[SAMPLE_RATES] = {3,    6,    15,   
									                   30,   60,   150,
									                   300,  600,  1500,
									                   3000, 6000, 15000, 30000};
alt_u32 Freq_Table[TRIGER_LEVELS] = { 200000, 100000, 40000, 
                                      20000,  10000,  4000,
                                      2000,   1000,   400,
                                      200,    100,    40,    20 };

alt_u8 TrigerTable[TRIGER_LEVELS] = { 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 
									                    0x78, 
                                      0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0 };
alt_u16 TrigerSignYp[TRIGER_LEVELS] = { 304, 288, 272, 256, 240, 224, 208, 
                                        192, 
                                        176, 160, 144, 128, 112,  96, 80 };
alt_u8 TimeTxt[] = {"时间(水平):"};
alt_u8 VoltTxt[] = {"幅度(垂直):0.37伏/格"};
alt_u8 SampleContext[SAMPLE_RATES][10] = {"5us/格  ", "10us/格 ", "25us/格 ",
                                          "50us/格 ", "100us/格", "250us/格", 
                                          "500us/格", "1ms/格  ", "2.5ms/格",
                                          "5ms/格  ", "10ms/格 ", "25ms/格 ", "50ms/格 ",};
alt_u8 ButtonTxt[] = {"按键操作说明"};
alt_u8 Operate_Txt[][20] = { "S1->增加采样速率", "S5->减小采样速率", 
                             "S2->增加触发电平", "S6->减小触发电平",
                             "K1='1'->锁定波形", "K1='0'->实时采样"};
                              
alt_u8 Param_Txt[] = { "频率:                  峰峰值:"};

alt_u8 WaveTxt[][25] = {      "    如果采用实验箱上",
                              "的模拟信号源,请将高",
                              "速ADC&DAC模块的跳线",
                              "放至“内”端;如果要",
                              "使用外部信号源,则放",
                              "至“外”段,然后从",
                              "ADC_IN输入信号,输入",
                              "信号的峰峰值度不能超",
                              "过2.5V。"};
/*************************************************/
alt_u8 myButton;
alt_u8 OldTriger_Level, Triger_Level;
alt_u8 Sample_Index;
alt_u8 KeyPressedFlag;
alt_u8 CalCount;
int main(void)
{
	alt_u16 i;

	printf("Exp23 - Simple Oscilloscope!\n");
	DrawFillRect(0, 0, 640, 480, COLOR_BLACK);
  DrawFillRect(WAVE_X - 16, WAVE_Y - 16, 432, 8, COLOR_YELLOW);
  DrawFillRect(WAVE_X - 16, WAVE_Y + 328, 432, 8, COLOR_YELLOW);
  DrawFillRect(WAVE_X - 17, WAVE_Y - 16, 8, 352, COLOR_YELLOW);
  DrawFillRect(WAVE_X + 408, WAVE_Y - 8, 8, 336, COLOR_YELLOW);
	Draw_Grid(WAVE_X, WAVE_Y);   //初始化并显示示波器参考格子
  //初始化示波器采样频率和触发电平
  Sample_Index = 5;
  OldTriger_Level = Triger_Level = 7;
  IOWR_ALTERA_AVALON_PIO_DATA(SAMPLE_RATE_BASE, SampleTable[Sample_Index]);
  IOWR_ALTERA_AVALON_PIO_DATA(TRIGER_LEVEL_BASE, TrigerTable[Triger_Level]);
  DisplayChar('>', WAVE_X - 8, TrigerSignYp[Triger_Level] - 8, COLOR_BLACK, COLOR_GREEN);
  DisplayAnyString(TimeTxt, TV_X, TV_Y, COLOR_BLACK, COLOR_YELLOW);
  DisplayAnyString(VoltTxt, TV_X + 200, TV_Y, COLOR_BLACK, COLOR_YELLOW);
  //显示操作说明
  DrawFillRect(HELP_X - 16, HELP_Y - 16, 160, 184, COLOR_PURPLE);
  DisplayAnyString(ButtonTxt, HELP_X + 16, HELP_Y, COLOR_PURPLE, COLOR_RED);
  for(i=0; i<6; i++)
    DisplayAnyString(Operate_Txt[i], HELP_X, HELP_Y + i*20 + 32, COLOR_PURPLE, COLOR_CYAN);

  //显示标题
  DrawFillRect(LOGO_X - 16, LOGO_Y - 16, 160, 104, COLOR_PURPLE);
  Display_Pic(LOGO_X, LOGO_Y, 128, 72, mLogo, COLOR_RED);

  //显示波形参数边框
  DrawFillRect(PARAM_X - 16, PARAM_Y - 16, 432, 64, COLOR_PURPLE);
  DisplayAnyString(Param_Txt, PARAM_X + 3, PARAM_Y + 8, COLOR_PURPLE, COLOR_CYAN);
  
  //其它说明
  for(i=0; i<9; i++)
    DisplayAnyString(WaveTxt[i], OTHER_X, OTHER_Y + i * 17, COLOR_BLACK, COLOR_YELLOW);

  for(i=0; i<GD_W; i++)
    OldWaveDat[i] = 0x80;

  while(1)
	{
    Read_Wave_Dat(WaveDatBuff);
    Display_Wave(WAVE_X, WAVE_Y, OldWaveDat, COLOR_BLACK);
    Draw_Grid(WAVE_X, WAVE_Y);   //初始化并显示示波器参考格子
   	Display_Wave(WAVE_X, WAVE_Y, WaveDatBuff, COLOR_RED);
    //计算波形参数
    CalCount = (CalCount + 1) % 10;
    if(CalCount == 0) //每秒钟计算一次
    {
      //----频率值
      Cal_Disp_Freq(WaveDatBuff);
      //----峰峰值
      Cal_Disp_Vpp(WaveDatBuff);
    } 
    //按键处理
    myButton = IORD_ALTERA_AVALON_PIO_DATA(EXT_BUTTON_BASE) & 0x0f;
    if(myButton != 0x0f)
    {
      if(!KeyPressedFlag)
      {
        KeyPressedFlag = true;
        OldTriger_Level = Triger_Level;
        switch(myButton)
        {
          case  0x0e: Sample_Index = (Sample_Index + SAMPLE_RATES - 1) % SAMPLE_RATES;
                      break;
          case  0x0d: Sample_Index = (Sample_Index + 1) % SAMPLE_RATES;
                      break;           
          case  0x0b: Triger_Level = (Triger_Level + 1) % TRIGER_LEVELS;
                      break;
          case  0x07: Triger_Level = (Triger_Level + TRIGER_LEVELS - 1) % TRIGER_LEVELS;
                      break;
          default:    break; 
        }
        IOWR_ALTERA_AVALON_PIO_DATA(SAMPLE_RATE_BASE, SampleTable[Sample_Index]);
        IOWR_ALTERA_AVALON_PIO_DATA(TRIGER_LEVEL_BASE, TrigerTable[Triger_Level]);
        //显示触发电平指示
        DisplayChar(' ', WAVE_X - 8, TrigerSignYp[OldTriger_Level] - 8, COLOR_BLACK, COLOR_BLACK);
        DisplayChar('>', WAVE_X - 8, TrigerSignYp[Triger_Level] - 8, COLOR_BLACK, COLOR_GREEN);
      }
    }
    else
      KeyPressedFlag = false;
    //显示当前时间轴信息
    DisplayAnyString(SampleContext[Sample_Index], TV_X + 88, TV_Y, COLOR_BLACK, COLOR_YELLOW);
    usleep(50000);
	}
	
	return 0;
}

/*********************************************/
void Display_Pic(alt_u16 x, alt_u8 y, alt_16 w, alt_u16 h, alt_u8 *bmp, alt_u16 color) //显示图片
{
  alt_u16 i, j;
  alt_u8 dot;
  for(j=0; j<h; j++)
  {
      for(i=0; i<w; i++)
      {
        if(i%8 == 0)
          dot = *bmp++;
        if(dot & 0x80)
           Draw_Pixel(x+i, y+j, color);
        dot <<= 1;
      }
  }
}
/*******************************************************/
void Draw_Grid(alt_u16 xp, alt_u16 yp)   //初始化并显示示波器参考格子
{
	alt_u16 i, j;
  alt_u16 grid_color = COLOR_GREEN;
	//初始化格子:320*400
  //边框
  DrawLine(WAVE_X, WAVE_Y, WAVE_X+GD_W, WAVE_Y, grid_color);
  DrawLine(WAVE_X, WAVE_Y+GD_H, WAVE_X+GD_W, WAVE_Y+GD_H, grid_color);
  DrawLine(WAVE_X, WAVE_Y, WAVE_X, WAVE_Y+GD_H, grid_color);
  DrawLine(WAVE_X+GD_W, WAVE_Y, WAVE_X+GD_W, WAVE_Y+GD_H, grid_color);
  //内部虚线
  for(j=0; j<GD_H; j+=40)
    for(i=0; i<GD_W; i+=8)
      Draw_Pixel(xp+i, yp+j, grid_color);
  //内部虚线
  for(j=0; j<GD_H; j+=8)
    for(i=0; i<GD_W; i+=40)
      Draw_Pixel(xp+i, yp+j, grid_color);
  //加粗中心线
  for(i=0; i<GD_W; i+=8)
  {
    Draw_Pixel(xp+i, yp+GD_H/2-1, grid_color);
    Draw_Pixel(xp+i, yp+GD_H/2+1, grid_color);
  }
  for(i=0; i<GD_W; i+=4)
      Draw_Pixel(xp+i, yp+GD_H/2, grid_color);
  for(i=0; i<GD_H; i+=8)
  {
    Draw_Pixel(xp+GD_W/2-1, yp+i, grid_color);
    Draw_Pixel(xp+GD_W/2+1, yp+i, grid_color);
  }
  for(i=0; i<GD_H; i+=4)
      Draw_Pixel(xp+GD_W/2, yp+i, grid_color);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -