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

📄 12232_demo.c

📁 这是一个试验箱检测系统的代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "reg52.h"
#include "intrins.h"
#include "absacc.h"

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

sbit LCD_CS=P1^0;		//RS
sbit LCD_SID=P1^1;		//RW
sbit LCD_CLK=P1^2;		//E
sbit Speak  =P1^3;		//扬声器发声
sbit Step_A =P1^4;		//步进电机连接
sbit Step_B =P1^5;
sbit Step_C =P1^6;
sbit Step_D =P1^7;
sbit ADC_EOC=P3^4;

/************************D/A,A/D转换模块************************/

uchar code tab_dac[];				//DAC0832正弦波

void  DA_test(void);				//向DAC0832写入数据
//bit  AD_test(void);				//向ADC0809写入数据
//void AD_OUT(void);
#define DA XBYTE[0xD000]	  //DAC0832片选信号0832CS接CS5
#define ADC_in0 XBYTE[0xC000]	  //DAC0809片选信号0809CS接CS4 INT0
//#define ADC_in1 XBYTE[0xC001]	  //DAC0809片选信号0809CS接CS4 INT1
//uchar xdata ADC_in0 		_at_ 0xC000;
void AD_test(void);				  //向ADC0809写入数据
/************************键盘模块******************************/

/*=========================      管脚定义      ==================*/

sbit key_dat = P2^0;			//串行数据传入74164,将串行数据转换为并行数据
sbit key_clk = P2^1;			//为74164提供时钟脉冲
sbit key_A = P2^2;				//A B C 接74138产生扫描码
sbit key_B = P2^3;
sbit key_C = P2^4;
sbit key_down1 = P2^5;			//判断键盘S1--S8是否有键按下;
sbit key_down2 = P2^6;			//判断键盘S9--S16是否有键按下;
void key_led(void);				//键盘显示
void Send_data(uchar Sdata);				//发送数据

/***********************点阵模块*******************************/
//16*16点阵显示程序:显示"南京邮电大学"
//行使用PNP-5401驱动,P1.0--1.7,P3.0-P3.7为行口,低电平选中, 用于选择地址
//P0.0-P0.7,P2.0-P2.7为列显示数据,低电平点亮

void demo(uchar *s1,uchar *s2);
uchar code NUPT1[];
uchar code NUPT2[];														                                                                             
/**********************蜂鸣器模块函数**************************/
void play(uchar del);//发声
void Play_dingdong(void);//发声叮咚
/*==============================================================*/
			/*液晶屏12864模块部分定义*/
/*==============================================================*/
/*======================液晶屏地址定义==========================*/

char xdata LCD_WCMDL 		_at_ 0xE400;
char xdata LCD_WCMDR 		_at_ 0xE800;
char xdata LCD_WDATL 		_at_ 0xE500;
char xdata LCD_WDATR 		_at_ 0xE900;
char xdata LCD_RdStatusL 	_at_ 0xE600;
char xdata LCD_RdStatusR 	_at_ 0xEA00;
char xdata LCD_Keydata   	_at_ 0xF000;
							
/***********常用操作命令和参数定义***************/
#define	 DISPON		0x3f	/*显示on		*/
#define	 DISPOFF	0x3e	/*显示off		*/
#define	 DISPFIRST	0xc0	/*显示起始行定义	*/
#define	 SETX		0x40	/*X定位设定指令(页)	*/
#define	 SETY		0xb8	/*Y定位设定指令(列)	*/
#define	 Lcdbusy	0x80	/*LCM忙判断位		*/

/**************显示分区边界位置*****************/
#define	LCMLIMIT	0x80	/*显示区的右边界	*/

/****************全局变量定义*******************/
uchar col,row,cbyte;		/*列x,行(页)y,输出数据	*/

