ช่วยหนูแก้ code หน่อยคะในการใช้ PORT ร่วมกัน

  • 16 Replies
  • 4784 Views
*

Offline samira

  • ***
  • 128
    • View Profile
Quote
/*********************************************************************/
const unsigned int segment[10] ={ 0x00,0x10,0x20,0x30,0x40, //0,1,2,3,4
                                        0x50,0x60,0x70,0x80,0x90, //5,6,7,8,9
                        };                        
/*********************************************************************/


ขอถาม จขกท หน่อยเถอะว่า segment[10] นี้ เอาใว้ทำอะไร ?
“ If you’re born poor, it’s not your mistake. But if you die poor, it’s your mistake"
Bill Gates.

โค๊ดแบบมั่วๆ แต่คิดว่าน่าจะใช้ได้ ลองดูเป็นแนวทางได้

Code: [Select]
unsigned int msec=1000;
volatile unsigned char second=0, minute=0, hour=0;

static inline void InitTimers(void)
{
// Clear Timer on Compare or CTC mode and Prescaler of 64
TCCR0 |= 1<<WGM01|3<<CS00;
//Enable compare match interrupt
TIMSK |= 1<<OCIE0;
//Set compare value for 1 mSec
OCR0 = (F_CPU / 64 / 1000)-1;
//Enable global interrupts
sei();                 
}

int main(void)
{
DDRD = 0xff;

InitTimers();

while(1)
{
// PORTD |= 0x0F;
PORTD = ((second % 10)<<4)|0x0E;
_delay_ms(1);

// PORTD |= 0x0F;
PORTD = ((second / 10)<<4)|0x0D;
_delay_ms(1);

// PORTD |= 0x0F;
PORTD = ((minute % 10)<<4)|0x0B;
_delay_ms(1);

// PORTD |= 0x0F;
PORTD = ((minute / 10)<<4)|0x07;
_delay_ms(1);
}

return 0;
}

ISR(TIMER0_COMP_vect)
{
if(--msec == 0)
{
msec = 1000;

if(++second > 59)
{
second = 0;
if(++minute > 59)
{
minute = 0;
if(++hour > 23)
{
hour = 0;
}
}
}
}
}

*

Offline manaw

  • **
  • 35
    • View Profile


ขอถาม จขกท หน่อยเถอะว่า segment[10] นี้ เอาใว้ทำอะไร ?
[/quote]

สำหรับนำค่าในอาเรย์ขับออก 7 segment คะ เนื่องจากต้องการให้เอาท์พุตออกเป็น BCD

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
ขอดูวงจรหน่อยซิ  :)
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

*

Offline manaw

  • **
  • 35
    • View Profile
ตามนี้คะ จริงๆตั้งใจจะทำ 4 digitคะแต่เกิดปัญหาเลยลดลงมาเป็น 2 digit

จากวงจรในรูป Code ที่ผมให้ไป น่าจะใช้ได้เลย และใช้ได้ถึง 4 หลัก ถ้าจะเอา 6 หลักก็เพิ่มได้ไม่ยาก

แต่แนะนำนิดนึงว่า ไม่ควรต่อ Common ของ 7-Segment เข้ากับขา Micro ตรงๆ
เพราะ ขาๆนึงของ Micro รับหรือจ่ายกระแสได้ไม่มาก การต่อตรงๆแบบนี้ ทำให้ ขา 1 ขา
ต้องขับ LED มากสุดถึง 7 ดวง (Segment) ควรใช้ Transistor หรือ Mosfet มาช่วย

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
code ของท่าน JENG น่าจะใช้ได้แล้วนะครับ
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
ถ้าน้องจะต่อ common กับ mcu ตรงๆให้แก้ code ตามนี้ (นึกว่าจะต่อผ่าน TR แบบ NPN)

#define     COMMON1_ON()        PORTD &= ~0x01
#define     COMMON2_ON()        PORTD &= ~0x02
#define     COMMON3_ON()        PORTD &= ~0x04
#define     COMMON4_ON()        PORTD &= ~0x08
#define     COMMON_ALL_OFF()    PORTD |= 0x0f

สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