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

📄 逻辑分析仪.c

📁 这是本人参加电子设计竞赛过程中编写的几个单片机程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*********************************************************/
/**                逻辑分析仪                 **
*********************************************************/

#include <absacc.h>
#include <reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define LED1 XBYTE [0xA000]   //数码管地址
#define LED2 XBYTE [0xA001]
#define LED3 XBYTE [0xA002]
#define LED4 XBYTE [0xA003]
#define LED5 XBYTE [0xA004]
#define LED6 XBYTE [0xA005]
#define LED7 XBYTE [0xA006]
#define LED8 XBYTE [0xA007]

#define KEY XBYTE [0xA100]  //键盘地址

#define lcdDl XBYTE [0xA201] //左半边液晶数据地址
#define lcdDr XBYTE [0xA301] //右半边液晶数据地址
#define lcdlCommand XBYTE [0xA200]//左半边液晶命令地址
#define lcdrCommand XBYTE [0xA300]//右半边液晶命令地址

#define fpga XBYTE[0xC800]
#define libleng 0x5F   //字模库容量

/*液晶显示使用的常量*/
#define strat_yaddr 0x40
#define strat_xaddr 0xb8
#define strat_dispaddr 0xc0

xdata uchar RAM[32768] _at_ 0x0000;//外部RAM地址

/*扫描键盘使用的变量 */
sbit first_row = P1^4;      //键盘第一行控制
sbit second_row = P1^3;     //键盘第二行控制
sbit sel1=P1^0;
sbit sel2=P1^1;
bit first_getkey = 0,control_readkey = 0;  //读键盘过程中的标志位
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0,enable_readkey=0,tuichu=0;  //防止按键冲突标志位,tong[8],chufazi[3][8]
uchar keynum = 0;  //获得的有效按键值寄存器 

/*读写flash使用的变量*/
sbit scl = P1^0; //24C16 scl
sbit sda = P1^1; //24c16 sdl

/*数码管显示使用的变量和常量*/
uchar lednum = 0;  //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0};  //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表
                      // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black" 
uchar code zhu1[224];
uchar code zhu2[224];
uchar code zhu3[224];
uchar code zhu4[160];
uchar code yuzhizifu[224];
uchar code menxianzifu[224];
uchar code jishuzifu[256];
uchar code tongdaozifu[256];
uchar code dancizhengchang[256];
uchar code chufadianzifu[192];
uchar code shijianxian[256];
uchar code fanye[224];
uchar code fanhui[96];
uchar code cunchu[160];
uchar code huifang[192];
uchar code ASCII[libleng][8];
//uchar code shezhishijian[128];
uchar code hehe[11] = "0123456789.";
uchar xinhao=0,menxian=1,jishu=1,chufazi[3],tongchu,chufadian=20;
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void  delay(uchar time_nop);

// 功能函数
void start_show();
void func1();
void func2();
void func3();
void func4();
void func1_shuru();
void showdata(float shu);


/**********************************
  液晶驱动函数
***********************************/
void lcdlon_off(uchar D);
void setlstartx(uchar D);
void setlstarty(uchar D);
void setlstartline(uchar D);
void lcdron_off(uchar D);
void setrstartx(uchar D);
void setrstarty(uchar D);
void setrstartline(uchar D);
void lcdlwrite(uchar D);
void lcdrwrite(uchar D);
void initial_lcd(void);
void clear_lcd(void);
//写入液晶函数
void  show_hanzi_string(uchar word_data[],uchar  hang,uchar lie,uchar word_len);
void write_char (uchar datan,uchar  hang,uchar  lie );
void write_str_noclear (uchar worddata[],uchar  hang,uchar  lie ,uchar  len);        //对LCD进行字符串写入 
void  hanzi_lcd(uchar word_data[32], uchar index );
void jianpan(void);
void intT0() interrupt 1 //T0 定时中断处理函数
{
	TH0 = -2720/256;  //定时器中断时间间隔 4ms
 	TL0 = -2720%256;

 	leddisp();  //每次定时中断显示更新一次
    if(enable_readkey==1)
    {
 	    if(control_readkey == 1)  //每两次定时中断扫描一次键盘
   	    {
    	    readkey();
   	    }
 	    control_readkey = !control_readkey;
        /*if(getkey==1)
        {
            enable_readkey=0;
        }*/
    }
}


