วันอาทิตย์ที่ 31 พฤษภาคม พ.ศ. 2558

กำจัดไวรัสง่ายๆในคอม5 UNDO



กำจัดไวรัสง่ายๆในคอม5 UNDO
31/5/2558 SONGCHAI PRAPATRUNGSEE

กำจัดไวรัสง่ายๆในคอม5 UNDO

กำจัดไวรัสง่ายๆในคอม4 DIFFERENT RESTORE



กำจัดไวรัสง่ายๆในคอม4 DIFFERENT RESTORE
31/5/2558 SONGCHAI PRAPATRUNGSEE

กำจัดไวรัสง่ายๆในคอม4 DIFFERENT RESTORE

กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน2ตรวจเช็คสวิทช์ON




กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน2ตรวจเช็คสวิทช์ON
31/5/2558 SONGCHAI PRAPATRUNGSEE
กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน2ตรวจเช็คสวิทช์ON

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกาย
แตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

ดึงปลั๊กไฟออกก่อน
ตั้งย่านโอมห์
วัดสวิทช์ ON แล้วกดสวิทช์
ปรากฏว่าได้ 0.3โอมห์ แสดงว่าสวิทช์ดี

ถ้าได้โอมห์ไม่เกิน10โอมห์ก็แสดงว่าสวิทช์ดี



กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน1เช็คฟิวส์



กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน1เช็คฟิวส์
31/5/2558 SONGCHAI PRAPATRUNGSEE
กดไม่ติดพัดลมHATARIดิจิตอลรุ่นHC-S16D3 ตอน1เช็คฟิวส์

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกาย
แตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

ถอดแผงวงจรพัดลมดิจิตอลออกมาตามแบบวีดีโอ
เสียบปลั๊กไฟแล้ววัดไฟAC220V
ที่แผงวงจรพัดลม ปรากฏว่ามีไฟมา230VAC
แสดงว่าไฟมาแล้ว

ดึงปลั๊กไฟออก
ตั้งย่านโอมห์วัดคร่อมที่ฟิวส์
ถ้าได้ประมาณ0.3โอมห์ ก็แสดงว่าฟิวส์ไม่ขาด


วันเสาร์ที่ 30 พฤษภาคม พ.ศ. 2558

18F4550 DEBUG PORTผิดพลาดแต่18F452ดี MPLAB X IDE




18F4550 DEBUG PORTผิดพลาดแต่18F452ดี MPLAB X IDE
30/5/2558 SONGCHAI PRAPATRUNGSEE
18F4550 DEBUG PORTผิดพลาดแต่18F452ดี MPLAB X IDE

MPLAB X IDE รุ่น v3.00
XC8 รุ่น v1.34

18F4550 Debugด้วยSimulator
PORTB=255; จำลองได้แค่254

18F452 Debugด้วยSimulator
PORTB=255; จำลองได้แค่255 ไม่ผิดพลาด


เปลี่ยนเบอร์PICเปลี่ยนCOMPLILER MPLAB X IDE



เปลี่ยนเบอร์PICเปลี่ยนCOMPLILER MPLAB X IDE
30/5/2558 SONGCHAI PRAPATRUNGSEE
เปลี่ยนเบอร์PICเปลี่ยนCOMPLILER MPLAB X IDE

1 คลิกFile
2 คลิกProject Properties(ชื่อโปรเจค)
3 ตรงช่องFamily คลิกDrop Downเลือกตระกูล
4 ตรงช่องDevices
   คลิกDrop Downเลือกเบอร์ที่ต้องการจะเปลี่ยน
5 คลิกเลือกคอมไพล์เลอร์ที่ต้องการจะเปลี่ยน
6 คลิกเลือกSimulator
7 คลิกApply
8 คลิกOK เท่านี้ก็เปลี่ยนเสร็จเรียบร้อยแล้ว
  หรือจะตรวจสอบที่Dashboardก็ได้


วันศุกร์ที่ 29 พฤษภาคม พ.ศ. 2558

DASHBOARD MPLAB X IDEดูว่าใช้PICเบอร์อะไรใช้ROMRAMเท่าไร



DASHBOARD MPLAB X IDEดูว่าใช้PICเบอร์อะไรใช้ROMRAMเท่าไร
29/7/2557 SONGCHAI PRAPATRUNGSEE
DASHBOARD MPLAB X IDEดูว่าใช้PICเบอร์อะไรใช้ROMRAMเท่าไร

คลิกดูได้ที่ด้านซ้ายมือด้านล่าง
ถ้าไม่พบให้ Reset Windows
หรือ
1 คลิก Window
2 คลิก Dashboard

ก็จะได้ Dashboardมาดูข้อมูลแล้ว

RESET WINDOW MPLAB X IDEให้หน้าต่างกลับมาเป็นค่าเริ่มต้น



RESET WINDOW MPLAB X IDEให้หน้าต่างกลับมาเป็นค่าเริ่มต้น
29/7/2557 SONGCHAI PRAPATRUNGSEE
RESET WINDOW MPLAB X IDEให้หน้าต่างกลับมาเป็นค่าเริ่มต้น

