導航:首頁 > 操作系統 > 單片機pind

單片機pind

發布時間:2022-08-27 11:23:26

『壹』 誰能幫我解釋一下這個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位是按鈕

閱讀全文

與單片機pind相關的資料

熱點內容
securecrtandroid 瀏覽:176
短字元串壓縮 瀏覽:863
u盤插入後顯示加密格式化 瀏覽:944
我的世界怎麼用命令方塊獲得超級武器 瀏覽:382
狗語翻譯器app鏈接怎麼下 瀏覽:905
選擇排序演算法的流程圖 瀏覽:881
如何對文件夾開啟共享 瀏覽:527
常用的磁碟調度演算法 瀏覽:662
怎麼用返利app返利 瀏覽:127
java代碼快速 瀏覽:243
單片機左移右移後是補1還是0 瀏覽:599
湛江一號命令 瀏覽:333
導出命令行 瀏覽:274
C和php交互 瀏覽:600
蘋果手機里的通訊錄如何導入安卓手機 瀏覽:170
怎麼在京東app裡面看自己會員等級 瀏覽:43
emerson伺服器怎麼短接啟動 瀏覽:559
工控編程人員工資 瀏覽:397
速成義大利語pdf 瀏覽:250
連續加減乘除法的演算法 瀏覽:654