void main(void)
{

	TMOD = 0x01;    
 	TH0 = -2720/256;  //定时器中断时间间隔 4ms
 	TL0 = -2720%256;
	TCON = 0x10;
 	ET0 = 1;
    EA = 1;
	initial_lcd();//初始化液晶
    while(1)
    {
	   //恢复断电前设置?y恢复数据,n继续执行
       start_show();//开始界面
    }
}

void start_show()
{
       show_hanzi_string(zhu1,1,1,7);//具体值待修改
       show_hanzi_string(zhu2,2,1,7);
       show_hanzi_string(zhu3,3,1,7);
       show_hanzi_string(zhu4,4,1,5);
	//"1 抽样参数设置"2 触发参数设置 3显示参数设置 4 存储与回放
    jianpan();
	switch(keynum)
	{
	    case 1:func1();break;
		case 2:func2();break;
		case 3:func3();break;
		case 4:func4();break;
		default:break;
	}
}

void func1()
{
    //抽样频率:原始100hz//暂时不做,没意义
	//门限电压:0.25-4v按十六级变化,加减实现
	//信号预置值 8位 return
	//每次输入前是否要清屏
	   uchar i;
	   sel1=0;sel2=0;
	   //fpga=255;
	  //for(i=0;i<255;i++)
	  //{
		//_nop_();	
	  //}
       clear_lcd();
       show_hanzi_string(yuzhizifu,1,1,7);//请输入信号预置值,八位
	   //write_char (hehe[1],4,i+4);
	   
	   do
	   {
	       func1_shuru();
           jianpan();
	   }while(keynum!=16);//当按下最后一个键时表示确认,否则重新输入
       fpga=xinhao;
       //for(i=0;i<8;i++)
      show_hanzi_string(menxianzifu,3,1,7);//请输入门限电压,缺省值为0.25,按加减键实现加减
	   showdata(menxian*0.25);//门限初始值1*0.25
	   do
	   {
           jianpan();
		   if(keynum==14)
		   menxian-=1;
		   else if(keynum==15)
		   menxian+=1;
	       showdata(menxian*0.25);//按十四五键实现加减,十六键确认退出
       }while(keynum!=16);
       //给fpga串数据
	   //先传门限值,1-16代表0.25到4伏
	   //再传数字信号预置值
       delay(100);fpga=menxian;//fpga=256;//fpga=255;;
}

void showdata(float shu)
{      long shuu=shu*100;
       write_char(hehe[shuu/100],8,3);//
       write_char(hehe[10],8,4);
	   shuu=shuu%100;
       write_char(hehe[shuu/10],8,5);
	   shuu=shuu%10;
	   write_char(hehe[shuu],8,6);
}
void func1_shuru()
{
    uchar i;
    xinhao=0;
    for(i=1;i<=8;i++)
	{
	      do
		  {
          jianpan();
		  }while(keynum!=1&&keynum!=10);
		  if(keynum==1)
          {xinhao=xinhao*2+1;write_char (hehe[1],4,i+4);}//输入信号预置值
		  else// if(keynum==10)
		  {xinhao=xinhao*2;write_char (hehe[0],4,i+4);}//输入信号预置值
		  //else
		  //i--;//不知行得通否
	      
	}
}