ในกรณีที่มีการลากหน้าต่างไปมา
หรืออื่นๆทำให้หน้าต่างเปลี่ยนแปลงจนทำงานได้ลำบาก
ก็ต้องทำหน้าต่างให้กลับมาดังเดิม

1 คลิกWindow
2 คลิกReset Windows

เท่านี้หน้าต่างงานเขียนของเราก็จะกลับมาดังเดิมแล้ว

REPLACE MPLAB X IDEเปลี่ยนชื่อตัวแปร



REPLACE MPLAB X IDEเปลี่ยนชื่อตัวแปร
29/7/2557 SONGCHAI PRAPATRUNGSEE
REPLACE MPLAB X IDEเปลี่ยนชื่อตัวแปร

แบบที่1
ลากคลุมตัวแปรที่จะต้องการเปลี่ยนชื่อ
จากนั้นคลิกEdit คลิกReplace
เท่านี้ก็จะได้หน้าต่างFind+Replace ขึ้นมาแล้ว
ชื่อตัวแปรที่จะต้องการเปลี่ยนจะเข้ามาอยู่ในช่องFind
ส่วนช่องReplace ให้พิมพ์ชื่อที่ต้องการจะเปลี่ยนลงไป
แล้ว คลิกคำว่าReplace ก็จะทำการเปลี่ยนชื่อไปทีละตัว
หรือจะเคาะEnterก็ได้
ถ้าคลิกคำว่าReplace All
ก็จะเปลี่ยนชื่อทั้งหมดเพียงคลิกเดียว

แบบที่2
ลากคลุมตัวแปรที่จะต้องการเปลี่ยนชื่อ
จากนั้นกดปุ่มCtrl+H
ก็จะเกิดหน้าต่างFind+Replace ขึ้นมาแล้ว
จากนั้นเคาะปุ่มEnter
ก็จะเปลี่ยนชื่อไปทีละตัว


COMMENT MPLLAB X IDEปิดส่วนที่ไม่ต้องการ



COMMENT MPLLAB X IDEปิดส่วนที่ไม่ต้องการ
29/7/2557 SONGCHAI PRAPATRUNGSEE
COMMENT MPLLAB X IDEปิดส่วนที่ไม่ต้องการ

แบบที่1
คอมเม้นท์แบบบรรทัดเดียวหรือหลายบรรทัด
/*..........*/

แบบที่2
คอมเม้นท์แบบบรรทัดเดียว //…………
หรือลากคลุมส่วนที่จะคอมเม้นท์
แล้วชี้ที่DROP DOWN
แล้วคลิกที่แผ่นกระดาษขีดถูกหรือตัวNเฉียงสีเขียว
เท่านี้ก็จะปิดส่วนที่ไม่ต้องการได้แล้ว

FIND MPLAB X IDEค้นหาตัวแปรที่ต้องการดู



FIND MPLAB X IDEค้นหาตัวแปรที่ต้องการดู
29/7/2557 SONGCHAI PRAPATRUNGSEE
FIND MPLAB X IDEค้นหาตัวแปรที่ต้องการดู

FIND ค้นหาตัวแปรที่ต้องการดู

แบบที่1
ลากคลุมตัวหนังสือที่จะค้นหา
จากนั้นคลิกไอคอนรูปแว่น คลิกซ้ำๆ =ค้นหาเดินหน้า
หรือคลิกลูกศรชี้ซ้าย =ค้นหาถอยหลัง
หรือคลิกลูกศรชี้ขวา =ค้นหาเดินหน้า

แบบที่2
ลากคลุมตัวหนังสือที่จะค้นหา
กดCtrl+F จะมีหน้าต่างFind ขึ้นมา
คลิกลูกศรชี้ซ้าย =ค้นหาถอยหลัง
หรือคลิกลูกศรชี้ขวา =ค้นหาเดินหน้า
คลิกที่หน้าต่างFind
หรือกดปุ่มEnter =ค้นหาเดินหน้า

แบบที่3
ลากคลุมตัวหนังสือที่จะค้นหา
1 คลิกEdit
2 คลิกFind
3 กดปุ่มF3 =Find Next ค้นหาเดินหน้า
4 กดปุ่มShift+F3 =Find Previos ค้นหาถอยหลัง


TAB SIZE INDENT SIZE MPLAB X IDEย่อหน้าเลื่อนตัวอักษร




TAB SIZE INDENT SIZE MPLAB X IDEย่อหน้าเลื่อนตัวอักษร
29/5/2557 SONGCHAI PRAPATRUNGSEE
TAB SIZE INDENT SIZE MPLAB X IDEย่อหน้าเลื่อนตัวอักษร

Indent Size =ย่อหน้าตอนขึ้นบรรทัดใหม่
Tab Size =ขนาดเลื่อนตัวอักษรไปทางซ้ายหรือทางขวา

