نمایش نتایج: از 1 به 5 از 5
Like Tree1 لایک
  • 1 Post By wakhshti

موضوع: راه اندازی ماژول سون سگمنت 4 رقمی همراه با درایور 74hc59

Threaded View

  1. #1
    Junior Member
    تاریخ عضویت
    Jan 2014
    نوشته ها
    1

    راه اندازی ماژول سون سگمنت 4 رقمی همراه با درایور 74hc59

    این ماژول بسیار کم مصرف بهترین گزینه برای استفاده در کنار مدار های کوچک و همچنین میکرو هایی که در آنها با محدودیت پایه مواجه هستیم می باشد.
    باید توجه داشته باشید که این ماژول محدود به نمایش اعداد نمی باشد و بر روی آن می توانید بسیاری از نویسه های انگلیسی و هر آنچه که بتوان بر روی سون سگمنت
    نوشت را نمایش بدهید. همچنین اگر کمی نو آوری داشته باشید می توانید بر روی آن نوشته های متحرک را نمایش دهید!!
    هفته پیش این ماژول رو خریدم ولی برای راه اندازی اون در اینترنت چیزی پیدا نکردم. آخرش از روی شماره آی سی دیتا شیت 74HC595 رو دانلود و شروع به نوشتن
    درایور کردم. خوشبختانه مدار ماژول پیچیده نبود.
    این ماژول یک رجیستر برای نمایش تنها یک کاراکتر در لحظه دارد. و شما باید برای نمایش هر چهار کاراکتر از همان ترفند خطای دید استفاده کنید.
    همچنین به تغذیه ماژول یک مقاومت 1k اهم ببندید (سری کنید. علت مصرف بسیار کم ماژول نیز همین ویژگی است).
    دقت کنید که شدت روشنایی را Duty Cycle تعیین می کند. چم نسبت روشن به خاموش بودن هر دیود.

    کد راه اندازی به زبان C

    کد:
    /***************************************************** Project : 4-Bit LED Digital Tube Module Version : Date : 8/15/2014 Author : axar email : ashit.axar@gmail.com Comments: majul az yek register baraye nemayeshe 4 neviseh bekar mibarad. cham ke bayad khataye did besazim. pas LED_PROC() bayad 4 bar faraxani shavad ta 4 neviseh beja neshan dadeh shavand. [ According to 74HC595 datasheet ] yek moqavemat 1k ohm be VCC majul peyvast konid. tip : har anche nemiruyad fana miyabad, berueed, begostarid jane bahar ra. Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 16.000000 MHz *****************************************************/ #include <mega8.h> // MCU Frequency #define xtal 16000000UL #include <delay.h> #include <stdio.h> // Display module pin definitions #define DIO PORTB.1 #define RCLK PORTB.2 #define SCLK PORTB.3 // you may write your own character sources. const unsigned char LED_SRC[] = {// 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, // A b C d E F - 0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf,0xff }; unsigned char LED_BUFF[4]; void LED_SEND(unsigned char digit) { unsigned char counter; for (counter = 8; counter > 0; counter--) { if (digit & 0x80) DIO = 1; else DIO = 0; delay_us(5); digit <<= 1; SCLK = 0; delay_us(5); SCLK = 1; } } void LED_PROC(void) { static unsigned int shift; switch(shift) { case 0: // digit 1 LED_SEND(LED_BUFF[0]); LED_SEND(0x01); RCLK = 0; delay_us(5); // (optional: just for sure) RCLK = 1; break; case 1: // digit 2 LED_SEND(LED_BUFF[1]); LED_SEND(0x02); RCLK = 0; delay_us(5); // (optional: just for sure) RCLK = 1; break; case 2: // digit 3 LED_SEND(LED_BUFF[2]); LED_SEND(0x04); RCLK = 0; delay_us(5); // (optional: just for sure) RCLK = 1; break; case 3: // digit 4 LED_SEND(LED_BUFF[3]); LED_SEND(0x08); RCLK = 0; delay_us(5); // (optional: just for sure) RCLK = 1; break; } if (shift > 3) shift = 0; else shift++; } void LED_DISPLAY(unsigned char * data) { LED_BUFF[0] = LED_SRC[*(data + 0)]; LED_BUFF[1] = LED_SRC[*(data + 1)]; LED_BUFF[2] = LED_SRC[*(data + 2)]; LED_BUFF[3] = LED_SRC[*(data + 3)]; } // you may write your own parser function [optional] // i have used this instead LED_DISPLAY() void LED_PARSE(unsigned char * str) { unsigned char counter = 0; const unsigned char LED_MSK[] = {// 0 1 2 3 4 5 6 7 8 9 A b C d E F - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'b', 'C', 'd', 'E', 'F', '-', ' ' }; LED_BUFF[0] = LED_SRC[17]; // left most digit for (counter = 0; counter < 17; counter++) if (LED_MSK[counter] == *(str + 3)) LED_BUFF[0] = LED_SRC[counter]; LED_BUFF[1] = LED_SRC[17]; for (counter = 0; counter < 17; counter++) if (LED_MSK[counter] == *(str + 2)) LED_BUFF[1] = LED_SRC[counter]; LED_BUFF[2] = LED_SRC[17]; for (counter = 0; counter < 17; counter++) if (LED_MSK[counter] == *(str + 1)) LED_BUFF[2] = LED_SRC[counter]; LED_BUFF[3] = LED_SRC[17]; for (counter = 0; counter < 17; counter++) // right most digit if (LED_MSK[counter] == *(str + 0)) LED_BUFF[3] = LED_SRC[counter]; } // 1ms Async loop interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=0x06; // 4 cycles/calls needed to complete task LED_PROC(); } void main(void) { unsigned char display[4]; unsigned int counter = 0; PORTB = 0x00; DDRB = 0x0E; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 250.000 kHz TCCR0=0x03; TCNT0=0x06; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // Global enable interrupts #asm("sei") LED_PARSE("----"); delay_ms(1000); while (1) { sprintf(display, "%4u", counter); LED_PARSE(display); counter++; if (counter >= 10000) counter = 0; delay_ms(1000); } }
    در زیر کد هگز برنامه رو برای ATMega8 کامپایل کردم که می تونید پروگرام کنید. این برنامه از 0 تا 9999 می شمارد.
    فایل های پیوست شده فایل های پیوست شده
    ویرایش توسط wakhshti : 08-19-2014 در ساعت 05:06 PM
    لایک کردن

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO