Title: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ Post by: KB_EE09 on March 23, 2010, 10:24:48 PM หวัดดีครับ พี่ๆ ท่านใดเคยใช้ IC MAX7219 สั่งงานโดย Pic บ้างใหม่ ครับ ว่าจะเอามาทำ ตัวแสดงผลขนาดใหญ่ครับ ช่วยแนะนำด้วยนะครับ
ขอบคุณล่วงหน้าครับ Title: Re: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ Post by: gundam 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) fr 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 // Datenbertragung 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 fr die einzelnen Digits while (1) { ausgabe(digit,daten); // Das ist die Ausgaberoutine fr 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 fr die Digits 0-9 } } Title: Re: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ Post by: KB_EE09 on March 24, 2010, 11:13:37 PM ขอคุณมากๆ ครับ ผมจะเอาไปทดลองดู นะครับ ได้ผลไง จะแจ้ง อีก ครั้ง นะครับ
Title: Re: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ Post by: KB_EE09 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) fr 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 // Datenbertragung 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 fr die einzelnen Digits while (1) { ausgabe(digit,daten); // Das ist die Ausgaberoutine fr 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 fr die Digits 0-9 } } มันไม่มีอะไรแสดงผลออกมาเลยครับ หรือ ว่าผมเอาไปทำไม่ถูกครับ Title: Re: ท่านใดมีโค๊ตที่ควบคุม IC Max7219 ใช้ Pic ครับ Post by: samarters 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); } } |