แบบที่1
กดTab =เลื่อนตัวหนังสือไปทางขวา
กดShift Tab =เลื่อนตัวหนังสือไปทางซ้าย

แบบที่2
คลิกที่ไอคอนรูปกระดาษลูกศรชี้ซ้าย =เลื่อนซ้าย
คลิกที่ไอคอนรูปกระดาษลูกศรชี้ขวา =เลื่อนขวา

การตั้งค่าIndent SizeและTab size
1 คลิกTools
2 คลิกOptions
3 คลิกEditor
4 คลิกFormatting
5 ติ๊กถูกOverride Global Options
6 คลิกที่ตัวเลขของIndent Size แล้วพิมพ์ตัวเลขที่ต้องการ
7 คลิกที่ตัวเลขของTab Size แล้วพิมพ์ตัวเลขที่ต้องการ
8 คลิกApply
9 คลิกOK
เท่านี้ก็จะได้ขนาดที่ต้องการแล้ว


วันพฤหัสบดีที่ 28 พฤษภาคม พ.ศ. 2558

กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน2ซ่อมสวิทช์ให้เหมือนใหม่




กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน2ซ่อมสวิทช์ให้เหมือนใหม่
28/5/2558 SONGCHAI PRAPATUNGSEE
กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน2ซ่อมสวิทช์ให้เหมือนใหม่

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกายแตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

ใช้น้ำมันโซแนกซ์ต่อท่อแดง
เพื่อจะได้ฉีดเข้าไปที่ร่องสวิทช์ได้แบบตรงจุด
จากนั้นเขย่ากระป๋องน้ำมันโซแนกซ์
เพื่อให้น้ำมันเข้ากัน

หลังจากฉีดน้ำมันโซแนกซ์แล้ว
ก็ทำการกดสวิทช์100ครั้ง
ทำอย่างนี้ซ้ำๆ3รอบ
ฉนวนที่เกาะอยู่ที่สวิทช์ก็จะหายไป
กลายเป็นสวิทช์ใหม่นั่นเอง


กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน1ตรวจเช็คสวิทช์




กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน1ตรวจเช็คสวิทช์
28/5/2558 SONGCHAI PRAPATRUNGSEE
กดไม่ติดคอมEMATCHINEรุ่นET1861 ตอน1ตรวจเช็คสวิทช์

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกายแตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

คอมตัวนี้ซื้อมาตั้งแต่ 22/4/2558
มีอาการวันที่ 23/5/2558
คอมตัวนี้ใช้งานมา5ปี1เดือน1วัน

เนื่องจากการใช้งานมานาน
ดังนั้นจึงมีฝุ่นเข้าไปเกาะสวิทช์ จนกลายเป็นฉนวน
ดังนั้นจึงไม่สามารถกดไฟสวิทช์3.3โวลท์ลงกราวด์ได้
ทำให้คอมไม่ติด

ลองวัดไฟได้3.295โวลท์ แสดงว่าไฟมาปกติ

ลองเอาปลายมิเตอร์แตะที่ขั้วสวิทช์ทั้ง2ขั้วให้ช็อทถึงกัน
ปรากฏว่าคอมติดขึ้นมาแล้ว

แสดงว่าสวิทช์มีโอมห์ประมาณKโอมห์-Mโอมห์
จึงทำให้สวิทช์กดไม่ติด
สวิทช์ที่ดีจะต้องมีโอมห์ต่ำกว่า10โอมห์หรือ0โอมห์ยิ่งดี

ตอนหน้าจะชุบชีวิตสวิทช์ให้กลับมาเหมือนใหม่
โดยไม่ต้องซื้อสวิทช์มาเปลี่ยน


WATCH SIMULATORของMPLAB X IDE




WATCH SIMULATORของMPLAB X IDE
27/5/2558 SONGCHAI PRAPATRUNGSEE
WATCH SIMULATORของMPLAB X IDE

เข้าไปที่Debugก่อนโดย
คลิกDebug>Debug Main Project
คลิกDebug>Pause

แบบที่1
1 คลิกขวาตัวแปรที่จะดู
2 คลิก New Watch เท่านี้ก็จะได้ตัวแปรที่ต้องการมาดูแล้ว

แบบที่2
1 คลิกDebug
2 คลิก New Watch
3 คลิกGlobal หรือ SFR
4 พิมพ์ชื่อตัวแปร หรือ SFR ที่ต้องการ
5 คลิกOK เท่านี้ก็จะได้ตัวแปรที่ต้องการมาดูแล้ว

แบบที่3 เปิดWatch
1 คลิกWindow
2 ชี้ไปที่Debugging
3 คลิก Wacthes  ก็จะได้หน้าต่างมาดูแล้ว


สร้างโปรเจคXC8ใหม่ 1สร้างด้วยSOURCE FILE






สร้างโปรเจคXC8ใหม่ 1สร้างด้วยSOURCE FILE
27/5/2558 SONGCHAI PRAPATRUNGSEE
สร้างโปรเจคXC8ใหม่ 1สร้างด้วยSOURCE FILE

