หัวข้อ: รบกวนแนะแนวทางโค้ด ภาษาC การกดสวิตซ์แสดงผลจอแล้วเกบค่า
เริ่มหัวข้อโดย: karnbasic ที่ ธันวาคม 16, 2010, 02:52:16 PM
คืออยากรบกวนแนะแนวการเขียนโค้ด ภาษาซีครับผม คือ ผมมีปุ่มสวิตซ์อยู่ 4 ปุ่มด้วยกัน *แนวทางคือป้อนค่าทางสวิตซ์แล้วแสดงบน LCD แล้วจะเก็บค่าที่ป้อนไว้ ไปใช้งานต่ออ่ะครับผม
ปุ่ม 1 เป็น กดครั้งแรก F-เดินหน้า กดครั้งที่2 U-ถอยหลัง กดครั้งที่3 L-เลี้ยวซ้าย กดครั้งที่4 R-เลี้ยวขวา
ปุ่ม 2 เป็น การในค่าวินาทีในการ (ได้เฉพาะเดินหน้าและถอยหลัง) ปุ่ม 3 ป้อน องศาล็อคไว้ที่กดเพิ่มทีล่ะ15องศา (ได้เฉพาะการเลี้ยวซ้าย-ขวา) ปุ่ม 4 ยืนยันการส่งค่า
อย่างเช่น คือ ผมป้อน F 10 แล้วกดยืนยัน มอเตอร์ก็จะหมุน 10 วิ แล้วหยุด
ช่วยบอกแนวทางทีนะครับ ขอบพระคุณมากครับผม
หัวข้อ: Re: รบกวนแนะแนวทางโค้ด ภาษาC การกดสวิตซ์แสดงผลจอแล้วเกบค่า
เริ่มหัวข้อโดย: Admin ที่ ธันวาคม 17, 2010, 06:42:48 PM
บอกใบ้เยอะแล้วน่ะ... การทำงานด้านไมโคร ต้องเข้าใจโครงสร้างทั้งอุปกรณ์ วงจร และโปรแกรม เพราะฉะนั้นสิ่งแรกที่ต้องออกแบบมาให้ได้เช่น - คุมมอเตอร์ไปหน้าไปหลัง ใช้สายควบคุมกี่เส้น เข้าพอร์ทไหน ควบคุมด้วย 0 หรือ1 เช่น 00 คือหยุด 01 คือไปหน้า ,10 กลับหลัง - คุมมอเตอร์เลี้ยวซ้ายขวา ใช้มอเตอร์แบบไหน สเต็บมอเตอร์คุมองศาได้จริง แบบดีซี ต้องมีการอ่านค่ากลับมาว่าองศาได้จริงไหม เซอร์โวมอเตอร์ก็ดี แล้วขาสัญญาณนั้น ควบคุมกี่เส้น เข้าพอร์ทไหน - LCD คุมแบบ 4 บิท หรือ 8 บิท กี่บรรทัด ตัวแปรพวกนี้จะใช้ในการกำหนดพอร์ทต่างๆ ควรทำความเข้าใจก่อนเขียนโปรแกรมควบคุม หากต้องการให้ช่วย ให้วาดวงจรมาโดยละเอียด (ช่วยได้เฉพาะ MCS-51) การเชื่อมต่อพอร์ท ขาสัญญาณที่ใช้ และสิ่งแรกที่ต้องทำเองให้ได้ก่อน คือการแสดงผลที่หน้าจอ LCD /* ภาษาซี ( keil ) สำหรับ 8051 */ #include<reg51.h>
/* กำหนดขาติดต่อของสวิทช์ */ sbit k1= P1^0; //// กำหนดการต่อปุ่มกด /* สมมุติว่าใช้ พอร์ท 1.0 ต่อ R pull up ไว้ ปกติค่าจะเป็น 1 กดจะเป็น 0 */ sbit k2= P1^1; //// กำหนดการต่อปุ่มกด sbit k3= P1^2; //// กำหนดการต่อปุ่มกด sbit k4= P1^3; //// กำหนดการต่อปุ่มกด
/* ตัวแปรสำหรับการกดคีย์ และเลือกค่า */ unsigned char menu=1; ///// menu เก็บค่าฟังชั่นการทำงาน unsigned char timerDelay=1; ///// timerDelay เก็บค่าฟังชั่นการทำงาน unsigned char Degree=1; ///// Degree เก็บค่าฟังชั่นการทำงาน
void delay1sec(); /// ฟังชั่นหน่วงเวลา 1 วิ { ........ }
voide ControlDelay(unsigned char d) { unsigned char i;
for(i=0;i<d;i++) //// วนลูปตามเวลาที่กำหนด ค่า d { delay1sec(); /// เรียกใช้ฟังชั่นหน่วงเวลา 1 วิ }
}
/* ฟังชั่นควบคุมการหมุน */ voide ControlDegree(unsigned char dg) { /* สั่งให้มอเตอร์ตัวที่ 2 ตัวคุมคุมการหมุนล้อให้หมุนตามค่า dg dg= 1 ให้หมุน 15 องศา dg= 2 ให้หมุน 30 องศา dg= 3 ให้หมุน 45 องศา
*/
}
/* ฟังชั่นการกดปุ่ม*/
/////////////// key1() void key1() { menu++; //// เพิ่มค่า menu
if(menu==5) //// หากค่า menu เกิน 4 ให้กลับไปเริ่มต้นที่ 1 { menu=1;
}
if(menu==1) { แสดงผล F } else if(menu==2) { แสดงผล U } else if(menu==3) { แสดงผล R } else if(menu==4) { แสดงผล L }
}
/////////////// key2() void key2() { timerDelay++; //// เพิ่มค่า Delay
if(timerDelay==20) //// หากค่า Delay เกิน 20 ให้กลับไปเริ่มต้นที่ 1 { timerDelay=1; }
} /////////////// key3() void key3() { Degree++; if(Degree==3) /* หากค่า Degree เกิน 3 ให้กลับไปเริ่มต้นที่ 1 (15*3 = 45 องศา ) */ { Degree=1; } }
/////////////// key4() void key4() { if(menu==1) { /* คุมมอเตอร์ให้ทำงานไฟหน้า*/ .....มอเตอร์หมุนไปหน้า ControlDelay(timerDelay); /// หน่วงเวลา .....มอเตอร์หยุดหมุน
} else if(menu==2) { /* คุมมอเตอร์ให้ทำงานถอยหลัง */ .....มอเตอร์หมุนไปหลัง ControlDelay(timerDelay); /// หน่วงเวลา .....มอเตอร์หยุดหมุน
} else if(menu==3) { /* คุมมอเตอร์ให้ทำงานเลี้ยวซ้าย */ .....มอเตอร์หมุนไปซ้าย ControlDegree(Degree); .....มอเตอร์หยุดหมุน
} else if(menu==4) { /* คุมมอเตอร์ให้ทำงานเลี้ยวขวา*/ .....มอเตอร์หมุนไปขวา ControlDegree(Degree); .....มอเตอร์หยุดหมุน } }
void Delay() ///// หน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์ { . . .
}
void scankey() ///// ฟังชั่นอ่านค่าการกดปุ่ม {
if( k1 ==0) /// เมื่อปุ่ม key 1 โดนกด { Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์ key1(); /// เรียกใช้ฟังชั่น key1() }
if( k2 ==0) /// เมื่อปุ่ม key 2 โดนกด { Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์ key2(); /// เรียกใช้ฟังชั่น key2() }
if( k3 ==0) /// เมื่อปุ่ม key 3 โดนกด { Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์ key3(); /// เรียกใช้ฟังชั่น key3()) }
if( k4 ==0) /// เมื่อปุ่ม key 4 โดนกด { Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์ key4(); /// เรียกใช้ฟังชั่น key4() }
}
void LCD_Init() // เซ็ทค่าติดต่อ LCD { . . .
}
void LCDDisplay() //// แสดงผลที่จอ { . . . . }
void main() {
k1=1; //// กำหนดพอร์มเชื่อมต่อ key 1 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 ) k2=1; //// กำหนดพอร์มเชื่อมต่อ key 2 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 ) k3=1; //// กำหนดพอร์มเชื่อมต่อ key 3 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 ) k4=1; //// กำหนดพอร์มเชื่อมต่อ key 4 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 )
LCD_Init(); // เซ็ทค่าติดต่อ LCD
while(1) /// วนลูบไม่รู้จบ { scankey(); /// อ่านค่าการกดปุ่ม LCDDisplay(); //// แสดงผลที่จอ }
}
หัวข้อ: Re: รบกวนแนะแนวทางโค้ด ภาษาC การกดสวิตซ์แสดงผลจอแล้วเกบค่า
เริ่มหัวข้อโดย: karnbasic ที่ ธันวาคม 18, 2010, 01:11:36 AM
สุดยอดครับ กระผมขอนำไปอ่านก่อนนะครับ
ขอบคุณมากๆครับ
*สำหรับการขับมอเตอร์ผมได้เขียนไว้แล้วอ่ะคับ ตอนนี้ผมเขียนควบคุมแบบรถกระป๋องได้ แต่ผมมีการปรับเปลี่ยนการทำงาน เลยไม่รู้โค้ดในส่วนนี้อ่ะครับ คืออย่างที่บอก ตอนแรกที่ผมเขียน มันเป็นแบบ กดแล้วทำตามคำสั่งทันที
แต่ปรับจากกดแล้วทำตามคำสั่งทันที เป็นการป้อนค่าทาง LCD แล้วค่อยกดยืนยันการทำงาน
* ควบคุมมอเตอร์ของผมใช้หลักการเดียวกับท่านเลยครับ คือ ใช้ มอเตอร์2ตัว ต่อพอร์ตเรียบร้อยแล้ว โดยใช้ 01 ทำงาน 10 ทำงาน 11 หยุด
*การควบคุมการเลี้ยว ผมใช้ compass เอาอ่ะคับ คือจะส่งค่าจากรีโมทไปให้คอนโทรลเลอร์บนหุ่นยนต์ไปอ่านค่าจาก compass แล้วค่อยสั่งมอเตอร์ทำงาน ก็เป็นแนวคิดของผมในตอนนี้อ่ะคับ
ท่านมีแนวทางอ่านหรือแนวคิดที่แตกต่างกันออกไป โปรดช่วยชี้แนะหน่อยนะครับ
* LCD ของผมไม่รู้ว่ากี่บิทอ่ะคับ ฮ่าๆ รู้แต่่ว่า ใส่ได้บรรทัดล่ะ 13 ตัว 2 บรรทัดอ่ะครับ
ประมาณนี้ครับ เด๋วผมลองศึกษาจากโค้ดที่ท่านให้มาก่อนนะครับ ถ้าติดขัดยังไงผมจะกลับมาถามอีกทีนะครับผม
ขอบคุณมากครับ*-*
หัวข้อ: Re: รบกวนแนะแนวทางโค้ด ภาษาC การกดสวิตซ์แสดงผลจอแล้วเกบค่า
เริ่มหัวข้อโดย: Admin ที่ ธันวาคม 18, 2010, 07:25:54 AM
LCD นั้น สามารถควบคุมการแสดงผล โดยการกำหนดขาสัญญาณ D0-D7 พร้อมกันเรียกว่าการควบคุมแบบ 8 บิท
(http://www.thaimicrotron.com/Referrence/LCD/Graph/LCD8bit-1.gif)
หากส่งข้อมูลไปแบบ D4-D7ก่อน แล้วส่ง D4-D7 ไปอีกครั้ง เรียกว่าการส่งแบบ 4 บิท ( ที่จริงคือการส่ง 4 บิทบน 4 บิทล่าง รวมกันก็คือ 8 บิท นั่นเอง ) แบบนี้นิยมเนื่องจากประหยัดขาสัญญาณ แต่ต้องเขียนโปรแกรมยากขึ้นอีกหน่อย
(http://www.thailabresearch.com/images/article/LCD4Bit.gif)
|