void func2()//需改进,单次触发正常触发,单次触发时要用按键控制触发
{
    //触发级数选择
	//********选择0 1为有效值其他表示在此通道不设置显示为*
	//如果为二级或三级则有三行
	//返回?如果不返回,则进入触发级数设置,以上在同一界面
	   uchar tongdao,j=1,h=4,i;
	   chufazi[3]=0;//三级触发字
	   tongchu=0;//表示触发通道
	   //bit tong[8]={0,0,0,0,0,0,0,0};
       clear_lcd();
       show_hanzi_string(jishuzifu,1,1,8);//触发级数选择1-3
	   do
	   {
	      do
	      {
             jianpan();
	      }while(keynum>3&&keynum!=16);
		  if(keynum==16)
		      tuichu=1;
		  else
		  {
	      jishu=keynum;//触发级数
	      write_char (hehe[jishu],4,8);//输出级数
		  }
	   }while(tuichu==0);tuichu=0;//按确定才能返回
	   clear_lcd();
       do
	   {
         show_hanzi_string(tongdaozifu,1,1,8);//选择通道和触发字 1-8,确认键返回
         do
         {
             jianpan();
         }while(keynum>8&&keynum!=16);//按确认键退出
	     if(keynum!=16)
	     {
		     if(j>=16)
			    {j=1,h++;}
	         tongdao=keynum;//注意数组从零开始tong[tongdao-1]=1;
	         write_char (hehe[tongdao],h,j);//输出输入的通道值
			 j++;//j初始值为零
			 tongchu+=2^(tongdao-1);
             for(i=0;i<jishu;i++)
			 {
	         do
             {
               jianpan();
             }while(keynum!=1&&keynum!=10);//&&keynum!16
			 if(j>=16)
			    {j=1,h++;}
	          if(keynum==1)
	              {chufazi[i]+=2^(tongdao-1);	   write_char(hehe[1],h,++j);}//3*8数组,初始值置为-1,传的时候再识别
	          else
	              write_char(hehe[0],h,++j);
			  }
			  j++;
	     }
		 else
		      tuichu=1;//tuichu初始值0
	  }while(tuichu==0);tuichu=0;
	  clear_lcd();
       show_hanzi_string(dancizhengchang,1,1,8);// 1单次还是2正常触发
	   do
	   {
       do
       {
            jianpan();  
       }while(keynum>3);
       if(keynum==1)
       {
	      write_char (hehe[1],4,8);sel1=0;sel2=1;
	      fpga=jishu+4;fpga=jishu+4;fpga=tongchu;fpga=chufazi[0];fpga=chufazi[1];fpga=chufazi[2];
	      	        
	   }
	   else if(keynum==2)
	   {
	   	  write_char (hehe[2],4,8);sel1=0;sel2=1;
	      fpga=jishu;fpga=jishu;fpga=tongchu;fpga=chufazi[0];fpga=chufazi[1];fpga=chufazi[2];	        

	   }
	   else
	       tuichu=1;
	   }while(tuichu==0);tuichu=0;


	        
	       
	        
	        
           
          //给fpga传递参数

       

       
}


void func3()
{
    //显示参数设置
	//1 触发点设置;即选择触发点前多少为(一共二十位)
	//2-3 时间线左移,右移。按键控制
	//4-5 向前翻页,向后翻页
	//6 返回?
	   uchar yidong=0;
	   clear_lcd();

	   do
	   {
       show_hanzi_string(chufadianzifu,1,1,6);//
       show_hanzi_string(shijianxian,2,1,8);//
       show_hanzi_string(fanye,3,1,7);//
       show_hanzi_string(fanhui,4,1,3);//
	    do
        {
             jianpan();
        }while(keynum>6);
	    if(keynum==1)//缺省值为正中
	    {
		    clear_lcd();
            show_hanzi_string(chufadianzifu,1,1,8);;//输入触发点前点数
			do
			{
             jianpan();
			}while(keynum>9);
            chufadian=keynum;
	        write_char(hehe[chufadian],4,8);
			do
			{
             jianpan();
			}while(keynum>10&&keynum!=16);
			if(keynum<10)
   		       {
			   chufadian=chufadian*10+keynum;
			   write_char (hehe[keynum],4,9);
			   do
			   {
			       jianpan();
			   }while(keynum!=16);
			   }
		 }
		 else if(keynum==6)
		    tuichu=1;
		 else if(keynum==2)
		    yidong=8;
		 else if(keynum==3)
		    yidong=4;
		 else if(keynum==4)
		    yidong=2;
		 else
		    yidong=1;
		    
			sel1=1;sel2=0;fpga=chufadian;fpga=yidong; //给fpga串参数
		}while(tuichu==0);tuichu=0;

}



void func4()
{
    //1 存储当前波形,包括触发点
	//23回放以存储波形,可存储n个波形
	//6 返回
	   clear_lcd();
       show_hanzi_string(cunchu,1,1,5);//
       show_hanzi_string(huifang,2,1,6);//+-回放波形,按加减实现
	   show_hanzi_string(fanhui,3,1,3);
	   do
	   {
	      do
          {
             jianpan();
	      }while(keynum>4&&keynum!=6); 
          if(keynum==6)
		       tuichu=1;
		  else

⌨️ 快捷键说明

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