www.pudn.com > stepper_motor_controller.rar > test.c


#include  
//*** 函数定义*** 
void long_delay(void); 							//长延时 
void short_delay(void); 						//短延时 
void delay10ms(unsigned char); 					//10MS延时 
void write7279(unsigned char, unsigned char);	//写HD7279 
unsigned char read7279(unsigned char);			//读HD7279 
void send_byte(unsigned char); 					//发送一个字节 
unsigned char receive_byte(void); 				//接收一个字节 
//*** I/O定义 *** 
unsigned char digit[5]; 
unsigned char key_number, j, k; 
unsigned int tmr; 
unsigned long wait_cnter; 
sbit cs=P1^4; 				// cs at P1.4 
sbit clk=P1^5;				// clk P1.5 
sbit dat=P1^2; 				// dat P1.2 
sbit key=P1^3; 				// key P1.3 
//****** HD7279A指令 ****** 
#define CMD_RESET 0xa4 
#define CMD_TEST 0xbf 
#define DECODE0 0x80 
#define DECODE1 0xc8 
#define CMD_READ 0x15 
#define UNDECODE 0x90 
#define RTL_CYCLE 0xa3 
#define RTR_CYCLE 0xa2 
#define RTL_UNCYL 0xa1 
#define RTR_UNCYL 0xa0 
#define ACTCTL 0x98 
#define SEGON 0xe0 
#define SEGOFF 0xc0 
#define BLINKCTL 0x88 
//*** 主程序 *** 
main(){ 
	while (1){ 
		for (tmr=0;tmr<0x2000;tmr++); 	//上电延时 
			send_byte(CMD_RESET); 		//复位HD7279A 
//****************************************** 
//			测试指令演示 
//****************************************** 
		send_byte(CMD_TEST); 		//发送测试指令 
		for (j=0;j<3;j++)			//延时3秒 
			delay10ms(100); 
		send_byte(CMD_RESET); 			//清除显示 
//********************************************** 
//			闪烁指令及键盘接口测试 
// 将用户按键的键码显示出来,如果10秒钟内无按键 
// 或按S0进入下一步演示 
//********************************************** 
		wait_cnter=0; 
		key_number=0xff; 
		write7279(BLINKCTL,0xfc);	//第1、2位设置为闪烁显示 
		write7279(UNDECODE,0X08); 	//在第1位显示下划线'_' 
		write7279(UNDECODE+1,0x08);	//在第2位显示下划线'_' 
		do{ 
			if (!key){				//如果有键按下 
				key_number=read7279(CMD_READ);		//读出按键 
				write7279(DECODE1+1,key_number/16);	//在第2位显示键码高8位 
				write7279(DECODE1,key_number&0x0f);	//在第1位显示键码低8位 
				while (!key); 		//等待按键释放 
				wait_cnter=0; 
				} 
			wait_cnter++; 
		} while (key_number!=0 && wait_cnter<0x30000); 
		//如果按键为'0'则进入下一步演示 
		write7279(BLINKCTL,0xff); 	//清除闪烁设置 
//****************************************** 
//			快速计数演示 
//****************************************** 
		for (j=0;j<5;j++){ 			// 计数初值为00000 
			digit[j]=0; 
			write7279(DECODE0+j,digit[j]); 
		} 
		while (digit[4]<2){ 		// 如果计数达到20000就停止 
			digit[0]++; 
			if (digit[0]>9){ 
				digit[0]=0; 
				digit[1]++; 
				if (digit[1]>9){ 
					digit[1]=0; 
					digit[2]++; 
					if (digit[2]>9){ 
						digit[2]=0; 
						digit[3]++; 
						if (digit[3]>9){ 
							digit[3]=0; 
							digit[4]++; 
							if (digit[4]>9) 
								digit[4]=0; 
						} 
					} 
				} 
			} 
			write7279(DECODE0,digit[0]); 
			if (digit[0]==0){ 
				write7279(DECODE0+1,digit[1]); 
				if (digit[1]==0){ 
					write7279(DECODE0+2,digit[2]); 
					if (digit[2]==0){ 
						write7279(DECODE0+3,digit[3]); 
						if (digit[3]==0) 
							write7279(DECODE0+4,digit[4]); 
					} 
				} 
			} 
		} 
		delay10ms(150); 
		send_byte(CMD_RESET); 		//清除显示 
//************************************************* 
//			下载数据但不译码指令测试 
//************************************************* 
		write7279(UNDECODE+7,0x49);	//在第8位按不译码方式显示'三' 
		delay10ms(80); 
//************************************************* 
//			循环左右移位测试 
// 上次显示内容右移三次,再左移三次		 
//************************************************* 
		for (j=0;j<23;j++){ 
			send_byte(RTR_CYCLE); 	//循环右移23次 
			delay10ms(12); 
		} 
		for (j=0;j<23;j++){ 
			send_byte(RTL_CYCLE); 	//循环左移23次 
			delay10ms(12); 
		} 
//********************************************* 
//			译码方式0及左移测试 
//********************************************* 
		for (j=0;j<16;j++){ 
			send_byte(RTL_UNCYL); 	//不循环左移 
			write7279(DECODE0,j);	//0方式译码,显示在第1位 
			delay10ms(50); 
		} 
		delay10ms(150); 
		send_byte(CMD_RESET);		//清除显示 
//********************************************* 
//			译码方式1及左移测试 
//********************************************* 
		for (j=0;j<16;j++){ 
			send_byte(RTR_UNCYL); 	//不循环右移 	 
			write7279(DECODE1+7,j);	//1方式译码,显示在第8位 
			delay10ms(50); 
		} 
		delay10ms(150); 
//********************************************* 
//			消隐指令测试 
//********************************************* 
		k=0xff; 
		for (j=0;j<6;j++){ 
			k=k/2; 
			write7279(ACTCTL,k);	//每隔一秒增加一个消隐位 
			delay10ms(100); 
		} 
		write7279(ACTCTL,0xff); 	//恢复8位显示 
		delay10ms(100); 
		send_byte(CMD_RESET); 		//清除显示 
//********************************************** 
//			段点亮指令和段关闭指令 
//********************************************** 
		for (j=0;j<64;j++){ 
			write7279(SEGON,j); // 64 
			write7279(SEGOFF,j-1); // 
			delay10ms(20); 
		} 
	} 
} 
//////////////////////////////////////////////// 
void write7279(unsigned char cmd, unsigned char dta){ 
	send_byte (cmd); 
	send_byte (dta); 
} 
unsigned char read7279(unsigned char command){ 
	send_byte(command); 
	return(receive_byte()); 
} 
void send_byte( unsigned char out_byte){ 
	unsigned char i; 
	cs=0; 
	long_delay(); 
	for (i=0;i<8;i++){ 
		if (out_byte&0x80) 
			dat=1; 
		else 
			dat=0; 
 
		clk=1; 
		short_delay(); 
		clk=0; 
		short_delay(); 
		out_byte=out_byte*2; 
	} 
	dat=0; 
} 
unsigned char receive_byte(void){ 
	unsigned char i, in_byte; 
	dat=1; // 
	long_delay(); 
	for (i=0;i<8;i++){ 
		clk=1; 
		short_delay(); 
		in_byte=in_byte*2; 
		if (dat) 
			in_byte=in_byte|0x01; 
		clk=0; 
		short_delay(); 
	} 
	dat=0; 
	return (in_byte); 
} 
void long_delay(void){ 
	unsigned char i; 
	for (i=0;i<0x30;i++); 
} 
void short_delay(void){ 
	unsigned char i; 
	for (i=0;i<8;i++); 
} 
// ********************* n*10ms ********************** 
void delay10ms(unsigned char time){ 
	unsigned char i; 
	unsigned int j; 
 
	for (i=0;i