我先發(fā)一個mcd2系統(tǒng)提供的源程序,這個程序的目的是熟悉pic單片機(jī)的i/o口的讀寫操作。 //實(shí)驗(yàn)?zāi)康模篟A0-RA7,RB0-RB7口的流水燈,熟悉PIC16F628A的I/O口的操作 //RA5因?yàn)樽鼍幊屉妷篤PP和復(fù)位腳MCLR,所以不點(diǎn)亮該口的LED //硬件要求: //1)時鐘選擇OSCB跳到I/O //2)斷開j5/j6或者j7/j8 //3)撥碼開關(guān)S11、S13全部置ON //4)RA4需要加上拉電阻 #i nclude<pic.h> __CONFIG(0x3f38); //看門狗關(guān),內(nèi)部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; //設(shè)置A口為輸出 TRISB=0X00; //設(shè)置B口為輸出 } //--------------------------------- //亮燈函數(shù) void led() { char i; //設(shè)置循環(huán)變量 while(1) { PORTA=1; //點(diǎn)亮RA0 delay(); delay(); delay(); PORTA=2; //點(diǎn)亮RA1 delay(); delay(); delay(); PORTA=4; //點(diǎn)亮RA2 delay(); delay(); delay(); PORTA=8; //點(diǎn)亮RA3 delay(); delay(); delay(); PORTA=0X40; //點(diǎn)亮RA6 for(i=2;i>0;i--) //循環(huán)兩次(RA6-RA7) { delay(); delay(); delay(); //調(diào)用3次延時函數(shù),確定流水燈閃爍的快慢 PORTA=PORTA<<1; //點(diǎn)亮下一位LED } PORTA=0; //清除A口所有顯示 PORTB=1; //點(diǎn)亮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(); //調(diào)用初始化函數(shù) led(); //調(diào)用亮燈函數(shù) } 實(shí)驗(yàn)完這個程序后,我覺得這樣寫這個程序太長了,決定自己動手diy一個實(shí)驗(yàn)這個功能的程序。程序源碼如下: #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(); } } |