armok 发表于 2005-4-18 10:27:43

testcode 发表于 2005-5-5 06:05:49

刚刚卖到avr-51實驗板,发个水贴庆祝一下。

编译器: winavr;

显示字符串:"I Love OurAvr!"

使用"Timer1 = 5Hz"来更新字符.



/*********************************************************

* Compiler Winavr:2005/5/4

* Target : M16

* Crystal: 4.0000Mhz

* Author:testcode

*

**********************************************************/

#include <avr/io.h>

#include <avr/signal.h>

#include <compat/ina90.h>

#include <avr/pgmspace.h>

#include <string.h>

#include <avr/delay.h>



//pa0-pa7 ----> je2.1 - je2.8

//pc0-pc7 ----> je1.8 - je1.1

#define LED_COL_PORT        (PORTC)

#define LED_COL_DDR                        (DDRC)

#define LED_COL_PIN                        (PINC)

#define LED_ROW_PORT    (PORTA)

#define LED_ROW_DDR                        (DDRA)

#define LED_ROW_PIN                        (PINA)

#define BUFFER_SIZE   (25)



//Global Variable

unsigned char str = "I Love OurAvr!";

volatile unsigned char led_data_buffer; //characters in 5x7 format

volatile unsigned char led_buffer_ptr, led_display_ptr, str_ptr;

volatile unsigned char buff_OverFlow;



void port_init(void);

void timer1_init(void);            

void init_devices(void);

void Display_Led(void);

void LoadDatatoBuffer(void);//Load 5x7 ASCII to buffer



//ASCII characters in a 5x7 dot format and offset: 32

//ie: ASCII'A' = 65, in the following table 'A' is: 65 - 32 = 33

const unsigned char led_str[ ] PROGMEM =