1 คลิกFILE
2 คลิกNew Project
3 คลิกMicrochip Eembeded
4 คลิกStandalone Project
5 คลิกNext
6 คลิกDrop down ในTAB Family แล้วเลือกตระกูลPIC
   เช่น Advanved 8-bit MCUs (PIC18)
   คลิกDrop down ในTAB Device แล้วเลือกเบอร์PIC
7 คลิกNext
8 ตรงโฟลด์เดอร์Hardware Tools
  ให้ทำการเลือกเครื่องมือที่จะจำลองการทำงาน
   ในที่นี้ผมไม่มีเครื่องมือที่จะทำการจำลอง
   ผมจึงเลือกการSimulatorภายใน
   โดยการคลิกSimulator
9 คลิกNext
10 คลิกXC8……. ตรงที่มีปุ่มเขียว ต้องติดตั้งXC8ก่อน
11 คลิกNext
    ตรงช่องProject Name ให้ตั้งชี่อสอดคล้องกับงาน
    ตรงช่องProject Location คลิกBrowse
    เลือกว่าจะเก็บไว้ส่วนใดของคอมพิวเตอร์
    ตรงช่องEncoding เลือก ISO-8859-1(Default)
12 คลิกFinish เท่านี้ก็จะได้Projectแล้ว
13 คลิกขวาที่Source Files ชี้New
    คลิกC Source File หรือC Main File ก็ได้เหมือนกัน
14 ตรงช่องFile Name ตั้งชื่อไฟล์ให้สอดคล้อง
     หรือชื่อเดียวกันกับโปรเจคก็ได้
     ตรงช่องExtension เลือก c
15 คลิกFinish
     เท่านี้ก็จะมีไฟล์เข้าไปในSorce Files
     ของโปรเจคแล้ว
    จากนั้นก็เริ่มเขียนCode ได้เลย

สร้างด้วยSoruce Files จะเป็นไฟล์แผ่นกระดาษเปล่า
แต่ถ้าสร้างด้วยMain Files จะมีการเขียนส่วนหัวมาให้

เช่นวันที่ ผู้เขียน เป็นต้น


วันเสาร์ที่ 16 พฤษภาคม พ.ศ. 2558

พัดลมHATARIรุ่นHB-T16M2 ตอน13ไม่ส่ายเปลี่ยนเฉพาะเฟืองแท้ของHATARI



พัดลมHATARIรุ่นHB-T16M2 ตอน13ไม่ส่ายเปลี่ยนเฉพาะเฟืองแท้ของHATARI
8/4/2558 SONGCHAI PRAPATRUNGSEE
ซ่อมง่ายอาการไม่ส่ายพัดลมHATARIรุ่นHB-T16M2 ตอน2เปลี่ยนเฟืองแท้

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกาย
แตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

การใช้สว่านเจาะเหล็กให้ปรับหมุนถอยหลัง
จึงจะไขน็อทออกได้

ในตอนที่แล้วใช้สว่านเจาะเหล็ก
ไขน็อทออกพลาดน็อทรูด
ให้ทำการถอดเอาเฉพาะเฟืองมาใส่แทน

ก่อนถอดฝาครอบออก
จะต้องกดจุกส่ายหรือแกนลงมาก่อน
เพื่อไม่ให้ลูกปืน2ลูกและสปริงหลุดออกมา

จากนั้นถอดฝาครอบของเก่าและของใหม่ออก
ให้ทำการดึงเฟืองของเก่าและของใหม่ออกทั้งหมด
1 แกนล็อคเฟืองแกนเพลา
ภายในแกนล็อคเฟืองแกนเพลา
จะมีลูกปืน2ลูกและสปริง1เส้น
ใช้สำหรับล็อคเฟืองแกนเพลาเพื่อส่าย
2 เฟืองแกนเพลา
จะจับอยู่ที่ส่วนปลายที่เป็นเกลียวของแกนมอเตอร์พัดลม
3 เฟืองส่ายหรือเฟืองขับ จะอยู่นอกอลูมิเนียม
เฟืองนี้ถ้าหมุนจะทำให้ก้านเหล็กหมุนจึงทำให้ส่ายได้

การดึงชุดแกนล็อคเฟืองแกนเพลาออก
จะต้องทำด้วยความระมัดระวัง
โดยการบีบแกนล็อคเฟืองแกนเพลา
กับเฟืองแกนเพลา เข้าหากัน
แล้วเอาไปใส่แทนที่ของเก่า
ถ้าไม่บีบไว้จะทำให้ลูกปืนกระเด็นออกมา

เปลี่ยนเฟืองส่ายหรือเฟืองขับ
เฟืองส่ายหรือเฟืองขับของดี
จะต้องขยับขึ้นไม่เกิน2มม.
ขยับลงไม่เกิน2มม.
ถ้าของเสียจะขยับได้ประมาณขึ้น5มม. ลง5มม.

