ตอนนี้ผมเรียนด้วยไมโครรุ่น PIC16F887
คืออาจารย์ผมให้โจทย์มาว่า
"เขียนโปรแกรมควบคุม 7-Segment ให้แสดง 00-99 โดยเริ่มแสดง 00 จากนั้นรับค่าจะการกดสวิตย์(1 ครั้ง) รายละเอียดดังนี้
กดสวิตช์ที่ 1(SW0) ให้ 7 Segment แสดงเลขขึ้น 1 ค่า
กดสวิตช์ที่ 2(SW1) ให้ 7 Segment แสดงเลขลง 1 ค่า"
*หมายเหตุ* เมื่อแสดงถึงเลข 99 แล้วกดสวิตช์ที่ 1 ให้วนกลับมาที่ 00 ใหม่
เมื่อแสดง 00 แล้วกดสวิตช์ที่ 2 ให้แสดงเลข 00 เหมือนเดิมโดยไม่มีการเปลี่ยนแปลง
อันนี้คือวงจรที่ผมใช้ในโปรแกรม Proteus
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ใช้ Port C ขา 0 เป็น SW0
ใช้ Port C ขา 1 เป็น SW1
สวิตช์แบบ Active Low
ใช้ Port D เป็นหลักหน่วย
ใช้ Port B เป็นหลักสิบ
***อันนี้คือโปรแกรมที่ผมพยายามเขียนเอง รู้บ้าง มั่วบ้าง มันเพิ่มค่าได้ แต่ทำให้ลดไม่ได้
พอเวลาสลับกดสวิตช์ เหมือนค่ามันจะเกินไป 1 เสมอ เช่น ที่ 7-Segment ทั้ง 2 ตัว
แสดงเลข 35 กด SW0 ให้เพิ่ม เป็น 36 พอจะลดเป็น 35 ด้วยการกด SW1
มันจะขึ้น 37 ก่อน แล้วต้องกดอีกทีถึงจะเป็น 35 ผมงง จนปัญญามาก
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้#include <16F887.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay (clock=20000000) //อาจารย์เค้าบอกว่ารุ่นนี้มันต้อง clock 20MHz
int i,j,k;
void num() //ใช้อิงตัวเลข
{
//หลักหน่วย
if(i==0)
{
OUTPUT_D(0x3f);
delay_ms(100);
}
if(i==1)
{
OUTPUT_D(0x06);
delay_ms(100);
}
if(i==2)
{
OUTPUT_D(0x5b);
delay_ms(100);
}
if(i==3)
{
OUTPUT_D(0x4f);
delay_ms(100);
}
if(i==4)
{
OUTPUT_D(0x66);
delay_ms(100);
}
if(i==5)
{
OUTPUT_D(0x6D);
delay_ms(100);
}
if(i==6)
{
OUTPUT_D(0x7D);
delay_ms(100);
}
if(i==7)
{
OUTPUT_D(0x07);
delay_ms(100);
}
if(i==8)
{
OUTPUT_D(0x7f);
delay_ms(100);
}
if(i==9)
{
OUTPUT_D(0x6f);
delay_ms(100);
}
//หลักสิบ
if(j==0)
{
OUTPUT_B(0x3f);
delay_ms(100);
}
if(j==1)
{
OUTPUT_B(0x06);
delay_ms(100);
}
if(j==2)
{
OUTPUT_B(0x5b);
delay_ms(100);
}
if(j==3)
{
OUTPUT_B(0x4f);
delay_ms(100);
}
if(j==4)
{
OUTPUT_B(0x66);
delay_ms(100);
}
if(j==5)
{
OUTPUT_B(0x6D);
delay_ms(100);
}
if(j==6)
{
OUTPUT_B(0x7D);
delay_ms(100);
}
if(j==7)
{
OUTPUT_B(0x07);
delay_ms(100);
}
if(j==8)
{
OUTPUT_B(0x7f);
delay_ms(100);
}
if(j==9)
{
OUTPUT_B(0x6f);
delay_ms(100);
}
}
void main()
{
i=0; //หลักหน่วย
j=0; //หลักสิบ
k=0; //ตัวแปรนับรอบ
OUTPUT_D(0x3f);
OUTPUT_B(0x3f); //แสดง 00 ตั้งแต่เริ่มต้น
while(k<100)
{
if(!input(pin_C0)) //กด SW0 ให้ค่าเพิ่ม
{
num();
k++;
i++;
if(i>9)
{
j++;
i=0;
}
}
if(!input(pin_C1)) //กด SW1 ให้ค่าลด
{
num();
i--;
if(i==0)
{
j--;
i=9;
}
}
}
}
ผมลองค้นในอินเตอร์เน็ตมันสามารถใช้ตัวแปร Array เพื่อแทนเลข 0-9 ได้
เช่น int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
แต่ผมใช้ไม่เป็น ลองทำดูมันก็ไม่ติด
ถ้าพี่ๆคนไหนว่าง รบกวนช่วยผมทำหน่อยนะครับ ผมปวดหัวมากๆ ขอบคุณครับ
รบกวนช่วยผมเขียนโปรแกรม Microcontroller 7 Segment หน่อยครับ
คืออาจารย์ผมให้โจทย์มาว่า
"เขียนโปรแกรมควบคุม 7-Segment ให้แสดง 00-99 โดยเริ่มแสดง 00 จากนั้นรับค่าจะการกดสวิตย์(1 ครั้ง) รายละเอียดดังนี้
กดสวิตช์ที่ 1(SW0) ให้ 7 Segment แสดงเลขขึ้น 1 ค่า
กดสวิตช์ที่ 2(SW1) ให้ 7 Segment แสดงเลขลง 1 ค่า"
*หมายเหตุ* เมื่อแสดงถึงเลข 99 แล้วกดสวิตช์ที่ 1 ให้วนกลับมาที่ 00 ใหม่
เมื่อแสดง 00 แล้วกดสวิตช์ที่ 2 ให้แสดงเลข 00 เหมือนเดิมโดยไม่มีการเปลี่ยนแปลง
อันนี้คือวงจรที่ผมใช้ในโปรแกรม Proteus
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ใช้ Port C ขา 0 เป็น SW0
ใช้ Port C ขา 1 เป็น SW1
สวิตช์แบบ Active Low
ใช้ Port D เป็นหลักหน่วย
ใช้ Port B เป็นหลักสิบ
***อันนี้คือโปรแกรมที่ผมพยายามเขียนเอง รู้บ้าง มั่วบ้าง มันเพิ่มค่าได้ แต่ทำให้ลดไม่ได้
พอเวลาสลับกดสวิตช์ เหมือนค่ามันจะเกินไป 1 เสมอ เช่น ที่ 7-Segment ทั้ง 2 ตัว
แสดงเลข 35 กด SW0 ให้เพิ่ม เป็น 36 พอจะลดเป็น 35 ด้วยการกด SW1
มันจะขึ้น 37 ก่อน แล้วต้องกดอีกทีถึงจะเป็น 35 ผมงง จนปัญญามาก
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ผมลองค้นในอินเตอร์เน็ตมันสามารถใช้ตัวแปร Array เพื่อแทนเลข 0-9 ได้
เช่น int num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
แต่ผมใช้ไม่เป็น ลองทำดูมันก็ไม่ติด
ถ้าพี่ๆคนไหนว่าง รบกวนช่วยผมทำหน่อยนะครับ ผมปวดหัวมากๆ ขอบคุณครับ