BasicLite
เมษายน 04, 2020, 06:21:41 AM *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ ค้นหา เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]
  พิมพ์  
ผู้เขียน หัวข้อ: รบกวนแนะแนวทางโค้ด ภาษาC การกดสวิตซ์แสดงผลจอแล้วเกบค่า  (อ่าน 14714 ครั้ง)
karnbasic
บุคคลทั่วไป
« เมื่อ: ธันวาคม 16, 2010, 02:52:16 PM »

คืออยากรบกวนแนะแนวการเขียนโค้ด ภาษาซีครับผม คือ ผมมีปุ่มสวิตซ์อยู่ 4 ปุ่มด้วยกัน
*แนวทางคือป้อนค่าทางสวิตซ์แล้วแสดงบน LCD แล้วจะเก็บค่าที่ป้อนไว้ ไปใช้งานต่ออ่ะครับผม


ปุ่ม 1 เป็น กดครั้งแรก F-เดินหน้า
            กดครั้งที่2 U-ถอยหลัง
            กดครั้งที่3 L-เลี้ยวซ้าย
            กดครั้งที่4 R-เลี้ยวขวา

ปุ่ม 2 เป็น การในค่าวินาทีในการ (ได้เฉพาะเดินหน้าและถอยหลัง)
ปุ่ม 3 ป้อน องศาล็อคไว้ที่กดเพิ่มทีล่ะ15องศา (ได้เฉพาะการเลี้ยวซ้าย-ขวา)
ปุ่ม 4 ยืนยันการส่งค่า

อย่างเช่น คือ ผมป้อน F 10 แล้วกดยืนยัน มอเตอร์ก็จะหมุน 10 วิ แล้วหยุด

ช่วยบอกแนวทางทีนะครับ ขอบพระคุณมากครับผม
บันทึกการเข้า
Admin
Administrator
Full Member
*****
กระทู้: 119



« ตอบ #1 เมื่อ: ธันวาคม 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();  //// แสดงผลที่จอ
}



}


บันทึกการเข้า
karnbasic
บุคคลทั่วไป
« ตอบ #2 เมื่อ: ธันวาคม 18, 2010, 01:11:36 AM »

สุดยอดครับ กระผมขอนำไปอ่านก่อนนะครับ

ขอบคุณมากๆครับ

*สำหรับการขับมอเตอร์ผมได้เขียนไว้แล้วอ่ะคับ ตอนนี้ผมเขียนควบคุมแบบรถกระป๋องได้ แต่ผมมีการปรับเปลี่ยนการทำงาน เลยไม่รู้โค้ดในส่วนนี้อ่ะครับ
คืออย่างที่บอก ตอนแรกที่ผมเขียน มันเป็นแบบ กดแล้วทำตามคำสั่งทันที

แต่ปรับจากกดแล้วทำตามคำสั่งทันที เป็นการป้อนค่าทาง LCD แล้วค่อยกดยืนยันการทำงาน

* ควบคุมมอเตอร์ของผมใช้หลักการเดียวกับท่านเลยครับ คือ ใช้ มอเตอร์2ตัว ต่อพอร์ตเรียบร้อยแล้ว
   โดยใช้ 01 ทำงาน
           10 ทำงาน
           11  หยุด

*การควบคุมการเลี้ยว ผมใช้ compass เอาอ่ะคับ คือจะส่งค่าจากรีโมทไปให้คอนโทรลเลอร์บนหุ่นยนต์ไปอ่านค่าจาก compass แล้วค่อยสั่งมอเตอร์ทำงาน
ก็เป็นแนวคิดของผมในตอนนี้อ่ะคับ

ท่านมีแนวทางอ่านหรือแนวคิดที่แตกต่างกันออกไป โปรดช่วยชี้แนะหน่อยนะครับ

* LCD ของผมไม่รู้ว่ากี่บิทอ่ะคับ ฮ่าๆ รู้แต่่ว่า ใส่ได้บรรทัดล่ะ 13 ตัว 2 บรรทัดอ่ะครับ

ประมาณนี้ครับ เด๋วผมลองศึกษาจากโค้ดที่ท่านให้มาก่อนนะครับ ถ้าติดขัดยังไงผมจะกลับมาถามอีกทีนะครับผม

ขอบคุณมากครับ*-*
บันทึกการเข้า
Admin
Administrator
Full Member
*****
กระทู้: 119



« ตอบ #3 เมื่อ: ธันวาคม 18, 2010, 07:25:54 AM »

LCD นั้น สามารถควบคุมการแสดงผล โดยการกำหนดขาสัญญาณ D0-D7 พร้อมกันเรียกว่าการควบคุมแบบ 8 บิท




หากส่งข้อมูลไปแบบ D4-D7ก่อน แล้วส่ง D4-D7 ไปอีกครั้ง เรียกว่าการส่งแบบ 4 บิท ( ที่จริงคือการส่ง 4 บิทบน 4 บิทล่าง รวมกันก็คือ 8 บิท นั่นเอง )
 
แบบนี้นิยมเนื่องจากประหยัดขาสัญญาณ แต่ต้องเขียนโปรแกรมยากขึ้นอีกหน่อย


บันทึกการเข้า
หน้า: [1]
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.14 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!