จากนั้นประกอบกับเข้าไปก็ใช้ได้แล้ว

ในกรณีลูกปืนหลุดออกมา
ก็สามารถใส่กลับเข้าไปได้อย่างง่ายดาย
แต่ส่วนใหญ่แล้วจะลูกปีนกระเด็นหายไป
แล้วหาไม่เจอเพราะลูกปืนกลมและเล็ก
ให้ไปที่ร้านขายอะไหล่อิเลคทรอนิคส์
บอกว่าจะซื้อลูกปืนแกนส่ายพัดลม
ขายเป็นชุดๆละ 8บาท มาใส่ได้ครับ


พัดลมHATARIรุ่นHB-T16M2 ตอน12ไม่ส่ายเปลี่ยนชุดเฟืองของแท้HATARIไม่สำเร็จ



พัดลมHATARIรุ่นHB-T16M2 ตอน12ไม่ส่ายเปลี่ยนชุดเฟืองของแท้HATARIไม่สำเร็จ
8/4/2558 SONGCHAI PRAPATRUNGSEE
ซ่อมง่ายอาการไม่ส่ายพัดลมHATARIรุ่นHB-T16M2 ตอน1เปลี่ยนชุดเฟืองของแท้HATARI

การซ่อมต้องใส่รองเท้า และห้ามเปียกน้ำ
และห้ามมีส่วนใดส่วนหนึ่งของร่างกาย
แตะถูกตัวนำไฟฟ้า
เพราะอันตรายอาจถึงชึวิตได้

เวลาส่ายจะมีเสียงก๊อกๆแต่ไม่ส่าย
ถ้ายกพัดลมแหงนหน้าขึ้นก็จะสามารถส่ายได้
สาเหตุเพราะเวลาแหงนหน้าขึ้นเฟืองจะไม่ถูกกด
จึงทำให้สามารถส่ายได้

แต่ถ้ากดลงสุดเฟืองจะถูกกดแรงที่สุดทำให้เฟืองรูด
หรือไม่ส่ายนั่นเอง

ซื้อชุดเฟืองจากห้างที่มีพัดลมHATARIจำหน่าย
ให้บอกพนักงานHARARIว่าจะสั่งซื้อ
ชุดเกียร์บล็อคของพัดลม16นิ้ว ราคา50บาท
ทุกวันพฤหัสจะมีรถของพัดลมHATARIเข้ามาที่ห้าง
นั่นหมายความว่าถ้าสั่งของแล้ว
จะได้ในวันพฤหัสตอนเย็นนั่นเอง

ชุดเกียร์บล็อคหรือชุดเฟืองส่าย
จะมาพร้อมอลูมิเนียมที่หุ้มเฟือง
และมีจารบีทามาให้เรียบร้อยแล้ว
เราไม่ต้องทาเพิ่มเติมใดๆ
จาระบีจะทามาให้นิดเดียว
พอเวลาทำงานก็จะกลิ้งไปทั่วนั่นเอง

ถอดน็อตที่ยึดชุดเกียร์บล็อค2ตัวของเดิมออก
แล้วสวมของใหม่เข้าไปก็ใช้ได้แล้ว

แต่ในกรณีถ้าถอดไม่ดีอาจทำให้หัวน็อท รูดได้
ในกรณีนี้ผมใช้สว่านเจาะเหล็กไขออกมา
แต่พื้นที่จำกัดผมเอียงสว่านทำให้หัวน็อท รูด
นั่นหมายความว่าจะต้องเปลี่ยนเฉพาะเฟืองเท่านั้น

เดี๋ยวตอนหน้าจะมาเปลี่ยนเฉพาะเฟืองกัน


ประหยัดรอม ตอน5ใช้ฟังชันตั้งแต่2ครั้งจะประหยัดรอมได้มาก



ประหยัดรอม ตอน5ใช้ฟังชันตั้งแต่2ครั้งจะประหยัดรอมได้มาก
11/5/2558 SONGCHAI PRAPATRUNGSEE
ประหยัดรอม ตอน5ใช้ฟังชันตั้งแต่2ครั้งจะประหยัดรอมได้มาก

#include <REGX52.H>
#include <intrins.H>
/* USE 11.0592MHZ WRITE 24256 WORK(AT LEAST 5MS)
   IF USE 12MHZ WRITE 24256 NOT WORK
   AT TIME VALUE 0XEDFF
   DELAY WRITE 24256 AT LEAST 5MS(EDFF) =WORK
   DELAY READ 24256 AT LEAST 4.167MS(F10F) =WORK */

/* SAME AS 2416
   DELAY WRITE 2416 AT LEAST 5MS(EDFF) =WORK
   BUT SIMULATE WITH PROTEUS 5MS NOT WORK
   10MS WORK */

//1MATCHINE CYCLE =1.085US
//INTERRUPT EVERY 100HZ =10MS
//100 =1SEC

/*i++ =CODE 1139 BYTE
i-- =CODE 1136 BYTE
SAVE CODE 3 BYTE */

