เขียน C ใน CCS for PIC เพื่อเอามารันในโปรแกรม Proeus ไปไม่เป็นเลย (มีรูป+Code)

  • 20 Replies
  • 9398 Views
ไม่ได้สักทีครับ เห้อหากพี่ๆ คนไหนใจดีช่วยแก้โคดให้ผมทีเถอะครับ ผมอยากได้สำเร็จรูปแล้วมาศึกษาเอง แบบนี้ผมยังงง อยู่เลยครับ เห้อ

*

Offline JMew

  • ***
  • 180
  • เจ๊มารอค่ะ
    • View Profile
โอ้ย ป่วย จ่ายค่าเทอมให้มันเป็นเงินเดือนทำไม อาจารย์แบบนี้

เอ้านี่ อ่าน http://esd.cs.ucr.edu/labs/decode_key/decode_key.html

อย่าบอกว่าอ่านภาษาอังกฤษไม่ได้นะ อาเซียนจะเปิดแล้ว ที่จริงควรฟังพูดอ่านเขียนได้สี่ภาษาด้วยซ้ำ
โครงการกะเทยท่องโลก

*

Offline JMew

  • ***
  • 180
  • เจ๊มารอค่ะ
    • View Profile
เอานะ พี่จะอธิบายนะ ให้ดูรูปที่น้อง attach มาตามไปด้วย ตอนนี้น้องมี 4 แถว 3 หลัก (แต่ไม่ยักเริ่มที่ B0 โรงเรียนไหนสอนเนี่ย?)


          B5  B6  B7

          1    2    3     B1
         
          4    5    6     B2

          7    8    9     B3
         
          *    0    #    B4


พี่จะเริ่ม "สแกน" จาก แถวก่อนว่าน้องกดแถวไหน เพราะฉะนั้น จะให้หลักเป็น 0 0 0 หมด ให้แถวเป็น 1 1 1 1 จะได้ว่า
B7 B6 B5 B4 B3 B2 B1 B0
0    0   0    1   1   1   1   0  ตอนนี้ให้พอร์ต B มีสถานะเป็น 0x1E เสร็จแล้วอ่านกลับว่ามีการกดอะไรหรือเปล่า

สมมติให้ 0x1E ไป แต่อ่านกลับได้ 0x1E เหมือนเดิม แสดงว่าไม่มีการกดห่าอะไรเลยสักอย่าง
สมมติให้ 0x1E ไป แต่อ่านกลับได้ 0x1C แสดงว่า แถวแรกมีการกด เก็บค่า "1" ไว้
สมมติให้ 0x1E ไป แต่อ่านกลับได้ 0x1A แสดงว่า แถวที่สองมีการกด เก็บค่า "4" ไว้
สมมติให้ 0x1E ไป แต่อ่านกลับได้ 0x16 แสดงว่า แถวที่สามมีการกด เก็บค่า "7" ไว้
สมมติให้ 0x1E ไป แต่อ่านกลับได้ 0x0E แสดงว่า แถวที่สี่มีการกด เก็บค่า "10" ไว้ (ไม่เริ่มที่ B0 คำนวณยากชิบหาย)

ต่อมา เมื่อน้องรู้แล้วว่าแถวไหนที่มันถูกกดหรือไม่ถูกกด คราวนี้มา "สแกน" หลักกันบ้าง
จะให้หลักเป็น 1 1 1 หมด แต่ให้แถวเป็น 0 0 0 0 จะได้ว่า

B7 B6 B5 B4 B3 B2 B1 B0
 1    1   1   0  0    0   0   0  ตอนนี้ให้พอร์ต B มีสถานะเป็น 0xE0

ต่อมา ให้หนูทำเหมือนข้างบน คือ ให้พอร์ต B มีสถานะเป็น 0xE0 แล้วอ่านกลับ
ถ้าหนูอ่านกลับได้ 0xE0 แสดงว่าไม่มีการกดห่าอะไรซักอย่าง

ถ้าหนูอ่านกลับได้ 0xC0 แสดงว่า หลักที่ 1 ถูกกด
ให้เอาค่าที่เก็บไว้ มาบวก 0 (สมมติแถวที่ 1 ถูกกด เก็บค่า 1 ไว้ บวก 0 กลายเป็นเลข 1 ในแป้น)

ถ้าหนูอ่านกลับได้ 0xA0 แสดงว่า หลักที่ 2 ถูกกด
ให้เอาค่าที่เก็บไว้ มาบวก 1 (สมมติแถวที่ 1 ถูกกด เก็บค่า 1 ไว้ บวก 1 กลายเป็นเลข 2 ในแป้น)

ถ้าหนูอ่านกลับได้ 0x60 แสดงว่า หลักที่ 3 ถูกกด
ให้เอาค่าที่เก็บไว้ มาบวก 2 (สมมติแถวที่ 1 ถูกกด เก็บค่า 1 ไว้ บวก 2 กลายเป็นเลข 3 ในแป้น)

แต่ถ้าแถวที่ 4 ถูกกด หนูจะได้ 10 เป็นตัว * หนูจะได้ 11 เป็นเลข 0 และ 12 เป็นตัว #

อ่านคำของพี่ดี ๆ แล้วใช้ Calculator แปลงเลขฐาน 16 เป็นไบนารี่ แล้วจะเข้าใจ
 
 
โครงการกะเทยท่องโลก

*

Offline JMew

  • ***
  • 180
  • เจ๊มารอค่ะ
    • View Profile
เอ้าเขียนให้แล้ว เป็น mikrobasic Pro นะ

Code: [Select]

program SEVENSEGMENT

' Declarations section

dim Doutput as byte

main:
'   Main program
TRISD = 0
TRISB = 0
do
  PORTB = 0x1E
  PORTD = 121
  select case PORTB
 
  case 0x1C
    Doutput = 1
  case 0x1A
    Doutput = 4
  case 0x16
    Doutput = 7
  case 0x0E
    Doutput = 10
  End select
 
    PORTB = 0xE0
   
   select case PORTB

  case 0xC0
    Doutput = Doutput + 0
  case 0xA0
    Doutput = Doutput + 1
  case 0x60
    Doutput = Doutput + 2
  End select
 
  if Doutput = 11 then
  Doutput = 0
  end if
 
  select case Doutput
 
  case 1
   PORTD = 6
   
  case 2
   PORTD = 91
  case 3
   PORTD = 79
  case 4
   PORTD = 102
  case 5
   PORTD = 109
  case 6
   PORTD = 125
  case 7
   PORTD = 7
  case 8
   PORTD = 127
  case 9
   PORTD = 111
  case 0
   PORTD = 63
  case 10
   PORTD = 57
  case 12
   PORTD = 113
  End select
   delay_ms 10
loop until Doutput > 200

end.


รูปอยู่นี่



ส่วนโปรเจคทั้งหมด รวมทั้ง Source และ HEX และ Proteus DSN อยู่นี่ ลองเล่นดูนะ ถ้าเปลี่ยนใจมาใช้ BASIC ก็บอก จะเอา link ให้

http://cmu.mine.nu/teach/pic/7seg
โครงการกะเทยท่องโลก

ขอบคุณพี่ๆ ทุกๆคนมากครับ  ;D