『壹』 誰能幫我解釋一下這個avr單片機的程序
匯編指令SBI 0x18,7
相當於PORTB.7=1
匯編指令CBI 0x18,7
相當於PORTB.7=0
頭文件里應該有類似定義: .equ PORTB=0x18
0x10表示PIND,0x11表示DDRD,0x12表示PORTD,
0x13表示PINC,0x14表示DDRC,0x15表示PORTC,
0x16表示PINB,0x17表示DDRB,0x18表示PORTB,
0x19表示PINA,0x1A表示DDRA,0x1B表示PORTA。
AVR的IO有三個寄存器,DDRX,PORTX,PINX。
DDRX 方向,DDRX=1,輸出;DDRX=0,輸入。
PORTX 分兩種情況
如果DDR=1,即在輸出狀態的話,那麼通過設置PORTX的值改變IO埠的電平
如果DDR=0,即在輸入狀態的話,那麼PORT=1則使能上拉電阻,否則不使能。
PINX 此寄存器表示了該埠的實際電平,所以讀IO口的話,應該讀PINX,而不是PORTX。
這樣就好理解了吧???
你判斷的是按鍵按下的時間長度?
這個程序應該是這樣的,不知道我理解的對不對?
進入這個函數,如果沒按鍵按下,返回0,退出。
asm("CBI 0x11, 4"); //PORTD.4設置為輸入
key_value=0;
if((PIND&0x10)!=0&&(PIND&0x10)!=0)return 0;//如果PORTD.4(KEY1)=1,返回0。
如果有按鍵按下,執行下面的程序。
2個 while(delay) 延時,防抖動。
進入 while(1) 循環,我覺得最後一個 return 0; 應該是沒機會執行到的。
然後switch判斷status的值,剛開始是0.然後逐漸增加(每次延時40個delay),到16後,返回,退出。
當status==0時,判斷按鍵是否按下,如果按下,PORTB.7置0,key_value+=0x80(key_value的第7位置1)
status==1,延時40個delay後,PORTB.7置1(這個估計是指示燈)。
status==2,延時40個delay後,判斷按鍵是否按下,如果按下PORTB.7置0,key_value+=0x40(key_value的第6位置1)
status==1,延時40個delay後,PORTB.7置1。
就這樣重復,直到status==16,只是key_value置1的位置不同。
最後,到16時,判斷status的值,如果大於32,返回0,其他返回status的值。
『貳』 51單片機IO口能做實參傳遞嗎
可以的,但是一般性不這么用,不是所有的編譯器都支持sfr(本質是地址)的傳遞。
你可以使用這樣的東西:(這是我寫的AVR類庫)
voidSETB(PORTport,unsignedcharbit);//其他的源代碼舉一反三吧
記得定義:
#definePORTenumPORT
//方便輸入
#definesetbSETB
#defineclrbCLRB
#definegetbGETB
PORT{
PA,
PB,
PC,
PD
};
Port和bit的本質都是寄存器,一個是byte定址一個是bit定址而已,千萬不要以為bit定址就一定快,往往是byte要快一些。
附上源代碼:
gpio.h
#ifndefAVR_GPIO_H
#defineAVR_GPIO_H
#definePORTenumPORT
//方便輸入
#definesetbSETB
#defineclrbCLRB
#definegetbGETB
PORT{
//PA,
PB,
PC,
PD
};
externvoidSETB(PORTport,unsignedcharbit);
//相應埠置1,並設置為輸出
externvoidCLRB(PORTport,unsignedcharbit);
//相應埠置0,並設置為輸出
externunsignedcharGETB(PORTport,unsignedcharbit);
//相應埠設置為輸入並讀取,返回0xff(1)與0x00(0),異常返回0xf0
externvoidSETD(PORTport,unsignedcharbit);
//相應埠設置為輸出
externvoidCLRD(PORTport,unsignedcharbit);
//相應埠設置為輸入
#endif
gpio.c
#include"inc.h"
voidSETB(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(1<<bit);
//PORTA|=(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
PORTB|=(1<<bit);
break;
casePC:
DDRC|=(1<<bit);
PORTC|=(1<<bit);
break;
casePD:
DDRD|=(1<<bit);
PORTD|=(1<<bit);
break;
}
}
}
voidCLRB(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA&=(1<<bit);
//PORTA&=(0xff-(1<<bit));
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
PORTB&=(0xff-(1<<bit));
break;
casePC:
DDRC|=(1<<bit);
PORTC&=(0xff-(1<<bit));
break;
casePD:
DDRD|=(1<<bit);
PORTD&=(0xff-(1<<bit));
break;
}
}
}
unsignedcharGETB(PORTport,unsignedcharbit){
unsignedreturn_value=0;
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(0xff-(1<<bit));
//return_value=PINA&(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(0xff-(1<<bit));
return_value=PINB&(1<<bit);
break;
casePC:
DDRC|=(0xff-(1<<bit));
return_value=PINC&(1<<bit);
break;
casePD:
DDRD|=(0xff-(1<<bit));
return_value=PIND&(1<<bit);
break;
}
if(return_value==0){
return(0x00);
}else{
return(0xff);
}
}
return(0xf0);
}
voidSETD(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
break;
casePC:
DDRC|=(1<<bit);
break;
casePD:
DDRD|=(1<<bit);
break;
}
}
}
voidCLRD(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(0xff-(1<<bit));
//break;
//useinMega16
casePB:
DDRB|=(0xff-(1<<bit));
break;
casePC:
DDRC|=(0xff-(1<<bit));
break;
casePD:
DDRD|=(0xff-(1<<bit));
break;
}
}
}
『叄』 在單片機英文手冊中PIN指的是什麼
PIN指的是單片機的引腳,比如某個IO,或某個控制口,對於一個DIP40封裝的單片機(普通MCS-8051),共有40個引腳,也就是40PIN。
『肆』 集成電路的pind一般指多大顆粒
通常說「集成電路」是指集成電路的晶元(IC),如 TTL 的74系列、51系列的單片機,不包括 PLC。
可編程邏輯控制器是電子整機,是一種工控計算機,內部電路採用各種集成電路晶元。
『伍』 AVR單片機用普通IO口怎麼寫邊緣觸發的程序呢
avr輸入時讀取引腳值應該是用比如pind.7讀取,讀取pa0用pina.0讀取,看一下avr的datasheet,裡面有。作為輸入引腳時,portx不再是設置引腳高低的,而是選擇輸入引腳是否上拉電阻
『陸』 AVR單片機怎麼產生占空比可調PWM波形
AVR單片機產生占空比可調PWM波形:
設置TC1為快速PWM方式,輸入頻率為1MHz時,在PD4和PD5輸出非反相的PWM,頻率1M/100=10KHz,占空比通過設置OCR1A和OCR1B來實現:
PORTD=0x00;
DDRD=0x30;
TCCR1A=0xA2;
TCCR1B=0x19;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00; //ICR設置PWM頻率
ICR1L=0x63;
OCR1AH=0x00; //設置PD4輸出占空比
OCR1AL=0x22;
OCR1BH=0x00; //設置PD5輸出占空比
OCR1BL=0x22;
『柒』 AVR單片機,MEGA8,出現語句 PIND (*(volatile unsigned char *)0x29),這句話中*號大概是什麼意思
(volatile unsigned char *)這是一個強制類型轉換,把0x29轉換成一個指向unsigned char的指針
而強制類型轉換之前的*表明對指針0x29取值,因為0x29是一個地址,這樣做就是從地址0x29出取一個位元組
如你所說,0x29是一個寄存器地址,這個操作就是讀該寄存器的值
因為這是一個絕對地址,所以寫法上有些特殊
『捌』 AVR單片機PIND=BIT(PD7)和PIND.7一樣嗎不對的話,那怎麼才能和PIND.7一樣啊
PIN是埠的狀態寄存器,不用設置啊,是讀取埠狀態的。直接讀PIND就可以
『玖』 A V R 單片機問題 s1按鍵按下是PIND&0X10
看按鍵接在哪個引腳上
如果接在PD4上,當該按鍵按下時,該引腳為0 PIND&0X10 即為0 否則非0(0x10)
如果接在PD5上,當該按鍵按下時,該引腳為0 PIND&0X20即為0 否則非0(0x20)
0x10對應二進制 0001 0000 即第5位是按鈕
0x20對應二進制 0010 0000 即第6位是按鈕