📄 逻辑分析仪.c
字号:
/*********************************************************/
/** 逻辑分析仪 **
*********************************************************/
#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 + -