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

📄 mcu2.c~

📁 用atmega128单片机做的示波器
💻 C~
📖 第 1 页 / 共 2 页
字号:
#include<mega32.h>
#include<delay.h> //头文件
#include<stdio.h>  
#include<math.h>
#define uchar unsigned char 
#define uint unsigned int
#define lcd_bus PORTD
#define LCD_BL  PORTC.0
#define _WR  PORTC.1
#define _RD  PORTC.2
#define _CS  PORTC.3
#define RS  PORTC.4
#define _RST  PORTC.5 //端口设置 
#define  FIFO_R PORTB.2
#define  RES_FIFO PORTB.1
#define  EN_FIFO PORTB.0 
#define  Data_FIFO PINA
//----------------------------   
unsigned char lcd_buffer[240],cdd[242],add[500]; 
unsigned char e,qqq,trigs[16]={0x00,0x00,0x0E,0x08,0x08,0x08,0x1C,0x2A,0x08,0x08,0x08,0x08,0x08,0x78,0x00,0x00}; 
unsigned char trigs2[16]={0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x2A,0x1C,0x08,0x08,0x08,0x08,0x0E,0x00,0x00};
unsigned int c,ee; 
unsigned char i[9],j,eep,tri,hold,holdb,biao,zhi;
unsigned long m,freq;
//----------------------------
//写入寄存器地址或参数
//----------------------------
interrupt[SPI_STC] void spi_isr(void)
{

 if(j!=9)
 {
 i[j]=SPDR;
 j++;
 }
}

void SdCmd(uchar command)
{
lcd_bus = command;
_CS = 0;
RS = 0;
_WR = 0;
_WR = 1;
RS = 1;
_CS = 1;
}
//----------------------------
//写入数据
//----------------------------
void SdData(uchar ddata)
{
lcd_bus = ddata;
_CS = 0;
RS = 1;
_WR = 0;
_WR = 1;
RS = 0;
_CS = 1;
}
//----------------------------
//显示文本
//----------------------------
void ShowText(uchar *text)
{
while(*text>0)
{
SdData(*text);
text++;
delay_us(150);
}
} 
//----------------------------
//初始化
//----------------------------
void Init()
{
_RST = 0;
delay_ms(600);
_RST = 1;
delay_ms(100);
SdCmd(0x00);SdCmd(0xc5); //设置WLCR 寄存器
SdCmd(0x11);SdCmd(0x00); //设置DWLR 寄存器
SdCmd(0x81);SdCmd(0x40); //设置FRCA 寄存器
SdCmd(0xf0);SdCmd(0b10100000); //设置FNCR 寄存器
SdCmd(0x01);SdCmd(0xf0); //设置MISC 寄存
SdCmd(0x90);SdCmd(0x04); //设置SCCR 寄存器
SdCmd(0x20);SdCmd(0x27); //设置工作视窗
SdCmd(0x30);SdCmd(0xef);
SdCmd(0x40);SdCmd(0x00);
SdCmd(0x50);SdCmd(0x00);
SdCmd(0x21);SdCmd(0x27); //设置显示视窗
SdCmd(0x31);SdCmd(0xef);
SdCmd(0x41);SdCmd(0x00);
SdCmd(0x51);SdCmd(0x00);
SdCmd(0x10);SdCmd(0b00100000);
}
//----------------------------
//清屏
//----------------------------
void CleanScreen()
    {
       uchar i,j;
       for(i=0;i<40;i++)
          {
             for(j=0;j<240;j++)
                { 
                SdCmd(0x60);SdCmd(i);
                SdCmd(0x70);SdCmd(j);
                SdData(0x00);
                }
          }
    }

void line()
{
unsigned char i,k;
   
for(i=0;i<240;i++)
{
SdCmd(0x60);SdCmd(0);
SdCmd(0x70);SdCmd(i); 
SdData(0x80); 
}
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(3);
SdCmd(0x70);SdCmd(i); 
SdData(0x02); 
}
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(7);
SdCmd(0x70);SdCmd(i); 
SdData(0x08); 
}
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(11);
SdCmd(0x70);SdCmd(i); 
SdData(0x20); 
} 
for(i=0;i<240;i++)
{
SdCmd(0x60);SdCmd(15);
SdCmd(0x70);SdCmd(i); 
SdData(0x80); 
} 
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(18);
SdCmd(0x70);SdCmd(i); 
SdData(0x02); 
}
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(22);
SdCmd(0x70);SdCmd(i); 
SdData(0x08); 
}
for(i=0;i<240;i+=2)
{
SdCmd(0x60);SdCmd(26);
SdCmd(0x70);SdCmd(i); 
SdData(0x20); 
}
for(i=0;i<240;i++)
{
SdCmd(0x60);SdCmd(30);
SdCmd(0x70);SdCmd(i); 
SdData(0x80); 
}

for(k=0;k<240;k+=30)
    {
     for(i=0;i<30;i++)
         {
           SdCmd(0x60);SdCmd(i);
           SdCmd(0x70);SdCmd(k);
           if(k==0||k==120)
              { 
                SdData(0xff); 
              }
           else
              {
                SdData(0xaa);
              }
          }
     }
for(i=0;i<30;i++)
     {
        SdCmd(0x60);SdCmd(i);
        SdCmd(0x70);SdCmd(239); 
        SdData(0xff); 
        }
     } 

