|
我先發(fā)一個mcd2系統(tǒng)提供的源程序,這個程序的目的是熟悉pic單片機的i/o口的讀寫操作。 //實驗目的:RA0-RA7,RB0-RB7口的流水燈,熟悉PIC16F628A的I/O口的操作 //RA5因為做編程電壓VPP和復位腳MCLR,所以不點亮該口的LED //硬件要求: //1)時鐘選擇OSCB跳到I/O //2)斷開j5/j6或者j7/j8 //3)撥碼開關S11、S13全部置ON //4)RA4需要加上拉電阻 #i nclude<pic.h> __CONFIG(0x3f38); //看門狗關,內部RC震蕩,RA6/RA7做I/O //----------------------------------- //延時函數(shù) void delay() { int i; //定義循環(huán)變量 for(i=5000;i>0;i--) //循環(huán)次數(shù)控制 { NOP(); //消耗一個指令周期的時間 NOP(); } } //---------------------------------- //初始化函數(shù) void init() { TRISA=0X00; //設置A口為輸出 TRISB=0X00; //設置B口為輸出 } //--------------------------------- //亮燈函數(shù) void led() { char i; //設置循環(huán)變量 while(1) { PORTA=1; //點亮RA0 delay(); delay(); delay(); PORTA=2; //點亮RA1 delay(); delay(); delay(); PORTA=4; //點亮RA2 delay(); delay(); delay(); PORTA=8; //點亮RA3 delay(); delay(); delay(); PORTA=0X40; //點亮RA6 for(i=2;i>0;i--) //循環(huán)兩次(RA6-RA7) { delay(); delay(); delay(); //調用3次延時函數(shù),確定流水燈閃爍的快慢 PORTA=PORTA<<1; //點亮下一位LED } PORTA=0; //清除A口所有顯示 PORTB=1; //點亮RB0 for(i=8;i>0;i--) //循環(huán)8次(RB0-RB7) { delay(); delay(); delay(); PORTB=PORTB<<1; } PORTB=0; //清除B口所有顯示 } } //--------------------------------------- //主函數(shù) void main() { init(); //調用初始化函數(shù) led(); //調用亮燈函數(shù) } 實驗完這個程序后,我覺得這樣寫這個程序太長了,決定自己動手diy一個實驗這個功能的程序。程序源碼如下: #i nclude <pic.h> bank3 unsigned char buff1[10]={0xff,0xbf,0x7f,0xfd,0xfb,0xf7,0xef,0xfe,0xdf,0x00}; unsigned int k; bank3 unsigned char *ptr1; bank3 unsigned char *ptr2; bank3 unsigned char *ptr3; //延時子程序 void DELAY() { for(k=6553; --k;) continue; } //主程序 main() { unsigned int i; unsigned int j; unsigned int a=9; TRISC=0x00; TRISB=0x00; TRISA=0x00; TRISD=0x00; PORTA=0x11; PORTB=0x11; PORTC=0x11; PORTC=0x11; for(i=0;i<10;i++) { ptr1=buff1; PORTD=buff1[i]; PORTB=buff1[i]; PORTC=buff1[i]; DELAY(); } } |