void main()
{
char segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int i=0;
TRISC=0;
PORTC=segment[0];
while(1)
{
delay_ms(500);
i=i+1;
if(i==10)i=0;
PORTC=segment[i];
}
}
วันพุธที่ 27 พฤศจิกายน พ.ศ. 2562
ลูกเต๋า
void main()
{
unsigned char dice[]={0x08,0x22,0x2A,0x55,0x5D,0x77};
unsigned char i;
TRISC=0;
TRISB=0x01;
PORTC=0;
while(1)
{
if(PORTB.F0==0)
{
PORTC=dice[i];
delay_ms(3000);
PORTC=0;
}
i++;
if(i>5)i=0;
}
}
หน้าจอสกอบอร์ด
#define digit1 PORTB.F5
#define digit2 PORTB.F6
#define digit3 PORTB.F7
unsigned char segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char i,j;
void interrupt()
{
if(INTCON.INT0IF==1)
{
i++;
if(i>9)i=0;
INTCON.INT0IF=0;
}
if(INTCON3.INT1IF==1)
{
j++;
if(j>9)j=0;
INTCON3.INT1IF=0;
}
}
void main()
{
TRISB=0x03;
TRISC=0;
INTCON.INT0IE=1;
INTCON.INT0IF=0;
INTCON2.INTEDG0=0;
INTCON3.INT1IE=1;
INTCON3.INT1IF=0;
INTCON2.INTEDG1=0;
INTCON.GIE=1;
while(1)
{
digit1=0;digit2=1;digit3=1;
PORTC=segment[i];
delay_ms(25);
digit1=1;digit2=0;digit3=1;
PORTC=~0x3F;
delay_ms(25);
digit1=1;digit2=1;digit3=0;
PORTC=segment[j];
delay_ms(25);
}
}
#define digit2 PORTB.F6
#define digit3 PORTB.F7
unsigned char segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char i,j;
void interrupt()
{
if(INTCON.INT0IF==1)
{
i++;
if(i>9)i=0;
INTCON.INT0IF=0;
}
if(INTCON3.INT1IF==1)
{
j++;
if(j>9)j=0;
INTCON3.INT1IF=0;
}
}
void main()
{
TRISB=0x03;
TRISC=0;
INTCON.INT0IE=1;
INTCON.INT0IF=0;
INTCON2.INTEDG0=0;
INTCON3.INT1IE=1;
INTCON3.INT1IF=0;
INTCON2.INTEDG1=0;
INTCON.GIE=1;
while(1)
{
digit1=0;digit2=1;digit3=1;
PORTC=segment[i];
delay_ms(25);
digit1=1;digit2=0;digit3=1;
PORTC=~0x3F;
delay_ms(25);
digit1=1;digit2=1;digit3=0;
PORTC=segment[j];
delay_ms(25);
}
}
โปรแกรมสวิตซ์กดติด-ปล่อยดับ
สำหรับการทดลองในบทความนี้จะเป็นการใช้งานพอร์ตอินพุตของ ไมโครคอนโทรลเลอร์ PIC โดยการต่อสวิตซ์เพิ่มเข้ามาเพื่อที่จะนำมาใช้ในการควบคุมพอร์ตเอาต์พุตของไมโครคอนโทรลเลอร์ PIC เอาล่ะครับทีนี้ มีสวิตซ์เพิ่มเข้ามาท้าทายความสามารถ ยิ่งทำให้อยากลองแล้วใช่มั๊ยครับ
ขั้นตอนที่ 1
ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ
คำสั่งที่ใช้ในการโปรแกรม
while() เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ
output_x(...) เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);
delay_ms(...) เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ
set_tris_x() เป็นคำสั่งกำหนดพอร์ตใช้งานให้พอร์ตอินพุต หรือเอาต์พุต โดยการกำหนดค่าให้กับฟังก์ชัน set_tris_x() เช่น set_tris_b(0x00); , set_tris_a(0xff);
value = input() เป็นคำสั่งอ่านข้อมูลจากพอร์ตอินพุตที่ต้องการ เช่น a=!input(pin_a0);
output_bit() เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในระดับบิต เช่น output_bit(pin_b0,a);
ขั้นตอนที่ 2
เริ่มเขียนโปรแกรมกันเลยครับ
#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#use fast_io(A)
#use fast_io(B)
int1 a; // คำสั่งประกาศตัวแปร a เป็นเลขจำนวนเต็มขนาน 1 บิต
void main()
{
set_tris_a(0xff); // คำสั่งกำหนดพอร์ต A เป็นพอร์ตอินพุตทั้งหมด
set_tris_b(0x00); // คำสั่งกำหนดพอร์ต B ให้เป็นพอร์ตเอาต์พุตทั้งหมด
output_b(0b00000000); // คำสั่งเคลียร์พอร์ต B ให้เป็น 0 ทุกบิต
while(true) // คำสั่งวนซ้ำแบบมีเงื่อนไข
{
a=!input(pin_a0); // คำสั่งอ่านข้อมูลจากพอร์ตอินพุต ขา a0
output_bit(pin_b0,a); // คำสั่งส่งข้อมูลออกทางเอาต์พุตขนาด 1 บิต
} // โดยนำค่า a ส่งออกที่ขา b0
}
การทำงานของโปรแกรม
หรือถ้าหากต้องการให้ LED1 ทำงานเป็นตรงกันข้าม คือ กดดับ-ปล่อยติด เราก็สามารถที่จะแก้โปรแกรมที่บรรทัด a=!input(pin_a0); ให้เป็น a=input(pin_a0); ได้เช่นกันครับ
เมื่อรู้ผลกันแล้วทุกท่านคงจะพอเข้าใจการใช้งานพอร์ตอินพุตของ ไมโครคอนโทรลเลอร์ PIC
กันบ้างแล้ว ขอให้สนุกกับการเขียนโปรแกรมไมโครคอนโทรลเลอร์นะครับ แล้วเจอกันในบทความหน้าครับ
ขั้นตอนที่ 1
ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ
คำสั่งที่ใช้ในการโปรแกรม
while() เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ
output_x(...) เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);
delay_ms(...) เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ
set_tris_x() เป็นคำสั่งกำหนดพอร์ตใช้งานให้พอร์ตอินพุต หรือเอาต์พุต โดยการกำหนดค่าให้กับฟังก์ชัน set_tris_x() เช่น set_tris_b(0x00); , set_tris_a(0xff);
value = input() เป็นคำสั่งอ่านข้อมูลจากพอร์ตอินพุตที่ต้องการ เช่น a=!input(pin_a0);
output_bit() เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในระดับบิต เช่น output_bit(pin_b0,a);
ขั้นตอนที่ 2
เริ่มเขียนโปรแกรมกันเลยครับ
#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#use fast_io(A)
#use fast_io(B)
int1 a; // คำสั่งประกาศตัวแปร a เป็นเลขจำนวนเต็มขนาน 1 บิต
void main()
{
set_tris_a(0xff); // คำสั่งกำหนดพอร์ต A เป็นพอร์ตอินพุตทั้งหมด
set_tris_b(0x00); // คำสั่งกำหนดพอร์ต B ให้เป็นพอร์ตเอาต์พุตทั้งหมด
output_b(0b00000000); // คำสั่งเคลียร์พอร์ต B ให้เป็น 0 ทุกบิต
while(true) // คำสั่งวนซ้ำแบบมีเงื่อนไข
{
a=!input(pin_a0); // คำสั่งอ่านข้อมูลจากพอร์ตอินพุต ขา a0
output_bit(pin_b0,a); // คำสั่งส่งข้อมูลออกทางเอาต์พุตขนาด 1 บิต
} // โดยนำค่า a ส่งออกที่ขา b0
}
การทำงานของโปรแกรม
- เมื่อยังไม่มีการกดสวิตซ์
- เมื่อมีการกดสวิตซ์
หรือถ้าหากต้องการให้ LED1 ทำงานเป็นตรงกันข้าม คือ กดดับ-ปล่อยติด เราก็สามารถที่จะแก้โปรแกรมที่บรรทัด a=!input(pin_a0); ให้เป็น a=input(pin_a0); ได้เช่นกันครับ
เมื่อรู้ผลกันแล้วทุกท่านคงจะพอเข้าใจการใช้งานพอร์ตอินพุตของ ไมโครคอนโทรลเลอร์ PIC
กันบ้างแล้ว ขอให้สนุกกับการเขียนโปรแกรมไมโครคอนโทรลเลอร์นะครับ แล้วเจอกันในบทความหน้าครับ
Home work
งานที่ 2
โปรแกรมไฟกระพริบสลับกัน LED 2 ดวง
บทความที่แล้วเราทำโปรแกรม โปรแกรมไฟกระพริบ LED 2 ดวง กันไปแล้วโดย LED ติดดับพร้อมกันไม่ยากอย่างที่คิดเลยใช่มั๊ยล่ะครับ ทีนี้เรามาเขียนโปรแกรมให้ LED ติดดับสลับกันบ้างครับ
ขั้นตอนที่ 1
ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ
คำสั่งที่ใช้ในการโปรแกรม
while() เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ
output_x(...) เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);
delay_ms(...) เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ
ขั้นตอนที่ 2
เริ่มเขียนโปรแกรมกันเลยครับ
#include<16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
void main()
{
while(true) // คำสั่งวนซ้ำแบบมีเงื่อนไข
{
output_b(0x01); // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b0
delay_ms(1000); // คำสั่งหน่วงเวลา 1 วินาที
output_b(0x02); // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b1
delay_ms(1000); // คำสั่งหน่วงเวลา 1 วินาที
}
}
การทำงานของโปรแกรม
เมื่อโปรแกรมเริ่มทำงาน LED ทั้งสองดวง จะติดและดับสลับกัน โดยหน่วงเวลาในการติด 1 วินาที และหน่วงเวลาในการดับ 1 วินาที
ขั้นตอนที่ 1
ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ
คำสั่งที่ใช้ในการโปรแกรม
while() เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ
output_x(...) เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);
delay_ms(...) เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ
ขั้นตอนที่ 2
เริ่มเขียนโปรแกรมกันเลยครับ
#include<16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
void main()
{
while(true) // คำสั่งวนซ้ำแบบมีเงื่อนไข
{
output_b(0x01); // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b0
delay_ms(1000); // คำสั่งหน่วงเวลา 1 วินาที
output_b(0x02); // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b1
delay_ms(1000); // คำสั่งหน่วงเวลา 1 วินาที
}
}
การทำงานของโปรแกรม
เมื่อโปรแกรมเริ่มทำงาน LED ทั้งสองดวง จะติดและดับสลับกัน โดยหน่วงเวลาในการติด 1 วินาที และหน่วงเวลาในการดับ 1 วินาที
Home workงานที่ 1
|
สมัครสมาชิก:
บทความ (Atom)
งานที่2
เกลียว ชนิดและส่วนต่างๆของเกลียว เกลียว ( Thread) หมายถึงสันหรือร่องที่เกิดขึ้นบนผิวงานวนไปรอบ ๆจะซ้ายหรือขวาก็ไดด้วยระยะทางที่สม่ำเสมอ เ...

-
เกลียว ชนิดและส่วนต่างๆของเกลียว เกลียว ( Thread) หมายถึงสันหรือร่องที่เกิดขึ้นบนผิวงานวนไปรอบ ๆจะซ้ายหรือขวาก็ไดด้วยระยะทางที่สม่ำเสมอ เ...
-
#define digit1 PORTB.F6 #define digit2 PORTB.F7 void main() { TRISB=0; TRISC=0; while(1) { dig...