ผมต้องการให้โปรแกรมวนลูปทำงานตลอดเมื่อ RTC.sec=5 แต่นี่พอ RTC.sec=5 แล้วโปรแกรมเรียกฟังก์ชั่น Delay แค่ครั้งเดียวแล้วก็ไม่เรียกฟังก์ชั่นนี้อีกเลยครับ และเมื่อรันโปรแกรมแล้วโปรแกรมก็ยังไม่ได้เรียกฟังก์ชั่น delay จนกว่าเราจะเซตค่าก่อนครับ โดยต้องไปเซตค่าในฟังก์ชั่น sec_feed() เพื่อกำหนดค่าที่ต้องการจะ delay ครับ ทั้งที่ผมกำหนดค่าเริ่มต้นไว้ให้ตัวแปรแล้วคือ unsigned int sec=10;
/* ฟังก์ชันนี้ใช้กำหนดค่าเวลาที่จะ delay ถ้ารันโปรแกรมเลยโดยไม่เรียกฟังก์ชันนี้โปรแกรมจะไม่เรียกฟังก์ชัน Delay ครับ */
void sec_feed(){
unsigned int sec=10; // ค่า sec เริ่มต้นคือ 10
while(input(PIN_B3)){
if(input(PIN_B1)==0){
delay_ms(100);
sec++;
if(sec>=1000){sec=1000;} //ตรวจสอบไม่ให้ sec มีค่าเกิน 1,000
delay_ms(100);
printf("\r\n sec= %d ",sec);
delay_ms(50);
}
if(input(PIN_B2)==0){
delay_ms(100);
sec--;
if(sec<=1){sec=1;} // กำหนดค่า sec ต่ำสุดคือ 1
delay_ms(100);
printf("\r\n sec= %d ",sec);
delay_ms(50);
}
} // while sec
sec_delay = sec;
}
/* ฟังก์ชั่น Delay สำหรับหน่วงเวลา */
void delay(){
for(sec_delay=sec_delay;sec_delay>0;sec_delay--){
lcd_gotoxy(1,2);
delay_ms(1000);
printf("\r\n Delay = %d " sec_delay);
}
}
/************* ฟังก์ชั่น main *************/
void main(){
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); // Set external interrupt
ext_int_edge(H_TO_L); // External interrupt high to low edge
while(TRUE){
DS1307_ReadTime();
/* ใช้ while วนลูปแล้วแต่เรียกฟังก์ชั่นแค่รอบเดียวแล้วพอ RTC.sec = 5 อีกครั้งก็ไม่ delay อีกเลย */
if(bcd2bin(RTC.sec)==5){
delay();
}
}
}
ไม่ทราบว่าทำยังไงถึงจะวนลูปเรียกฟังก์ชั่น delay() ไปตลอดเมื่อ bcd2bin(RTC.sec)==5 ครับ
เขียนภาษา C ด้วยคอมไพเลอร์ CCS โดยให้ฟังก์ชั่นกลับไปเรียกฟังก์ชั่นซ้ำเมื่อทำงานเสร็จแล้วไม่ได้ครับ
/* ฟังก์ชันนี้ใช้กำหนดค่าเวลาที่จะ delay ถ้ารันโปรแกรมเลยโดยไม่เรียกฟังก์ชันนี้โปรแกรมจะไม่เรียกฟังก์ชัน Delay ครับ */
void sec_feed(){
unsigned int sec=10; // ค่า sec เริ่มต้นคือ 10
while(input(PIN_B3)){
if(input(PIN_B1)==0){
delay_ms(100);
sec++;
if(sec>=1000){sec=1000;} //ตรวจสอบไม่ให้ sec มีค่าเกิน 1,000
delay_ms(100);
printf("\r\n sec= %d ",sec);
delay_ms(50);
}
if(input(PIN_B2)==0){
delay_ms(100);
sec--;
if(sec<=1){sec=1;} // กำหนดค่า sec ต่ำสุดคือ 1
delay_ms(100);
printf("\r\n sec= %d ",sec);
delay_ms(50);
}
} // while sec
sec_delay = sec;
}
/* ฟังก์ชั่น Delay สำหรับหน่วงเวลา */
void delay(){
for(sec_delay=sec_delay;sec_delay>0;sec_delay--){
lcd_gotoxy(1,2);
delay_ms(1000);
printf("\r\n Delay = %d " sec_delay);
}
}
/************* ฟังก์ชั่น main *************/
void main(){
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); // Set external interrupt
ext_int_edge(H_TO_L); // External interrupt high to low edge
while(TRUE){
DS1307_ReadTime();
/* ใช้ while วนลูปแล้วแต่เรียกฟังก์ชั่นแค่รอบเดียวแล้วพอ RTC.sec = 5 อีกครั้งก็ไม่ delay อีกเลย */
if(bcd2bin(RTC.sec)==5){
delay();
}
}
}
ไม่ทราบว่าทำยังไงถึงจะวนลูปเรียกฟังก์ชั่น delay() ไปตลอดเมื่อ bcd2bin(RTC.sec)==5 ครับ