/*****************函数列表**********************/
void Lcminit(void);		/*液晶模块初始化	*/
void WrdataL(uchar);		/*数据输出给LCM		*/
void WrdataR(uchar);		/*数据输出给LCM		*/
void Lcmcls( void );		/*LCM全屏幕清零(填充0)	*/
void LocatexyL(void);		/*光标定位		*/
void LocatexyR(void);		/*光标定位		*/
void WrcmdL(uchar);		/*左区命令输出		*/
void WrcmdR(uchar);		/*右区命令输出		*/
void Putpicture(unsigned char code*pC);
void Putdword(unsigned char code*pC,int i,int j);

/******************数组列表*********************/

/*ASCII常规字符点阵码表	*/
uchar code nan[];
uchar code jing[];
uchar code you[];
uchar code dian[];
uchar code da[];
uchar code xue[];
uchar code NUPT[];
/*================================================================*/ 
				/*12232主机部分定义*/
/*======================通用函数================================*/

void delay(uint ms);							//延时函数
void LCD_WriteCmd (uchar cmd); 					//写指令
void LCD_WriteDat (uchar dat);					//写数据
void LCD_init(void);		 				 	//液晶屏初始化
void LCD_WriteHanzi (uint *hanzi);			 	//写汉字
void LCD_WriteStr(uint *Str ,uchar num);	 	//写字串(中英)
uchar sys_state;									//全局变量
uchar key_state;									//全局变量


/*======================主函数==================================*/

void main(void)
{							  
	delay(400); 
	LCD_init();
	IT0=1;        						//INT0下降沿中断
	EX0=1;     							//允许INT1中断
	IT1=1;     							//INT1下降沿中断
	EX1=1;     							//允许INT1中断
	EA=1;								//允许中断
	sys_state=1;
	key_state=0; 					//无确认
	Speak=0;
	LCD_WriteCmd(0x01);					//清屏
	delay(10);
   	LCD_WriteCmd(0x80);   				//写入显示的地址
	LCD_WriteStr("南京邮电大学",6);		//南京邮电大学
	LCD_WriteCmd(0x90);	   				//自检系统
	LCD_WriteStr("自检系统",4);

}
/*==========================================================*/
/*==========================================================*/
					/*主机液晶屏函数*/
/*======================延时函数============================*/

void delay(uint ms)							//延时函数
{
	uchar ti;
	while(ms--)
	{
		for(ti=0;ti<115;ti++)
		{	}
	}	
}


/*=====================写指令函数=============================*/

void LCD_WriteCmd (uchar cmd) 				//写指令
{
	uchar i,tmp;
	bit data_tmp;
	LCD_CS=1;  LCD_SID=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_SID=0; LCD_CLK=1; LCD_CLK=0;
	LCD_SID=0; LCD_CLK=1; LCD_CLK=0; LCD_SID=0;
	LCD_CLK=1; LCD_CLK=0;
	tmp=cmd & 0xF0;
	for (i=0;i<8;i++)
	{
		data_tmp=tmp&0x80;
		LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
		tmp<<=1;	
	} 
	tmp=cmd<<4;
	for (i=0;i<8;i++)
	{
		data_tmp=tmp&0x80;
		LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
		tmp<<=1;	
	}
	LCD_CS=0; 
}

/*=======================写数据函数==============================*/

void LCD_WriteDat (uchar dat)					//写数据
{
	uchar i,tmp;
	bit data_tmp;
	LCD_CS=1;  LCD_SID=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
	LCD_CLK=0; LCD_SID=0; LCD_CLK=1; LCD_CLK=0;
	LCD_SID=1; LCD_CLK=1; LCD_CLK=0; LCD_SID=0;
	LCD_CLK=1; LCD_CLK=0;
	tmp=dat & 0xF0;
	for (i=0;i<8;i++)
	{
		data_tmp=tmp&0x80;
		LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
		tmp<<=1;	
	} 
	tmp=dat<<4;
	for (i=0;i<8;i++)
	{
		data_tmp=tmp&0x80;
		LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
		tmp<<=1;	
	}
	LCD_CS=0; 
}
/*=======================写汉字==============================*/
void LCD_WriteHanzi (uint *hanzi)	//写汉字
{
	uchar *data_tmp;
	data_tmp=hanzi;
	LCD_WriteDat (*data_tmp);					//写高位数据
	data_tmp++;
	LCD_WriteDat (*data_tmp);					//写低位数据


}