#define X 256-10//OVF256-3 =13US(CRYSTAL12MHZ)
/* -4=14US -5=15US -255=265US -256=267US */

//#define  's' 0xf0;
sbit COIN_B=P0^0;   //sbit =COMMAND, COIN1_B=VARIABLE NAME, P3^5=PIN 3.5
sbit DISPLAY1_B=P0^1;
sbit DISPLAY2_B=P0^2;
sbit CLEAR1_B=P0^3;
sbit CLEAR2_B=P0^4;

//sbit SDA=P0^6;//REAL
//sbit SCL=P0^7;//REAL
sbit SDA=P2^0;//SIMULATE
sbit SCL=P2^1;//SIMULATE

sbit DG0=P3^0;
sbit DG1=P3^1;
sbit DG2=P3^2;
sbit DG3=P3^3;

unsigned char DATA[]={0XEB,0X28,0XB3,0XBA,0X78,
  0XDA,0XDB,0XA8,0XFB,0XFA,};    

char DGIT,N;
char SET_L;

unsigned char COIN1_T;
unsigned int TOTAL_T,B_T;

unsigned int COINSAVE_T,COIN_T;
unsigned int DISPLAY1_T,DISPLAY2_T;
unsigned int CLEAR1_T,CLEAR2_T;
unsigned int BLINK_T;     
bit COIN1_W;
bit DOWN_L;

unsigned char DATA0,DATA1,DATA2,DATA3;
unsigned char COIN1,COIN2,COINN;
unsigned char COIN,SAVE_COIN;

bit MAXCOIN1_W,MAXCOIN2_W;
bit DISPLAY1_W,DISPLAY2_W;
bit DISPLAYCLEAR1_W,DISPLAYCLEAR2_W;
bit CLEAR1_W,CLEAR2_W;
bit COINSAVE_W,COIN_W=1;

bit COIN1_L,COIN_L;
bit DISPLAY1_L,DISPLAY2_L,CLEAR1_L,CLEAR2_L;
bit ER04_W;
void ERROR(unsigned char DIGIT1,DIGIT2,DIGIT3,DIGIT4)
{
                        BLINK_T++;//64
                        if(BLINK_T<=100)//65 500MS
                        {
                              switch (DGIT)//70
                              {
                                    case 0://71
                                    DG0=DG1=DG2=DG3=1;//72 DG2 DG1 OFF    
                                    DG0=0;//73 DG1 ON
                                   
                                    P1=DIGIT4;//74 NUMBER2

                                    DGIT=1;//75
                                    break;//76
                                    case 1://77
                                    DG0=DG1=DG2=DG3=1;//78 DG2 DG1 OFF    
                                    DG1=0;//79 DG2 ON

                                    P1=DIGIT3;//80 NUMBER5
                                    DGIT=2;//81
                                    break;//82
      case 2://77
                                    DG0=DG1=DG2=DG3=1;//78 DG2 DG1 OFF    
                                    DG2=0;//79 DG2 ON

                                    P1=DIGIT2;//80 NUMBER5
                                    DGIT=3;//81
                                    break;//82   
      case 3://77
                                    DG0=DG1=DG2=DG3=1;//78 DG2 DG1 OFF    
                                    DG3=0;//79 DG2 ON

                                    P1=DIGIT1;//80 NUMBER5
                                   
                                    DGIT=0;//81
                                    break;//82                                       
                              }                                              
                        }else
                        if(BLINK_T<=200)
                        {
                              if(BLINK_T==200)
                              {
                                    BLINK_T=0;
                                    if(N++>5)
                                    {
                                     P1=255;
                                          P3=255;
                                          TR2=0;
                                    }
                              }
                              DG0=DG1=DG2=DG3=1;//89 OFF
                        }                            
}

void DELAY_T0M2(unsigned char TIME)
{
  //TIMER0 MODE2 8BIT AUTO RELOAD
  //TH0=255;//HI BYTE FOR AUTO RELOAD TO LOW BYTE

  TF0=0;//TIMER0 OVERFLOW
            //TH0=254;
            TL0=TIME;//LOW BYTE
            TR0=1;//TIMER START

  while(TF0==0);
  TR0=0;//TIMER STOP
}

void CONVERT_DEC_TO_UNIT(unsigned int NUMBER)
{
   unsigned char NUM;
   NUM=((NUMBER%10000)/1000);//PAN
   DATA3=DATA[NUM];

   NUM=((NUMBER%1000)/100);//ROY
   DATA2=DATA[NUM];
 
   NUM=((NUMBER%100)/10);//SIB
   DATA1=DATA[NUM];

   NUM=NUMBER%10;//NAUY
   DATA0=DATA[NUM];
}

void CUT_ZEROS()
{
  if(DATA3==DATA[0])
  {  
    DATA3=0X00;
    if(DATA2==DATA[0])
    {  
      DATA2=0X00;
      if(DATA1==DATA[0])
      {  
        DATA1=0X00;                          
      }                        
    }                        
  }       
}

