To set a pin as an output pin

From ThaiEasyElecWiki
Jump to: navigation, search

To set a pin as an output pin, what we really need to do is to set a correct bit on register LPC_GPIOx->DIR (for mini-SUN7). Where x represents the port number. For example, to set the pin named LED1 on port0.18 as an output (which is connected to the panel LED), the 18th bit of LPC_GPIO0->DIR must be set. This can be done with:

	LPC_GPIO0->DIR |= (1 << 18);

Note that |= must be used so no other bits are effected.

However, it's not a good idea to do this way because one doesn't know what is connected to port0.18. So we name ports on hw_mini_sun7.h, a part of them are here:

#define LED1_DPRT		LPC_GPIO0->DIR
#define LED1_PRTS		LPC_GPIO0->SET
#define LED1_PRTC		LPC_GPIO0->CLR
#define LED1_PIN		18UL

Then the line above can be replaced with this:

	LED1_DPRT |= (1 << LED1_PIN);

Which is clearer since we don't have to care which port the LED is connected to. And it's easier to move to other pin in the future.

Then we shorten the code using a macro in app_config.h:

#define Orb(target,bitnum)		target |= (unsigned long)(1 << bitnum)

Now we can use:

	Orb(LED1_DPRT,LED1_PIN);
=================================================================

GPIO ปกติจะทำงานเป็น input ถ้าต้องการให้เป็น output จะต้องกำหนดบิตใน register LPC_GPIOx->DIR (สำหรับบอร์ด mini-SUN7) ให้ถูกต้อง โดย x หมายถึงลำดับของ port เช่น บนบอร์ดจะมีขาที่ตั้งชื่อไว้ว่า LED1 อยู่ที่ port0.18 โดยขานี้ต่อกับ LED ที่อยู่ด้านข้างของบอร์ด ติดกับช่องเสียบ USB การกำหนดให้ขานี้ทำหน้าที่เป็น output เพิ่มควบคุมการติดดับของ LED นี้ ทำได้โดยกำหนดบิตที่ 18 ของ register LPC_GPIO0->DIR ให้เป็น 1 (ปกติทุกบิตจะเป็น 0 คือเป็น input) ซึ่งทำได้โดย

	LPC_GPIO0->DIR |= (1 << 18);

สังเกตว่าจะใช้ |= เพื่อให้การกำหนดค่า ไม่ไปกระทบกับบิตอื่น

อย่างไรก็ดี การเขียนคำสั่งลักษณะนี้จะไม่ได้สื่อถึงว่าทำเพื่ออะไร โดยทั่วไปเราจึงควรกำหนดชื่อของขาไว้ เพื่อให้เข้าใจได้ง่ายขึ้น ในที่นี้เรากำหนดไว้ในไฟล์ hw_mini_sun7.h

#define LED1_DPRT		LPC_GPIO0->DIR
#define LED1_PRTS		LPC_GPIO0->SET
#define LED1_PRTC		LPC_GPIO0->CLR
#define LED1_PIN		18UL

คำสั่งด้านบน จึงสามารถเขียนใหม่ได้เป็น

	LED1_DPRT |= (1 << LED1_PIN);

ซึ่งจะสื่อความหมายมากกว่า และคนเขียนก็ไม่จำเป็นต้องจำว่า LED ถูกต่ออยู่ที่ขาไหน ในอนาคตหากมีการเปลี่ยนขาที่ใช้ ก็สามารถแก้ไข firmware ได้ง่ายกว่า

เราสามารถเขียนคำสั่งให้สั้นลงได้อีก โดยการใช้ macro ซึ่งกำหนดไว้ใน app_config.h:

#define Orb(target,bitnum)		target |= (unsigned long)(1 << bitnum)

ดังนั้น เราจะสามารถเขียนคำสั่งใหม่ได้ว่า

	Orb(LED1_DPRT,LED1_PIN);
Personal tools
Namespaces
Variants
Actions
Navigation
Articles and Tutorials
Shortcut (mini SUN7)
Toolbox