//*************************************************//
// 12864LCD示波器演示程序
// STC12C5A16S2//12MHZ
//*************************************************//
//头文件
#include "STC12C5A16S2.H"
#include"intrins.h"
#include"math.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//========================
//****显示状态定义****
#define STA_Wave 0 //功能:显示波形
#define STA_Info 1 //功能:显示参数信息
#define STA_Logo 2 //功能:开机显示微标
//=========================
//****按键定义****
sbit key0 = P3^4; //功能:显示波形周期控制
sbit key1 = P3^5; //功能:显示波形周期控制
sbit key2 = P3^6; //功能:显示波形幅度控制
sbit key3 = P3^7; //功能:显示波形幅度控制
//
#define KEY0 0x0e //备用键接口值
#define KEY1 0x0d //备用键接口值
#define KEY2 0x0b //备用键接口值
#define KEY3 0x07 //备用键接口值
//
#define KEY0_S 0xe0 //KEY0键值
#define KEY1_S 0xd0 //KEY1键值
#define KEY2_S 0xb0 //KEY2键值
#define KEY3_S 0x70 //KEY3键值
#define KEY_NONE 0 //无按键
#define lcddata P2 //12864液晶数据口
sbit busy=lcddata^7; //12864液晶"忙"接口
//
uchar STATE =0; //功能判断(数据为0~2)
uchar MSG_KEY = KEY_NONE; //键值存放
uchar key_times = 0; //键扫描时间
uchar key_keep_times = 0; //按键按住时间
uchar key_done = 0; //按键事件有无做好标志
uchar read_key_times = 0; //扫描键盘时间
uchar draw_rigol = 0; //画时间
//
uchar data X_TIMES = 0;//X坐标
uchar data T_val=12; //波形采样周期控制初值
uchar data T_min=10; //波形采样周期控制最小值
uchar data T_max=150; //波形采样周期控制最大值
uchar data Margin=16; //显示波形幅度控制(范围1-16)
uint data ADC_RES_DATA=0;//十位AD数据存放
uint data con05s=0; //0.5秒计数器
long int data bo_delay = 0;//波形采集计时
uchar xdata LAST_Y[128]; //上次采集数据存放
uchar xdata NOW_Y[128]; //即时采集数据存放
bit data draw_bo_is_ok = 0; //画波形完成标志
//
//12864液晶显示控制口
sbit light=P1^4; //背光灯控制口
sbit rs=P1^5; //1表示数据, 0表示命令
sbit rw=P1^6; //1表示读, 0表赤写
sbit e=P1^7; //使能口,下降沿有效
//信息表
uchar code disdata1[15]={"单片机小示波器 "};//开机显示画面
uchar code disdata2[15]={"浙江海洋学院 "};//开机显示画面
//函数定义
void write_data(uchar dat_d);
void write_com(uchar dat_d);
void clrram_lcd (void);
void init_lcd(void);
void busy_lcd(void);
void rev_row_lcd(uchar row);
void rev_co_lcd(uchar row,uchar col,uchar mode);
void clr_lcd(void);
void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
void wr_row_lcd(uchar row,char *p);
//
//以下程序区
//
//************ 1/12毫秒延时程序 *************
delay1ms(uint t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<64;j++)
;
}
//
//**********液晶检测忙状态程序***************
//在写入之前必须执行
void busy_lcd(void)
{
lcddata=0xff;
rs=0;
rw=1;
e =1;
while(busy==1);
e =0;
}
/********** 向12232F写一个字节程序 ************/
void write_data(uchar dat_d)
{
//并口使用时
busy_lcd();
rs=1;
rw=0;
lcddata=dat_d;
e=1;
;
e=0;//
}
//
/********* 向12232F写一个命令字节程序 ***********/
void write_com(uchar com_d)
{
//并口使用时
busy_lcd();
rs=0;
rw=0;
lcddata=com_d;
e=1;
;
e=0;//
}
//
//**********12864LCD初始化程序**************
void setup()
{
write_com(0x0c); /*开显示,关游标*/
clrram_lcd();
delay1ms(480); // 延时40毫秒以上*/
}
//
//**********填充液晶DDRAM全为空格程序**********
void clrram_lcd (void)
{
write_com(0x30);
write_com(0x01);
}
//
//***********液晶写入函数***********
void _write(uchar _wz,uchar _len,uchar *_adr)
{
uchar m;
//q=_wz;
write_com(_wz); //写入字定位(起始位)
for (m=0; m<_len; m++) //
{write_data(*(_adr+m));}
}
//
//************指定要显示字符的坐标程序**************
void gotoxy(unsigned char y, unsigned char x)
{
if(y==1)
write_com(0x80|x);//wr_i_lcd(0x80|x);
if(y==2)
write_com(0x90|x);
if(y==3)
write_com((0x80|x)+8);
if(y==4)
write_com((0x90|x)+8);
}
//
//*************液晶显示字符串程序***************
void print(uchar *str)
{
while(*str!='\0')
{
//wr_d_lcd(*str);
write_data(*str);
str++;
}
}
//
//***************延时子程序*********************
void delay(unsigned int t)
{
unsigned int i,j ;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
//
//***************清整个GDRAM空间程序***************
void clrgdram()
{
unsigned char x,y ;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80);//行地址(Y坐标)
write_com(x+0x80); //列地址(X坐标)
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
//
//***************清屏幕程序******************
void clrscreen()
{
write_com(0x01);
delay(10);
}
//
//***************读12864字节程序******************
unsigned char ReadByte(void)
{
unsigned char byReturnValue ;
busy_lcd();
lcddata=0xff ;
rs=1 ;
rw=1 ;
e=1 ;
e=1 ;
byReturnValue=lcddata;
e=0 ;
return byReturnValue ;
}
//
//***************画点(波形)子程序**********************
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit ;
unsigned char ReadOldH,ReadOldL ;
write_com(0x34); //进入扩展指令
write_com(0x36); //打开绘图开关
Tier=X>>4 ;
Tier_bit=X&0x0f ;
if(Y<32)
{
Row=Y ; //在上二行屏的Y坐标
}
else
{
Row=Y-32 ; //在下二行屏的Y坐标
Tier+=8 ; //在下二行屏的X坐标修正(1\2行为80\90,3/4行为88\98)
}
write_com(Row+0x80);//写入Y坐标数据
write_com(Tier+0x80);//写入X坐标数据
ReadByte();
ReadOldH=ReadByte();//读入GDRAM数据
ReadOldL=ReadByte();//读入GDRAM数据
write_com(Row+0x80);//重新设定坐标Y
write_com(Tier+0x80);//重新设定坐标X
if(Tier_bit<8)
{
switch(Color) //左(高字节)8个点处理
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)));//填0
break ;
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit));//填1
break ;
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);//写回GDRAM
write_data(ReadOldL);//写回GDRAM
}
else
{
switch(Color) //右(低字节)8个点处理
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)));//填0
break ;
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit));//填1
break ;
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);//写回GDRAM
write_data(ReadOldL);//写回GDRAM
}
write_com(0x30);
}
//
//***************图片显示程序******************************
void v_Lcd12864DrawPicture_f( unsigned char code *pPicture )
{
unsigned char i, j, k ;
write_com( 0x34 ) ;
write_com( 0x36 ) ;
for( i = 0 ; i < 2 ; i++ )
{
for( j = 0 ; j < 32 ; j++ )
{
write_com( 0x80 + j ) ;
if( i == 0 )
{
write_com( 0x80 ) ;
}
else
{
write_com( 0x88 ) ;
}
for( k = 0 ; k < 16 ; k++ )
{
write_data( *pPicture++ ) ;
}
}
}
write_com( 0x30 ) ;
}
//
/*************STC12C5A16S ADC电源开程序*****************/
ADC_POW_ON()
{ADC_CONTR=ADC_CONTR|0Xe0; //电源开,ADC最快模式
delay1ms(12); //延时1毫秒以上
}
//
/*************STC12C5A16S ADC转换程序****************/
ADC_CHANG() //ADC转换
{
//delay1ms(1); //延时90微秒(通道转换后需稳定)
_nop_();_nop_(); //5微秒
ADC_RES=0X00;ADC_RESL=0X00;ADC_CON