1. 單片機c語言編程時,假如一個IO已口定義了,但沒定義此口是高電平還是低電平,那系統會默認為低電平么
任何一個C語言語句,最終都是經過編譯程序編譯成匯編語言再由匯編器編譯成機器碼,但是,定語句則不痛,他們被編譯成匯編語言偽指令(不是可執行指令),只要你沒有在定義時賦值,就沒有實質的機器碼產生,也就不會改變寄存器或者內存的狀態。
由此,我們可以得出答案,單片機c語言編程時,假如一個IO已口定義了,但沒定義此口是高電平還是低電平,那系統不會默認為低電平。這個IO口具體是什麼狀態,有具體單片機的默認狀態決定,且不同的單片機有所不同,對傳統單片機,默認狀態是弱上拉准IO狀態,是高電平。
2. 急求:我編的c語言控製程序,如何更改觸發方式(按鍵判斷改為高低電平判斷),而保持原程序執行結果。
新建工程
首先新建工程,並加以簡單配置,可以參考我的分享:《IAR如何建立工程》,如下為硬體電路圖:
PICTL
PICTL可以控制Px口中斷觸發信號:上升沿觸發、下降沿觸發。由於按鍵在未按下時處於高電平,按下後為低電平,松開後又為高電平,所以會產生下降沿觸發信號,配置為下降沿觸發即可:
PICTL |= BIT0; //falling edge
IEN1
除了配置引腳,還需要開啟埠引腳中斷使能,如下所示開啟PO口中斷使能:
IEN1 |= BIT5; //P0 interrupt
PxIFG
在開啟中斷前需要先清除中斷標志,以免誤入中斷造成系統混亂。
P0IFG &= ~BIT4;
系統中斷使能
學習51都知道,在任何中斷操作時,都需要開啟系統中斷:
EA = 1; //system interrupt open
中斷函數書寫
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
其中wg_waitUs()是延時函數,起到按鍵消抖作用。
代碼框架
void wg_ledInit(void)
{
P1DIR |= BIT0;
P1 |= BIT0;
}
void wg_btnInit(void)
{
P0IEN |= BIT4; // P0.4 button input
PICTL |= BIT0; //falling edge
IEN1 |= BIT5; //P0 interrupt
P0IFG &= ~BIT4;
EA = 1; //system interrupt open
}
void wg_waitUs(uint16 ration)
{
while (ration--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
void main(void)
{
wg_ledInit();
wg_btnInit();
//loop
for(;;)
{
;//
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
3. c語言中如何將發送的數字串(例如11011110)轉換成高低電平波形
voidoutput_high(void)
{
/*具體如何輸出高電平,要結合實際情況,如硬體環境*/
}
voidoutput_low(void)
{
/*具體如何輸出低電平,要結合實際情況,如硬體環境*/
}
voidmain(void)
{
unsignedchardata=222;//11011110,舉例
unsignedchartemp=0;
unsignedinti=0;
for(i=0;i<8;i++)
{
temp=data&1;
if(temp==0)
output_low();
else
output_high();
data=data>>1;
delay();//延時函數,舉例
}
}