Pages: [1]   Go Down
Print
Author Topic: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ  (Read 8656 times)
0 Members and 2 Guests are viewing this topic.
KB_EE09
มาใหม่
*
Offline Offline

Posts: 5


Email
« on: March 23, 2010, 10:24:48 PM »

หวัดดีครับ พี่ๆ ท่านใดเคยใช้ IC MAX7219 สั่งงานโดย Pic บ้างใหม่ ครับ ว่าจะเอามาทำ ตัวแสดงผลขนาดใหญ่ครับ ช่วยแนะนำด้วยนะครับ


ขอบคุณล่วงหน้าครับ
Logged
gundam
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #1 on: March 23, 2010, 10:53:29 PM »


#include <16F84a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT

#define     DATA       PIN_B1      // PIN RB1 = DATA am MAX7219
#define     LOAD       PIN_B2      // PIN RB2 = LOAD am MAX7219
#define     CLK        PIN_B3      // PIN RB3 = CLK  am MAX7219

// Hier werden die einzelnen Digits angesteuert
// Die Variable ADRESSE gibt die Registeradresse (Bits D8-D11) des MAX7219 an
// Die Variable WERT beinhaltet die Daten (D0-D7) fr das MAX7219
void AUSGABE(char adresse,char wert)
{
 char x;
// Bevor die Daten bertragen werden, wird zuerst der PIN LOAD auf LOW gesetzt.
// Die Daten beginnen mit dem Bit D15, also MSB
 output_low(LOAD);
// Die Datenbits D15-D12 werden bertragen
// Da diese nicht wichtig sind, wird eine 0 bermittelt
 for (x=0;x<4;x++)
 {
  output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Die Datenbits D11-D8 beinhalten die Registeradresse des MAX7219
 for (x=4;x>0;x--)
 {
  if (bit_test(adresse,x-1)) output_high(DATA);
  else output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Die Datenbits D7-D0 sind die Daten an den MAX7219
 for (x=8;x>0;x--)
 {
  if (bit_test(wert,x-1)) output_high(DATA);
  else output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Zum Schlu฿ wird der PIN LOAD auf HIGH gesetzt, damit ist die
// Datenbertragung zu Ende
 output_high(LOAD);
}

void ausgabe_init()
{

 ausgabe(0x0b,0x04);  // Hier wird die Anzahl der Digits angegeben (5 Digits)
 ausgabe(0x0c,0x01);  // Displays werden auf Normal-Betrieb gesetzt (kein Shutdown)
 ausgabe(0x09,0xff);  // Displays werden auf Normal-Betrieb gesetzt (kein Displaytest)
 ausgabe(0x0a,0x00);  // Die Helligkeit der Digits wird hier eingestellt
}
//#include "max7219.h"

char digit,daten;

void main() {
   set_tris_a(0);   // Pins von Port A werden als Ausgang definiert
   set_tris_b(0);   // Pins von Port B werden als Ausgang definiert
   
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   
 output_high(LOAD);   // Der Pin LOAD am MAX7219 wird als erstes auf HIGH gesetzt
 output_low(CLK);     // Der Pin CLK am MAX7219 wird als erstes auf HIGH gesetzt
 ausgabe_init();      // Die Routine initialisiert den MAX7219
 digit=1;             // Variable Digit durchlไuft alle Digits und wird auf den ersten gesetzt
 daten=0;             // Variable Daten sind die Daten von 0-9 fr die einzelnen Digits
 while (1)
 {
  ausgabe(digit,daten);     // Das ist die Ausgaberoutine fr den MAX7219
  delay_ms(500);            // Pause von 500ms
  daten++;                 
  digit++;
  if (digit==6) digit=1;    // Ist die Anzahl der Digits (hier nur 5 Digits) erreicht wird die Variable wieder auf den ersten gesetzt.
  if (daten==10) daten=0;   // Die Daten fr die Digits 0-9
 }
}
Logged
KB_EE09
มาใหม่
*
Offline Offline

Posts: 5


Email
« Reply #2 on: March 24, 2010, 11:13:37 PM »

ขอคุณมากๆ ครับ ผมจะเอาไปทดลองดู นะครับ ได้ผลไง จะแจ้ง อีก ครั้ง นะครับ
Logged
KB_EE09
มาใหม่
*
Offline Offline

Posts: 5


Email
« Reply #3 on: April 07, 2010, 11:08:07 AM »


#include <16F84a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT

#define     DATA       PIN_B1      // PIN RB1 = DATA am MAX7219
#define     LOAD       PIN_B2      // PIN RB2 = LOAD am MAX7219
#define     CLK        PIN_B3      // PIN RB3 = CLK  am MAX7219

// Hier werden die einzelnen Digits angesteuert
// Die Variable ADRESSE gibt die Registeradresse (Bits D8-D11) des MAX7219 an
// Die Variable WERT beinhaltet die Daten (D0-D7) fr das MAX7219
void AUSGABE(char adresse,char wert)
{
 char x;
// Bevor die Daten bertragen werden, wird zuerst der PIN LOAD auf LOW gesetzt.
// Die Daten beginnen mit dem Bit D15, also MSB
 output_low(LOAD);
// Die Datenbits D15-D12 werden bertragen
// Da diese nicht wichtig sind, wird eine 0 bermittelt
 for (x=0;x<4;x++)
 {
  output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Die Datenbits D11-D8 beinhalten die Registeradresse des MAX7219
 for (x=4;x>0;x--)
 {
  if (bit_test(adresse,x-1)) output_high(DATA);
  else output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Die Datenbits D7-D0 sind die Daten an den MAX7219
 for (x=8;x>0;x--)
 {
  if (bit_test(wert,x-1)) output_high(DATA);
  else output_low(DATA);
  output_high(CLK);
  output_low(CLK);
 }
// Zum Schlu฿ wird der PIN LOAD auf HIGH gesetzt, damit ist die
// Datenbertragung zu Ende
 output_high(LOAD);
}

void ausgabe_init()
{

 ausgabe(0x0b,0x04);  // Hier wird die Anzahl der Digits angegeben (5 Digits)
 ausgabe(0x0c,0x01);  // Displays werden auf Normal-Betrieb gesetzt (kein Shutdown)
 ausgabe(0x09,0xff);  // Displays werden auf Normal-Betrieb gesetzt (kein Displaytest)
 ausgabe(0x0a,0x00);  // Die Helligkeit der Digits wird hier eingestellt
}
//#include "max7219.h"

char digit,daten;

void main() {
   set_tris_a(0);   // Pins von Port A werden als Ausgang definiert
   set_tris_b(0);   // Pins von Port B werden als Ausgang definiert
   
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   
 output_high(LOAD);   // Der Pin LOAD am MAX7219 wird als erstes auf HIGH gesetzt
 output_low(CLK);     // Der Pin CLK am MAX7219 wird als erstes auf HIGH gesetzt
 ausgabe_init();      // Die Routine initialisiert den MAX7219
 digit=1;             // Variable Digit durchlไuft alle Digits und wird auf den ersten gesetzt
 daten=0;             // Variable Daten sind die Daten von 0-9 fr die einzelnen Digits
 while (1)
 {
  ausgabe(digit,daten);     // Das ist die Ausgaberoutine fr den MAX7219
  delay_ms(500);            // Pause von 500ms
  daten++;                 
  digit++;
  if (digit==6) digit=1;    // Ist die Anzahl der Digits (hier nur 5 Digits) erreicht wird die Variable wieder auf den ersten gesetzt.
  if (daten==10) daten=0;   // Die Daten fr die Digits 0-9
 }
}


มันไม่มีอะไรแสดงผลออกมาเลยครับ หรือ ว่าผมเอาไปทำไม่ถูกครับ
Logged
samarters
Jr. Member
**
Offline Offline

Posts: 31


Email
« Reply #4 on: February 02, 2011, 04:51:52 PM »

ลองใช้ของผมดูออกแน่นอน
#include <18F4431.h>
#device adc = 10
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define din pin_d2
#define cs pin_a5
#define clk pin_d3

void send_16bit(byte address,byte data)

  byte i;
  #bit carry=0x03.0;
  carry=0;
  output_low(cs);   
  for(i=0;i<8;i++)
    {
       if((address & 0b10000000)==0)
          output_low(din);
       else
          output_high(din);
          rotate_left(&address,1);
 
          output_high(clk);
          delay_us(50);
          output_low(clk);
          delay_us(50);
    }

    for(i=0;i<8;i++)
      {
        if((data & 0b10000000)==0)
          output_low(din);
        else
          output_high(din);

          rotate_left(&data,1);
          output_high(clk);
          delay_us(50);
          output_low(clk);
          delay_us(50);
       }
  output_high(cs);
}

void init_7219()
{
   send_16bit(0x09,0xff);     //decode
   delay_us(10);             
   send_16bit(0x0a,0x0f);     //intensity
   delay_us(10);             
   send_16bit(0x0b,0x07);     //scan limit
   delay_us(10);
   send_16bit(0x0c,0x01);     //shutdown
   delay_us(10);             
   send_16bit(0x0f,0x00);     //display
   delay_us(10);
}
void cal_num(int16 A,int16 V){
 int tho,hun,dec,tho1,hun1,dec1;
 int b,c,d,e,f,g;
   tho = A/1000;
   b = A%1000;
   hun = b/100;
   c = b%100;
   dec = c/10;
   d = c%10;
   
   tho1 = V/1000;
   e = V%1000;
   hun1 = e/100;
   f = e%100;
   dec1 = f/10;
   g = f%10;
   
   send_16bit(5,tho1);
   send_16bit(6,hun1);
   send_16bit(7,dec1);
   send_16bit(8,g);
   send_16bit(1,tho);
   send_16bit(2,hun);
   send_16bit(3,dec);
   send_16bit(4,d);
}

void main()
{
 int16 value;
 MAXCNT = 9000;
 QEICON  = 0x18;
 init_7219();
 
 setup_adc_ports(sAN0);   
 setup_adc(ADC_CLOCK_INTERNAL);
 
   while(true)
   {
   set_adc_channel(3);
   value = read_adc();
   cal_num(POSCNT,Value); //แสดงค่า 7-segment 2 ค่า ในวงเล็บตัวแรกคือ 4 หลักบน  ตัวหลัง คือ 4 หลักล่าง
   delay_ms(100);
   
   //printf("%lu\r\n",value);

}
}

Logged
Pages: [1]   Go Up
Print
 
Jump to: