#include "Mini51B.H" //所有与硬件相关的接口函数定义
#include "auto_isp.h" //自定义下载驱动
#include "key.h"
#include "lcd12864.h" //lcd12864驱动头文件
#include "bg.h" //示波器背景图
//接口定义
sbit SDO = P1^0;//数据输出口
sbit ADD = P1^1;//通道选择
sbit CS = P1^2;//启动
sbit CLK = P1^3;//时钟时序
sbit EOC = P1^4;//为高时轮换结束
extern void disp(unsigned char,unsigned char);
extern unsigned int get_data(unsigned char);
extern void delay(unsigned char);
unsigned char key_flag;
void main()
{
unsigned char i;
unsigned int xdata da_buff[112];
key_flag = 0x0;
auto_isp_init(); //auto isp初始化,占用定时器1
key_int_init(); //按键中断模式输入初始化
lcd12864_init();
lcd12864_put_xywhb(0,0,128,64,bg_pic); //写背景图
while(1)
{
delay(5); //同步条件不满足时循环采样必须延时满足AD转换完成
if(get_data(0)>500)//取ADC中点值同步
{
while(get_data(0)>500) delay(5);//同步条件不满足时循环采样必须延时满足AD转换完成
for(i=0;i<112;i++) da_buff[i]=get_data(0); //连续采样一帧数据,采集到的数据需要写入数据缓冲区,所占用时间刚好是AD转换所需时间
for(i=0;i<103;i++) disp(i,da_buff[i]/22); //10bit(0到1023)数据映射到LCD48个点,0到47,所以要除以22取整。
while(key_flag);//按键P3.2可以暂停一帧波形
}
}
}
//读ADDR中的数据
unsigned int get_data(unsigned char ADDR)
{
unsigned char i;
unsigned int temp=0;
ADDR <<= 4;//4有效地址左对齐
CLK = 0;
CS=1;
CS = 0;
delay(1);
for (i=0;i<10;i++)
{
temp <<= 1;
ADD=(bit)(ADDR&0X80);
CLK = 1;
SDO=1;
temp =temp^SDO;
CLK = 0;
ADDR <<= 1;
}
delay(1);
CS=1;
return(temp);
}
//LCD波形显示区
void disp(unsigned char x,unsigned char y)//x取值0到111共112点,y取值0到47共48点
{
unsigned char dat[6];
unsigned char j;
x+=9;
for(j=0;j<6;j++) dat[j] = 0x0;
//dat[3]=0x01;
dat[y/8] |= 0x01<<(y%8);
if(x<64) {
for(j=1;j<7;j++) {
lcd_cmd_wr(SETY+j,0);
lcd_cmd_wr(SETX+x,0);
lcd_data_wr(dat[j-1],0);
}
}
else {
x-=64;
for(j=1;j<7;j++) {
lcd_cmd_wr(SETY+j,1);
lcd_cmd_wr(SETX+x,1);
lcd_data_wr(dat[j-1],1);
}
}
}
void delay(unsigned char t)
{
while(t--);
//晶振22.1184M,12T模式运行,测试如下
//delay(1);//10.88us
//delay(2);//14us
//delay(5);//23.8us
//delay(10);//40us
//delay(20);//72.8us
//delay(50);//170us
//delay(100);//332us
//delay(200);//656us
//delay(250);//824us
}