บอร์ดที่ผมใช่คือ Microcontroller รุ่น PIC16F887 เหมือนเดิมครับ
คือมันเป็นโปรแกรม LED ที่ต้องกดสวิตช์ เพื่อให้ไฟ LED วิ่งตามที่เราเขียนไว้
ปัญหาคือโจทย์เค้ามีเงื่อนไขที่ผมงง และแก้ไม่ได้อยู่ อยากรบกวนพวกพี่ๆหน่อยครับ
เมื่อเปิดบอร์ด Micro ไฟทั้ง 8 ดวงจะติดดับพร้อมกันทั้งหมด สลับไปเรื่อยๆ ผมขอเรียกว่า Standby นะครับ
(ตรงนี้ไม่ยาก ผมเคลียร์ไปแล้ว)
โจทย์มีอยู่ว่า กด SW0 ให้หลอด LED แสดงผลดังต่อไปนี้ (0=ติด x=ดับ)
Step1 0xxx xxxx
Step2 x0xx xxxx
Step3 xx0x xxxx
Step4 xxx0 xxxx
Step5 xxxx 0xxx
Step6 xxxx x0xx
Step7 xxxx xx0x
Step8 xxxx xxx0
ทำงานเช่นนี้ไปเรื่อยๆ จนกว่าจะกดสวิตช์ตัวต่อไป (มี SW1 ที่เมื่อเรากดแล้วมันจะวิ่งอีกแบบ)
ถ้ากด SW0 ซ้ำอีกครั้ง ไม่ว่ากดตอนไหนในขณะที่ LED ยังวิ่งอยู่ ให้หลอด LED แสดงผลถึง Step 8 ก่อนจึงจะกลับไป Standby
SW1 เป็นไฟวิ่งแบบง่ายๆ โดยให้ทำงาน 2 รอบ (ผมใช้ for) หลังจากครบแล้วให้กลับไป Standby แบบนี้ครับ
Step1 0xxx xxx0
Step2 00xx xx00
Step3 000x x000
Step4 0000 0000
Step5 000x x000
Step6 00xx xx00
Step7 0xxx xxx0
Step8 xxxx xxxx
ปัญหาของผมคือ
1.โจทย์บอก
"ทำงานเช่นนี้ไปเรื่อยๆ จนกว่าจะกดสวิตช์ตัวต่อไป"
คือถ้าเรากดมันไปทีนึง มันก็ต้องวนไปเรื่อย และถ้าผมกด SW1 เพื่อแสดงไฟชุดต่อไป
มันต้องเปลี่ยน ณ ตอนนั้นเลย และเมื่อมันแสดงไฟของ SW1 ครบ 2 รอบ มันต้องกลับไปที่ Standby
นั่นคือครับคือปัญหา ผมกดให้มันแสดงไฟวิ่งที่ตั้งไว้ใน SW1 ไม่ได้
ผมจนปัญญาเลยใช้วิธีเกรียน แทรก ผลของ SW1 ไว้ในช่วงที่กด SW0
ผลที่ได้คือ มันวิ่ง 2 รอบจริง แต่มันดันกลับมาวิ่งแบบ SW0 ต่อ ไม่ยอมไป Standby
2.โจทย์บอก
"ถ้ากด SW0 ซ้ำอีกครั้ง ให้หลอด LED แสดงผลถึง Step 8 ก่อนจึงจะกลับไป Standby"
อันนี้ผมทำไม่ได้จริง ผมไม่รู้ว่าจะให้มันกลับออกมาที่ Standby ยังไง
อันนี้คือโปรแกรมของผมครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้void main(void)
{
int j=0; //ใส่ค่า 0 ไว้ใน j
while(1)
{
OUTPUT_D(0xFF); //Standby
delay_ms(100);
OUTPUT_D(0x00);
delay_ms(100);
if(!input(pin_c0)) //กด SW0
{
if(j==0) //ถ้า j เท่ากับ 0 ถึงจะเข้ามา
{
j=1; //ใส่ค่า 1 ในตัวแปร j
}
while(j==1) //จะเข้ามาวนเมื่อ j = 1
{
OUTPUT_D(0x80); //แสดงไฟ Step 1
delay_ms(100);
if(!input(pin_c0) && j==1) //ถ้ากด SW0 ซ้ำอีกครั้ง และ j ต้อง = 1
{
j=0; //ใส่ค่า 0 ในตัวแปร j เพื่อให้มันออกลูปแล้วกลับไป Standby
} ตรงนี้ผมคิดว่าถูกแล้วแต่มันยังไม่ใช่
OUTPUT_D(0x40); //แสดงไฟ Step 2
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x20);
delay_ms(100);
if(!input(pin_c0) && j==1) //ผมใส่ if นี้ไว้กับ LED ทุก Step เพื่อที่ว่า ไม่ว่าเราจะกดตอนไหน
{ มันก็ออกลูปได้ เพราะถ้าใส่ไว้เฉพาะจุด มันจะไม่ออกลูปกลับไป Standby
j=0;
}
OUTPUT_D(0x10);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x08);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x04);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x02);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x01);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
OUTPUT_D(0x00);
delay_ms(100);
if(!input(pin_c0) && j==1)
{
j=0;
}
}
}
if(!input(pin_c1)) //กด SW1
{
for(i=0;i<2;i++) //สั่งให้มันวน 2 รอบ ตรงนี้ไม่มีปัญหาครับ
{ ปัญหาอยู่ที่ผมกล่าวตอนแรก คือ ระหว่างที่ SW0 กำลังวิ่งไปเรื่อย
OUTPUT_D(0x00); ถ้ากด SW1 มันต้องเข้ามาวิ่งตรงนี้ทันที แล้วกลับไป Standby
delay_ms(100); แต่ที่ผมลองทำมันวิ่งครบ 2 รอบแล้วไม่กลับไป Standby มันกลับไปวิ่งใน SW0 ต่อ
OUTPUT_D(0x81);
delay_ms(100);
OUTPUT_D(0xC3);
delay_ms(100);
OUTPUT_D(0xE7);
delay_ms(100);
OUTPUT_D(0xFF);
delay_ms(100);
OUTPUT_D(0xE7);
delay_ms(100);
OUTPUT_D(0xC3);
delay_ms(100);
OUTPUT_D(0x81);
delay_ms(100);
}
}
}
}
รบกวนพี่ๆในบอร์ดนี้อีกสักครั้งนะครับ ช่วยผมหน่อย ผมขอขอบคุณพี่ๆล่วงหน้าครับ
รบกวนพี่ๆอีกครั้งนะครับ ช่วยแก้ปัญหาโปรแกรม Microcontroller ควบคุม LED หน่อยครับ
คือมันเป็นโปรแกรม LED ที่ต้องกดสวิตช์ เพื่อให้ไฟ LED วิ่งตามที่เราเขียนไว้
ปัญหาคือโจทย์เค้ามีเงื่อนไขที่ผมงง และแก้ไม่ได้อยู่ อยากรบกวนพวกพี่ๆหน่อยครับ
เมื่อเปิดบอร์ด Micro ไฟทั้ง 8 ดวงจะติดดับพร้อมกันทั้งหมด สลับไปเรื่อยๆ ผมขอเรียกว่า Standby นะครับ
(ตรงนี้ไม่ยาก ผมเคลียร์ไปแล้ว)
โจทย์มีอยู่ว่า กด SW0 ให้หลอด LED แสดงผลดังต่อไปนี้ (0=ติด x=ดับ)
Step1 0xxx xxxx
Step2 x0xx xxxx
Step3 xx0x xxxx
Step4 xxx0 xxxx
Step5 xxxx 0xxx
Step6 xxxx x0xx
Step7 xxxx xx0x
Step8 xxxx xxx0
ทำงานเช่นนี้ไปเรื่อยๆ จนกว่าจะกดสวิตช์ตัวต่อไป (มี SW1 ที่เมื่อเรากดแล้วมันจะวิ่งอีกแบบ)
ถ้ากด SW0 ซ้ำอีกครั้ง ไม่ว่ากดตอนไหนในขณะที่ LED ยังวิ่งอยู่ ให้หลอด LED แสดงผลถึง Step 8 ก่อนจึงจะกลับไป Standby
SW1 เป็นไฟวิ่งแบบง่ายๆ โดยให้ทำงาน 2 รอบ (ผมใช้ for) หลังจากครบแล้วให้กลับไป Standby แบบนี้ครับ
Step1 0xxx xxx0
Step2 00xx xx00
Step3 000x x000
Step4 0000 0000
Step5 000x x000
Step6 00xx xx00
Step7 0xxx xxx0
Step8 xxxx xxxx
ปัญหาของผมคือ
1.โจทย์บอก "ทำงานเช่นนี้ไปเรื่อยๆ จนกว่าจะกดสวิตช์ตัวต่อไป"
คือถ้าเรากดมันไปทีนึง มันก็ต้องวนไปเรื่อย และถ้าผมกด SW1 เพื่อแสดงไฟชุดต่อไป
มันต้องเปลี่ยน ณ ตอนนั้นเลย และเมื่อมันแสดงไฟของ SW1 ครบ 2 รอบ มันต้องกลับไปที่ Standby
นั่นคือครับคือปัญหา ผมกดให้มันแสดงไฟวิ่งที่ตั้งไว้ใน SW1 ไม่ได้
ผมจนปัญญาเลยใช้วิธีเกรียน แทรก ผลของ SW1 ไว้ในช่วงที่กด SW0
ผลที่ได้คือ มันวิ่ง 2 รอบจริง แต่มันดันกลับมาวิ่งแบบ SW0 ต่อ ไม่ยอมไป Standby
2.โจทย์บอก "ถ้ากด SW0 ซ้ำอีกครั้ง ให้หลอด LED แสดงผลถึง Step 8 ก่อนจึงจะกลับไป Standby"
อันนี้ผมทำไม่ได้จริง ผมไม่รู้ว่าจะให้มันกลับออกมาที่ Standby ยังไง
อันนี้คือโปรแกรมของผมครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
รบกวนพี่ๆในบอร์ดนี้อีกสักครั้งนะครับ ช่วยผมหน่อย ผมขอขอบคุณพี่ๆล่วงหน้าครับ