void DISPLAY_COIN(unsigned char NUMBER)
{
  CONVERT_DEC_TO_UNIT(NUMBER);
  CUT_ZEROS();
  switch (DGIT)
  {
     case 0:
       //DG0=DG1=DG2=DG3=0;//REAL    
       //DG0=1;
       DG0=DG1=DG2=DG3=1;//SIMULATE    
       DG0=0;
      
       P1=DATA0;

       DGIT=1;
       break;
     case 1:
       //DG0=DG1=DG2=DG3=0;//REAL    
       //DG1=1;
       DG0=DG1=DG2=DG3=1;//SIMULATE    
       DG1=0;
        
       P1=DATA1;
       DGIT=2;
       break;
     case 2:
       //DG0=DG1=DG2=DG3=0;//REAL     
       //DG2=1;
       DG0=DG1=DG2=DG3=1;//SIMULATE    
       DG2=0;
      
       P1=DATA2;

       DGIT=3;
       break;
     case 3:
       //DG0=DG1=DG2=DG3=0;//REAL    
       //DG3=1;
       DG0=DG1=DG2=DG3=1;//SIMULATE    
       DG3=0;
      
       P1=DATA3;
       DGIT=0;
       break;
     default:
       DGIT=0;
       break;
  }
}

void I2C_START()
{
  SCL=1;
       DELAY_T0M2(X);
  SDA=1;
  DELAY_T0M2(X);
  SDA=0;
  DELAY_T0M2(X);    
  SCL=0;
  DELAY_T0M2(X);
}
void I2C_STOP()
{
  SDA=0;
       DELAY_T0M2(X);     
  SCL=1;
  DELAY_T0M2(X);          
  SDA=1;
       DELAY_T0M2(X);     
}
void I2C_TX(unsigned char DATTX)
{
  char i;
      for (i=8;i>0;i--)
      {
            if ((DATTX&0x80)==0x80)SDA=1;
            else SDA=0;
       DELAY_T0M2(X);
            SCL=1;
                        DELAY_T0M2(X);
            SCL=0;
                        DELAY_T0M2(X);
            DATTX<<=1;
      }
      SDA=1;//SEND ACK FOR 24CXX PULL LOW
            DELAY_T0M2(100);
            if(SDA==1)
  {
                   ER04_W=1;
            }
           
      SCL=1;
            DELAY_T0M2(X);
      SCL=0;
            DELAY_T0M2(X);
}

unsigned char I2C_RX()
{
      unsigned char i,DATRX=0;
  SDA=1;//IF THIS ROW NONE DISPLAY TEMPERATURE 0.00       
      for(i=8;i>0;i--)
      {
            DATRX<<=1;    
            SCL=1;
    DELAY_T0M2(X);              
            if(SDA)//SDA DEFAULT=1
            {
                   DATRX|=0X01;
            }
            else
            {
                   DATRX&=0XFE;
            }
                        DELAY_T0M2(X);
            SCL=0;
                        DELAY_T0M2(X);      
      }
  SDA=1;//SEND ACK1 FOR24CXX PULL LOW
  DELAY_T0M2(X);
            SCL=1;
  DELAY_T0M2(X);
            SCL=0;
            DELAY_T0M2(X);
      return DATRX;
}

void WRITE_24CXX(unsigned char ADDRESS,DATWR)
{    
      I2C_START();
     
  I2C_TX(0XA0);//Control=Bit7654,Address=bit321(A2A1A0),ReadWrite=bit0
      I2C_TX(ADDRESS);
     
      I2C_TX(DATWR);

      I2C_STOP();
}
unsigned int READ_24CXX(unsigned char ADDRESS)
{
      unsigned char DATRX;
     
      I2C_START();

  I2C_TX(0XA0);//Control=Bit7654,Address=bit321(A2A1A0),ReadWrite=bit0           
      I2C_TX(ADDRESS);

      I2C_START();
      I2C_TX(0XA1);
     
  DATRX=I2C_RX();

      I2C_STOP();

      return DATRX;
}

