📄 main.c
字号:
#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 + -