void disp_volt()
{
SdCmd(0x00);SdCmd(0xcd); //设置WLCR 寄存器 
SdCmd(0xf1);SdCmd(0x1f); //字型水平、垂直方向各放大2 倍 
SdCmd(0x60);SdCmd(30);
SdCmd(0x70);SdCmd(50);
c=c*0.667;
                               switch(biao)//计算键值
				    {
					case 0:c=c*25;break;
					case 1:c=c*10;break;
					case 2:c=c*5;break;
					case 3:c=c*2.5;break;
					case 4:;break;
					case 5:c=c*0.5;break;
					case 6:c=c*0.25;break;
					case 7:c=c*0.1;break;
					case 8:c=c*0.05;break;
					default:break;
				    }
sprintf(lcd_buffer,"%3d.%02dVpp",c/100,c%100); 
ShowText(lcd_buffer); 
SdCmd(0xf1);SdCmd(0x0f); //字型水平、垂直方向各放大2 倍 
SdCmd(0x00);SdCmd(0xc5); //设置WLCR 寄存器  
} 

void trig()
{   
   unsigned char i; 
   SdCmd(0x10);SdCmd(0x59);  //字体反显示
    for(i=0;i<16;i++)
    {
    SdCmd(0x60);SdCmd(33);
    SdCmd(0x70);SdCmd(180+i);
    if(tri==0)
    {
    SdData(trigs[i]);
    }
    else
    {
    SdData(trigs2[i]);    
    }
    }
 SdCmd(0x10);SdCmd(0x79); 
}
void can()
 {
 SdCmd(0x00);SdCmd(0xcd); //设置WLCR 寄存器 
SdCmd(0x60);SdCmd(33); 
SdCmd(0x70);SdCmd(150);
SdCmd(0x10);SdCmd(0x59);  //字体反显示
sprintf(lcd_buffer," HOLD "); 
ShowText(lcd_buffer); 
SdCmd(0x10);SdCmd(0x79);
SdCmd(0x60);SdCmd(32); 
SdCmd(0x70);SdCmd(200);
SdCmd(0xf1);SdCmd(0x1f); //字型水平、垂直方向各放大2 倍 
sprintf(lcd_buffer,"Agilent"); 
ShowText(lcd_buffer);
SdCmd(0xf1);SdCmd(0x0f); //字型水平、垂直方向各放大2 倍 
SdCmd(0x00);SdCmd(0xc5); //设置WLCR 寄存器 
 }
void clr_hold()
{
 SdCmd(0x00);SdCmd(0xcd); //设置WLCR 寄存器 
SdCmd(0x60);SdCmd(33); 
SdCmd(0x70);SdCmd(150);
SdCmd(0x10);SdCmd(0x69);  //字体反显示
sprintf(lcd_buffer,"      "); 
ShowText(lcd_buffer); 
SdCmd(0x10);SdCmd(0x79);
SdCmd(0x60);SdCmd(31); 
SdCmd(0x70);SdCmd(200);
SdCmd(0xf1);SdCmd(0x1f); //字型水平、垂直方向各放大2 倍 
sprintf(lcd_buffer,"By Weikun"); 
ShowText(lcd_buffer);
SdCmd(0xf1);SdCmd(0x0f); //字型水平、垂直方向各放大2 倍 
SdCmd(0x00);SdCmd(0xc5); //设置WLCR 寄存器
}

void display()
{
 unsigned int i,j,k,q=0;
 unsigned char m,h,a,b=127;   
     EN_FIFO=0;     
read:    
for(i=0;i<500;i++)   //从FIFO存储器中读500个数据
{
 FIFO_R=0;
add[i]=FIFO_bus;
FIFO_R=1;
}
while(!(add[q]<=128&&add[q+1]>=128))   //满足幅度为m且为上升沿则触发
 {
 q+=1;
 if(q>=260)      //若存储数据不足则重新读数据
goto read;
 }

    RES_FIFO=0;
    delay_us(5);
    RES_FIFO=1;           
    EN_FIFO=1;             
 
                   
 
 
 
            for(i=0;i<240;i++)      //取数据中的最大值与最小值
                    { 
                        if(add[q+i]>a)
                             {
                               a=add[q+i];
                             }
                         else if(add[q+i]<b)
                               {
                                 b=add[q+i];
                               }
                    }          //取得最大值存于a中,最小值存于b中    
    c=a-b;       //取差值存入c中
    if(e>10)      //避免频繁换数据
         {
        disp_volt();
        e=0;
         }
         e++;            
 if(qqq==1)
         {
                             for(i=0;i<121;i++)
                                   { 
                                      cdd[i*2]=add[i+q];
                                      cdd[i*2+1]=add[i+q]/2+add[i+q+1]/2;
                                   }   
                          for(j=0;j<30;j++)
                                 {
                                       m=128;
                                       for(i=j*8;i<(j+1)*8;i++)
                                             {
                                                 k=cdd[i]; 
                                                 lcd_buffer[k]=(lcd_buffer[k]|m); 
                                                 lcd_buffer[k+1]=(lcd_buffer[k+1]|m);
                                                 if(cdd[i]<cdd[i+1])
                                                        {
                                                             for(k=cdd[i];k<cdd[i+1];k++)
                                                                   {
                                                                       lcd_buffer[k]=(lcd_buffer[k]|m);
                                                                    } 
                                                         }
                                               else
                                                         {
                                                              for(k=cdd[i];k>cdd[i+1];k--)
                                                                    {
                                                                        lcd_buffer[k]=(lcd_buffer[k]|m);
                                                                     }                   
                                                         }      
                                                   m>>=1;
                                               }  
                                       for(h=0;h<240;h++)

⌨️ 快捷键说明

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