{

    { 0x00, 0x00, 0x00, 0x00, 0x00 },// sp

    { 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !

    { 0x00, 0x07, 0x00, 0x07, 0x00 },   // "

    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #

    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $

    { 0xc4, 0xc8, 0x10, 0x26, 0x46 },   // %

    { 0x36, 0x49, 0x55, 0x22, 0x50 },   // &

    { 0x00, 0x05, 0x03, 0x00, 0x00 },   // '

    { 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (

    { 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )

    { 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *

    { 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +

    { 0x00, 0x00, 0x50, 0x30, 0x00 },   // ,

    { 0x10, 0x10, 0x10, 0x10, 0x10 },   // -

    { 0x00, 0x60, 0x60, 0x00, 0x00 },   // .

    { 0x20, 0x10, 0x08, 0x04, 0x02 },   // /

    { 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0

    { 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1

    { 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2

    { 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3

    { 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4

    { 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5

    { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6

    { 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7

    { 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8

    { 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9

    { 0x00, 0x36, 0x36, 0x00, 0x00 },   // :

    { 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;

    { 0x08, 0x14, 0x22, 0x41, 0x00 },   // <

    { 0x14, 0x14, 0x14, 0x14, 0x14 },   // =

    { 0x00, 0x41, 0x22, 0x14, 0x08 },   // >

    { 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?

    { 0x32, 0x49, 0x59, 0x51, 0x3E },   // @

    { 0x7E, 0x11, 0x11, 0x11, 0x7E },   // A

    { 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B

    { 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C

    { 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D

    { 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E

    { 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F

    { 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G

    { 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H

    { 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I

    { 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J

    { 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K

    { 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L

    { 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M

    { 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N

    { 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O

    { 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P

    { 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q

    { 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R

    { 0x46, 0x49, 0x49, 0x49, 0x31 },   // S

    { 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T

    { 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U

    { 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V

    { 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W

    { 0x63, 0x14, 0x08, 0x14, 0x63 },   // X

    { 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y

    { 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z

    { 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [

    { 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55

    { 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]

    { 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^

    { 0x40, 0x40, 0x40, 0x40, 0x40 },   // _

    { 0x00, 0x01, 0x02, 0x04, 0x00 },   // '

    { 0x20, 0x54, 0x54, 0x54, 0x78 },   // a

    { 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b

    { 0x38, 0x44, 0x44, 0x44, 0x20 },   // c

    { 0x38, 0x44, 0x44, 0x48, 0x7F },   // d

    { 0x38, 0x54, 0x54, 0x54, 0x18 },   // e

    { 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f

    { 0x0C, 0x52, 0x52, 0x52, 0x3E },   // g

    { 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h

    { 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i

    { 0x20, 0x40, 0x44, 0x3D, 0x00 },   // j

    { 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k

    { 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l

    { 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m

    { 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n

    { 0x38, 0x44, 0x44, 0x44, 0x38 },   // o

    { 0x7C, 0x14, 0x14, 0x14, 0x08 },   // p

    { 0x08, 0x14, 0x14, 0x18, 0x7C },   // q

    { 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r

    { 0x48, 0x54, 0x54, 0x54, 0x20 },   // s

    { 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t

    { 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u

    { 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v

    { 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w

    { 0x44, 0x28, 0x10, 0x28, 0x44 },   // x

    { 0x0C, 0x50, 0x50, 0x50, 0x3C },   // y

    { 0x44, 0x64, 0x54, 0x4C, 0x44 }    // z

};



int main(void)

{

        init_devices();

        buff_OverFlow = 0;

        LoadDatatoBuffer();

        LoadDatatoBuffer();

while(1)

{

    Display_Led();

};

return 0;

}



void port_init(void)

{

        //Set COL and ROW port as output and turn off leds

LED_COL_DDR = 0xFF;

LED_COL_PORT = 0xFF;

LED_ROW_DDR = 0xFF;

LED_ROW_PORT = 0xFF;

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

_CLI(); //disable all interrupts

port_init();

timer1_init();

MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x04; //timer interrupt sources

_SEI(); //re-enable interrupts

//all peripherals are now initialized

}



//Display Characters

void Display_Led(void)

{

        unsigned char temp;

       

        for(unsigned char i = 0; i < 8; ++i)

        {

                LED_ROW_PORT = 0xFF;            //Turn off LED Array

                temp = led_display_ptr+i;       //Load Led Display Data From Buffer

                if( temp >= BUFFER_SIZE)

                        temp -= BUFFER_SIZE;

                LED_COL_PORT = led_data_buffer;//

                LED_ROW_PORT = ~(1<<(7-i));

                     //_delay_us(100);//加上这句,LED点阵会更加亮

        }

}



//TIMER1 initialize - prescale:1024

// desired value: 5Hz

// actual value:5.002Hz (0.0%)

void timer1_init(void)

{

TCCR1B = 0x00; //stop

TCNT1H = 0xFC; //setup

TCNT1L = 0xF3;

OCR1AH = 0x03;

OCR1AL = 0x0D;

OCR1BH = 0x03;

OCR1BL = 0x0D;

ICR1H= 0x03;

ICR1L= 0x0D;

TCCR1A = 0x00;

TCCR1B = 0x05; //start Timer

}



//Updated display every 200mS;

SIGNAL(SIG_OVERFLOW1)

{

//TIMER1 has overflowed

TCNT1H = 0xFC; //reload counter high value

TCNT1L = 0xF3; //reload counter low value



//if the display point is bigger than data buffer size then display point = 0

if(++led_display_ptr >= BUFFER_SIZE)

{

                led_display_ptr = 0;

                buff_OverFlow = 0;

}

//Add one char to buffer, updated led_buffer_ptr

//Load Character from led_str table       

if((!buff_OverFlow)&&((led_buffer_ptr-10)<=led_display_ptr))

{               

               LoadDatatoBuffer();

}

if((buff_OverFlow)&&((led_buffer_ptr + BUFFER_SIZE -10)<=led_display_ptr))

{               

               LoadDatatoBuffer();

}

}



//Convert the char: str into 5x7 format, store it to led_data_buffer

void LoadDatatoBuffer(void)

{

        for(unsigned chari = 0; i < 5; ++i)

                {

                        led_data_buffer = pgm_read_byte(&led_str[(str)-32]);//

                        if(led_buffer_ptr >= BUFFER_SIZE)

                        {

                                led_buffer_ptr = 0;

                                buff_OverFlow = 1;

                        }

                }

        if(++str_ptr >= strlen(str))

               str_ptr = 0;

}



点击此处下载armok0148482.rar



-----此内容被testcode于2005-05-05,06:18:35编辑过



-----此内容被testcode于2005-05-10,04:56:17编辑过


-----此内容被testcode于2005-05-10,04:59:29编辑过
页: [1]
查看完整版本: 用avr-51實驗板做的led點陣顯示 (含字幕生成工具)