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