/*=======================写汉字串==============================*/
void LCD_WriteStr(uint *Str ,uchar num)	 //写字串(中英)
{
	uchar i;

	for(i=0;i<num;i++)
	{
		LCD_WriteHanzi(Str);
		Str++;
	}	
}
/*========================液晶屏初始化=================================*/

void LCD_init(void)		 						//液晶屏初始化
{
	delay(30);
	LCD_WriteCmd(0x30);

	LCD_WriteCmd(0x0c);							//必须是0x0c ,而不能是0x3c,资料存在错误
	LCD_WriteCmd(0x01);   						//清屏
	LCD_WriteCmd(0x06);							//写入后自动右移,0x07作用不明

}

/*===========================================================================*/
					/*12864液晶屏函数*/
/*============================================================================*/
void Putdword(unsigned char code*pC,int i,int j)
{
	uchar hanzi;
	int h=0;
	for(row=i;row<2+i;row++)
	{
		for(col=j;col<16+j;col++)
		{
		
			hanzi=pC[h];	
			switch (col&0x40)
			{
				case 0:WrdataL(hanzi);break;
				case 0x40:WrdataR(hanzi);break;
			}
			h++;			
		}

	}	
}

/**********************************************/
/*:     输出图片               */
/**********************************************/
void Putpicture(unsigned char code*pC)
{	
		int i=0;
		uchar picture;
		for(row=0;row<8;row++)
   		{
			for(col=0;col<LCMLIMIT;col++) 
			{
       			picture= pC[i];
				switch (col&0x40)
				{
					case 0:WrdataL(picture);break;
					case 0x40:WrdataR(picture);break;
				}
				i++;
			}

//		Delay(2);
		}

	}
/****************************************/
/*	清屏,全屏幕清零		*/
/****************************************/
void Lcmcls( void )
	{	
		for(row=0;row<8;row++)
   		{
			
			for(col=0;col<LCMLIMIT;col++) 
			{
       			switch (col&0x40)
				{
					case 0:WrdataL(0x0);break;
					case 0x40:WrdataR(0x0);break;
				}
			}

				
		}

	}
/****************************************/
/*	清屏,全屏幕清零		*/
/****************************************/
void Lcmcls( void )
	{	
		for(row=0;row<8;row++)
   		{
			
			for(col=0;col<LCMLIMIT;col++) 
			{
       			switch (col&0x40)
				{
					case 0:WrdataL(0x0);break;
					case 0x40:WrdataR(0x0);break;
				}
			}

				
		}

	}
/****************************************/
/*	数据写输出			*/
/****************************************/

void WrdataL(uchar X)
	{
		LocatexyL();		/*坐标定位,返回时保留分区状态不变	*/
		while(LCD_RdStatusL & Lcdbusy);
		LCD_WDATL=X;
//		Delay(1);	
	}
void WrdataR(uchar X)
	{
		LocatexyR();		/*坐标定位,返回时保留分区状态不变	*/
		while(LCD_RdStatusR & Lcdbusy);
		LCD_WDATR=X;
//		Delay(1);
	}	

/********************************/
/* 命令输出到左区控制口		*/
/********************************/

void WrcmdL(uchar X)
	{
		while(LCD_RdStatusL & Lcdbusy);
		LCD_WCMDL = X;/*命令输入到数据口 */	
//		Delay(2);
	}


/********************************/
/* 命令输出到右区控制口		*/
/********************************/

void WrcmdR(uchar X)
	{
		while(LCD_RdStatusR & Lcdbusy);

⌨️ 快捷键说明

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