นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน
อ่าน: 1257
ความเห็น: 0

7 Segment Multiplexing With Raspberry Pi

7 Segment Raspberry Pi

7 Segment Multiplexing With Raspberry Pi

7 segments can be driven using many different techniques in conjunction with software and hardware. Multiplexing is one of the most popular methods used to drive a 7 segment display when there are limited no of I/O pins.It uses the concept of POV(persistence of vision) where the human brain cannot detect the flickering of display when the refresh rate is very high(~50Hz).In this method the fundamental logic is to enable or disable the segment blocks at a very high speed at  precise time slices.


7 segment multiplexing with raspberry pi
 In case of Raspberry Pi there are limited no of I/O pins, hence we will use multiplexing. WiringPi is perfect for this job as it uses Arduino like code and the code executes at a higher priority. Display used in this example is of common cathode type.Make sure you have the right 7 segment display,else you will end up getting random segments turned on.For pin mapping check the code below:-


Code:-

  1. #include <wiringPi.h>  
  2. #include <stdio.h>  
  3.   
  4. #define DISPLAY_BRIGHTNESS  500  
  5.   
  6. #define DIGIT_ON  HIGH  
  7. #define DIGIT_OFF  LOW  
  8.   
  9. #define SEGMENT_ON  LOW  
  10. #define SEGMENT_OFF HIGH  
  11.   
  12. int SEGMENT_1=7;   
  13. int SEGMENT_2=11;  
  14. int SEGMENT_3=13;  
  15. int SEGMENT_4=15;  
  16.   
  17. int SEGMENT_A=3;   
  18. int SEGMENT_B=5;   
  19. int SEGMENT_C=18;   
  20. int SEGMENT_D=19;   
  21. int SEGMENT_E=23;   
  22. int SEGMENT_F=24;   
  23. int SEGMENT_G=25;   
  24.   
  25. void display_number(int num)  
  26. {  
  27.   pinMode(SEGMENT_1,OUTPUT);  
  28.   pinMode(SEGMENT_2,OUTPUT);  
  29.   pinMode(SEGMENT_3,OUTPUT);  
  30.   pinMode(SEGMENT_4,OUTPUT);  
  31.   long start=millis();  
  32.   for(int i=4;i>0;i--)  
  33.   {  
  34.     switch(i)  
  35.     {  
  36.     case 1:  
  37.       digitalWrite(SEGMENT_1,DIGIT_ON);  
  38.       break;  
  39.     case 2:  
  40.       digitalWrite(SEGMENT_2,DIGIT_ON);  
  41.       break;  
  42.     case 3:  
  43.       digitalWrite(SEGMENT_3,DIGIT_ON);  
  44.       break;  
  45.     case 4:  
  46.       digitalWrite(SEGMENT_4,DIGIT_ON);  
  47.       break;  
  48.     }  
  49.     print_number(num%10);  
  50.     num/=10;  
  51.     delayMicroseconds(DISPLAY_BRIGHTNESS);   
  52.     print_number(10);   
  53.     digitalWrite(SEGMENT_1,DIGIT_OFF);  
  54.     digitalWrite(SEGMENT_2,DIGIT_OFF);  
  55.     digitalWrite(SEGMENT_3,DIGIT_OFF);  
  56.     digitalWrite(SEGMENT_4,DIGIT_OFF);  
  57.   }  
  58.   while((millis()-start)<10);  
  59. }  
  60.   
  61. void print_number(int num)  
  62. {  
  63.   pinMode(SEGMENT_A,OUTPUT);  
  64.   pinMode(SEGMENT_B,OUTPUT);  
  65.   pinMode(SEGMENT_C,OUTPUT);  
  66.   pinMode(SEGMENT_D,OUTPUT);  
  67.   pinMode(SEGMENT_E,OUTPUT);  
  68.   pinMode(SEGMENT_F,OUTPUT);  
  69.   pinMode(SEGMENT_G,OUTPUT);  
  70.   switch(num)  
  71.   {  
  72.   case 0:  
  73.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  74.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  75.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  76.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  77.     digitalWrite(SEGMENT_E,SEGMENT_ON);  
  78.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  79.     digitalWrite(SEGMENT_G,SEGMENT_OFF);  
  80.     break;  
  81.   
  82.   case 1:  
  83.     digitalWrite(SEGMENT_A,SEGMENT_OFF);  
  84.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  85.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  86.     digitalWrite(SEGMENT_D,SEGMENT_OFF);  
  87.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  88.     digitalWrite(SEGMENT_F,SEGMENT_OFF);  
  89.     digitalWrite(SEGMENT_G,SEGMENT_OFF);  
  90.     break;  
  91.   
  92.   case 2:  
  93.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  94.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  95.     digitalWrite(SEGMENT_C,SEGMENT_OFF);  
  96.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  97.     digitalWrite(SEGMENT_E,SEGMENT_ON);  
  98.     digitalWrite(SEGMENT_F,SEGMENT_OFF);  
  99.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  100.     break;  
  101.   
  102.   case 3:  
  103.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  104.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  105.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  106.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  107.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  108.     digitalWrite(SEGMENT_F,SEGMENT_OFF);  
  109.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  110.     break;  
  111.   
  112.   case 4:  
  113.     digitalWrite(SEGMENT_A,SEGMENT_OFF);  
  114.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  115.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  116.     digitalWrite(SEGMENT_D,SEGMENT_OFF);  
  117.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  118.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  119.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  120.     break;  
  121.   
  122.   case 5:  
  123.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  124.     digitalWrite(SEGMENT_B,SEGMENT_OFF);  
  125.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  126.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  127.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  128.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  129.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  130.     break;  
  131.   
  132.   case 6:  
  133.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  134.     digitalWrite(SEGMENT_B,SEGMENT_OFF);  
  135.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  136.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  137.     digitalWrite(SEGMENT_E,SEGMENT_ON);  
  138.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  139.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  140.     break;  
  141.   
  142.   case 7:  
  143.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  144.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  145.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  146.     digitalWrite(SEGMENT_D,SEGMENT_OFF);  
  147.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  148.     digitalWrite(SEGMENT_F,SEGMENT_OFF);  
  149.     digitalWrite(SEGMENT_G,SEGMENT_OFF);  
  150.     break;  
  151.   
  152.   case 8:  
  153.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  154.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  155.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  156.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  157.     digitalWrite(SEGMENT_E,SEGMENT_ON);  
  158.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  159.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  160.     break;  
  161.   
  162.   case 9:  
  163.     digitalWrite(SEGMENT_A,SEGMENT_ON);  
  164.     digitalWrite(SEGMENT_B,SEGMENT_ON);  
  165.     digitalWrite(SEGMENT_C,SEGMENT_ON);  
  166.     digitalWrite(SEGMENT_D,SEGMENT_ON);  
  167.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  168.     digitalWrite(SEGMENT_F,SEGMENT_ON);  
  169.     digitalWrite(SEGMENT_G,SEGMENT_ON);  
  170.     break;  
  171.   
  172.   case 10:  
  173.     digitalWrite(SEGMENT_A,SEGMENT_OFF);  
  174.     digitalWrite(SEGMENT_B,SEGMENT_OFF);  
  175.     digitalWrite(SEGMENT_C,SEGMENT_OFF);  
  176.     digitalWrite(SEGMENT_D,SEGMENT_OFF);  
  177.     digitalWrite(SEGMENT_E,SEGMENT_OFF);  
  178.     digitalWrite(SEGMENT_F,SEGMENT_OFF);  
  179.     digitalWrite(SEGMENT_G,SEGMENT_OFF);  
  180.     break;  
  181.   }  
  182. }  
  183.   
  184. int main(void)  
  185. {  
  186.  printf("7 Segment Multiplexing using Raspberry Pi\n") ;  
  187.  if(getuid()!=0) //wiringPi requires root privileges    
  188.  {    
  189.   printf("Error:wiringPi must be run as root.\n");    
  190.   return 1;    
  191.  }    
  192.  if(wiringPiSetup()==-1)    
  193.  {    
  194.   printf("Error:wiringPi setup failed!\n");    
  195.   return 1;    
  196.  }  
  197.  int counter=0;  
  198.  for(;;)  
  199.  {  
  200.   display_number(counter++);  
  201.                 delay(1000);  
  202.   if(counter>9999)  
  203.    counter=0;  
  204.  }  
  205.   return 0;  
  206. }  

Compile the code as...
gcc -o display segment.c -L/usr/local/lib -lwiringPi 
 Now execute it...
 sudo ./display 

ref: http://www.rpiblog.com/2012/11/7-segment-multiplexing-with-raspberry-pi.html

หมวดหมู่บันทึก: เรื่องทั่วไป
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 06 พฤศจิกายน 2559 08:11 แก้ไข: 06 พฤศจิกายน 2559 08:11 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 โอ๋-อโณ.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

ไม่มีความเห็น

ร่วมแสดงความเห็นในหน้านี้

ชื่อ:
อีเมล:
IP แอดเดรส: 3.239.40.250
ข้อความ:  
เรียกเครื่องมือจัดการข้อความ
   
ยกเลิก หรือ