void T2_16BIT_AUTO()interrupt 5
{
  TF2=0;//TIMER2 OVERFLOW FLAG =CLEAR
  if(ER04_W==1)
  {
   ERROR(DATA[2],DATA[4],DATA[0],DATA[4]);
              return;
            }
     
      if(COIN_W==1)
  {
    DISPLAY_COIN(COINN);
    DISPLAY1_W=0;
  }
 
  if(COIN_B==0&&COIN_L==0)
  {
    if(++COIN_T>=4)//DELAY 20MS
    {     
      COIN_T=0;
      COIN_L=1;
     
      COIN++;
      COINN=COINN+COIN;
      COIN1=COIN1+COIN;
     
      COIN2=COIN2+COIN;
      COIN=0;
      COIN_W=1;
      DISPLAY1_W=0;
      DISPLAY2_W=0;
      COINSAVE_W=1
    }      
  }else if(COIN_B==1)
  {
    COIN_L=0;
    COIN_T=0;
  }
  if(COINSAVE_W==1)
  {
    if(++COINSAVE_T>=40)//200MS
    {
      TR2=0;
      TH2=0X2A;//HI BYTE TIMER2//DBFF=10MS AT 11.0592MHZ
      TL2=0XF8;//LOW BYTE TIMER2
      TR2=1;

      switch(SAVE_COIN)
      {     
        case 0://COIN1_TOTAL
         
          WRITE_24CXX(1,COIN1);
       
          SAVE_COIN=1;
 
          break;
        case 1://COIN1_SAVE        
         
          WRITE_24CXX(2,COIN2);
        
          COINSAVE_W=0;         
          SAVE_COIN=0;
          break; 
      }  
   
    }
  }
   
  if(DISPLAY1_B==0&&DISPLAY1_L==0)
  {
    if(++DISPLAY1_T>=4)//DELAY 20MS
    { //COIN1=5000;
     
      DISPLAY1_T=0;
      DISPLAY1_L=1;
  
      DISPLAY1_W=1;
      DISPLAY2_W=0;
      COIN_W=0;
      COINN=0
    }      
  }else if(DISPLAY1_B==1)
  {
    DISPLAY1_L=0;
    DISPLAY1_T=0;
  }
  if(DISPLAY1_W==1)
  {
    DISPLAY_COIN(COIN1);
   
  }
     
  if(DISPLAY2_B==0&&DISPLAY2_L==0)
  {
    if(++DISPLAY2_T>=4)//DELAY 20MS
    {     
      DISPLAY2_T=0;
      DISPLAY2_L=1;
  
      DISPLAY2_W=1;
      DISPLAY1_W=0;
      COIN_W=0;
      COINN=0
    }      
  }else if(DISPLAY2_B==1)
  {
    DISPLAY2_L=0;
    DISPLAY2_T=0;
  }
  if(DISPLAY2_W==1)
  {
    DISPLAY_COIN(COIN2);   
  }

  if(CLEAR1_B==0&&CLEAR1_L==0)
  {
    if(++CLEAR1_T>=4)//DELAY 20MS
    {
      CLEAR1_T=0;
      CLEAR1_L=1;
      CLEAR1_W=1;
      DISPLAY1_W=1;
      DISPLAY2_W=0;
     
      COIN_W=0;
      COINN=0
    }      
  }else if(CLEAR1_B==1)
  {
    CLEAR1_L=0;
    CLEAR1_T=0;
  }

  if(CLEAR1_W==1)
  {
    CLEAR1_W=0;
    COIN1=0;
       
    TR2=0;
    TH2=0XDB;//HI BYTE TIMER2//DBFF=10MS AT 11.0592MHZ
    TL2=0XFF;//LOW BYTE TIMER2
    TR2=1;
    WRITE_24CXX(1,COIN1);                                            
  }
 
  if(CLEAR2_B==0&&CLEAR2_L==0)
  {
    if(++CLEAR2_T>=4)//DELAY 20MS
    {
      CLEAR2_T=0;
      CLEAR2_L=1;
  
      CLEAR2_W=1;
      DISPLAY2_W=1;
      DISPLAY1_W=0;
      COIN_W=0;
      COINN=0
    }      
  }else if(CLEAR2_B==1)
  {
    CLEAR2_L=0;
    CLEAR2_T=0;
  }
  if(CLEAR2_W==1)
  {
    CLEAR2_W=0;
    COIN2=0;

    TR2=0;
    TH2=0XDB;//HI BYTE TIMER2//DBFF=10MS AT 11.0592MHZ
    TL2=0XFF;//LOW BYTE TIMER2
    TR2=1;

    WRITE_24CXX(2,COIN2);                           
  }  
}
   
void main()
{ TMOD=0X02;
  T2MOD=0;//TIMER2 MODE
  T2CON=0;//TIMER2 CONTROLL
 
  TH2=0XED;//HI BYTE TIMER2//EDFF=5MS AT 11.0592MHZ
  TL2=0XFF;//LOW BYTE TIMER2
  RCAP2H=0XED;//HI BYTE AUTO RELOAD TIMER2
  RCAP2L=0XFF;//LOW BYTE AUTO RELOAD TIMER2
  IE=0XA0;//INTERRUPT ENABLE
  IP=0;//INTERRUPT PRIORITY
       //TH0=255;//HI BYTE TIMER0 MODE2 FOR AUTORELOAD
  //TL0=255;//LOW BYTE TIMER0
  TR2=1;//START TIMER2

  //IF DELAY THIS ROW NOT WORK =BUG OF PROTEUS
  //DELAY_T1M1(0XF1,0X0F);//0XF10F =4.167MS
  COIN1=READ_24CXX(1);
  //DELAY_T1M1(0XED,0XFF);//0XEDFF =5MS
 
  COIN2=READ_24CXX(2)
  //DELAY_T1M1(0XED,0XFF);//0XEDFF =5MS
 
  while(1)
  {

  }
}