avrboy 发表于 2005-4-10 23:28:10

原創: 用avr-51實驗板做的led點陣顯示 (含字幕生成工具)

//ICC-AVR application builder : 2005/4/10 下午 04:02:26

// Target : M16

// Crystal: 4.0000Mhz



#include <iom16v.h>

#include <macros.h>



#define uchar unsigned char

#define uint unsigned int 



                          

const uchar led_str[ ] ={0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,                                     0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00,                                     0xE7,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,                                    }; // I love U 字體16進制數據                                                  

uchar led_data ;                                               



void port_init(void)

{

PORTA = 0xFF;

DDRA= 0xFF;

PORTB = 0x00;

DDRB= 0x00;

PORTC = 0xFF; //m103 output only

DDRC= 0xFF;

PORTD = 0x00;

DDRD= 0x00;

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();



MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}



void delay_long(uint t) // 長延時

{

uint i;

uchar j;

for (i=0;i<t;i++)

{

    for (j=0;j<100;j++);

};

}



void delay_short(uint t) // 短延時

{

uint i;

for (i=0;i<t;i++);

}



void main(void)

{

uchar led_row,k,w,z;



init_devices();



for (;;)

{



    for (led_row=0;led_row<8;led_row++) // 行掃瞄

        {

          PORTA = 0xff;

          PORTA = ~BIT(led_row);

      PORTC = led_data; //輸出led點陣數據

          delay_short(1000);

          k++;

          

          if (k>=120) // 字幕向上位移速度設定

          {

          w++;

                k = 0;

               

                for (z=0;z<7;z++) // led點陣向上移一行

                {

              led_data = led_data;

                }

               

          if (w>=24) // 字幕結束

                {

                  w=0;

                }

               

          led_data = led_str; // 下一行led點陣數據

          }

        }

               

};

}



avr-51實驗板接線:

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

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





字幕生成工具

点击此处下载armok0144882.zip



-----此内容被avrboy于2005-04-10,23:35:33编辑过


-----此内容被avrboy于2005-04-11,09:00:46编辑过

chen 发表于 2005-4-10 23:59:34

开玩笑的说,楼主很不厚道,本人很不高兴~~,编译时这么多错误~,哎,拿来主义行不通

armok 发表于 2005-4-11 02:07:58

avrboy 发表于 2005-4-11 08:54:01

回 chen 陈老三: 我的代碼除了初始部分是由icc生成之外, 連字幕生成工具都是100%自己編的!! 我用的是icc6.31a 專業板, 只要你會一點c, 你看我的語法也沒有錯誤的, 雖然並不是最佳算法!!

maxwell 发表于 2005-4-11 09:15:07

点击此处下载armok0144922.rar





我改了一下,语法都没有错,可能是把程序贴上来的时候,排版不一样!建议上传压缩文件:)

avrboy 发表于 2005-4-11 09:34:51

你只要貼上去windows的寫字板,再由寫字板貼回icc就不會出現問題, 因為這裡的文字是unicode的.

chen 发表于 2005-4-11 20:51:33

原来是我的Compiler设置中Target,Device Configuration中没有选ATMega16,还有,我的操作系统是win98,unicode不太好。现在行了,谢谢avrboy 單片小子 和 maxwell 阿牛!

avrboy 发表于 2005-4-11 23:06:02

加上了橫直取字幕功能!

点击此处下载armok0145023.zip

chen 发表于 2005-4-12 22:53:06

把delay_short(1000);改为 delay_short(200);图象不闪烁,而且更明亮了。

   





我也上传一个,把avrboy的做了修改:

//I LOVE YOU!

//avr-51實驗板接線:

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

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

//蜂鸣器接口JM   ------->   pc0-pc7中任一个。有响动更有意思一些,不是吗?呵呵

#include <iom16v.h>

#include <macros.h>

const unsigned char led_str[ ] =

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0xFE,0x82,0x00,0x00,

0x00,0xFE,0x80,0x80,0x80,0x80,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x3E,0x40,

0x80,0x40,0x3E,0x00,0xFE,0x92,0x92,0x92,0x82,0x00,0x00,0x00,0x0E,0x10,0xE0,

0x10,0x0E,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x7E,0x80,0x80,0x80,0x7E,0x00,

0x0C,0xBE,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00};



unsigned char led_data ;                  

void port_init(void)

{

PORTA = 0xFF;

DDRA= 0xFF;

PORTB = 0xFF;

DDRB= 0xFF;

PORTC = 0xFF;

DDRC= 0xFF;

PORTD = 0x00;

DDRD= 0x00;

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();



MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}



void delay_long(unsigned int t)

{unsigned int i;

unsigned char j;

for (i=0;i<t;i++)

{

    for (j=0;j<100;j++);

};

}



void delay_short(unsigned int t)

{

unsigned int i;

for (i=0;i<t;i++);

}



void main(void)

{

unsigned char led_row,k,w,z;

init_devices();

for (;;)

{

    for (led_row=0;led_row<8;led_row++)

   {

   PORTA = 0xFF;

   PORTA =~BIT(led_row);

   PORTB =led_data;//我的C口烧坏了,呜呜!只得用B口代替。

   PORTC =led_data;

   delay_short(200);

   k++;

      

   if (k>=100)

              {

       w++;

      k = 0;

      

      for (z=0;z<7;z++)

      {

         led_data = led_str;

      }

      

         if (w>=70)

      {

      w=0;

      }

      

         

   }

   }

      

};

}





===============================================================================

点击此处下载armok0145205.txt

xiaozhang 发表于 2005-4-13 09:35:51

PORTA = ~BIT(led_row);



是不是把led_row的二进制值强制转换为位值啊??

不好意思,刚接触c语言

avrboy 发表于 2005-4-13 10:18:14

回八樓: 你出現閃爍可能是你原用了mcu的1mhz內部rc振蕩吧, 我用的是4mhz的外晶振..

回九樓: PORTA = BIT(led_row) 的意思是porta的第幾位置1, 加上~是因為要取反, led_row由0-7變化, 實現了led點陣的8行的掃瞄!

ljpfjfj 发表于 2005-4-13 20:10:41

chen 陈老三:

    我的C口也不行,只得用B口代替。

    pc0,pc1,pc6,pc7有相应的输出变化,pc2,pc3,pc4,pc5没有相应的输出变化.而这几个输出是jtag接口.

    我的板子的M16的C口从没有用过,应该不会烧.

    不知其他网友的实验板情况如何?

avrboy 发表于 2005-4-14 00:26:33

我的port abcd口都ok!

chen 发表于 2005-4-17 08:08:29

ljpfjfj:

我的pc2,pc3,pc4,pc5也没有相应的输出变化,我是这样弄坏的,把isp线接到jtag口,对应的四个跳线也短接,打开isp软件,读取,没有反应,再读,没反应,再读,再读……,当我弄清楚jtag不是isp时,我的m16就已经这样残废了!呜呜!

machao 发表于 2005-4-17 12:43:13

在我写的帖子中,已经很明确的讲过,先使用ISP设置M16的熔丝位。除了选择系统时钟源外,还要设置熔丝位,将JTAG口禁止,这样你的PC2-PC5就可以作为正常的I/O使用了,否则PC2-PC5是“残废”的。另外建议允许AVR的电源检测功能,检测电平设置为4.0(5v系统供电时),这样可以提高整个系统上电的可靠性。

chen 发表于 2005-4-17 16:40:12

这么说,我的M16是假残废了?赶快找找马老师的帖子!

chen 发表于 2005-4-17 16:58:04

呵呵,真的是这么一回事。

http://cache.amobbs.com/bbs_upload782111/files_1/armok0145982.jpg



把JTAGEN的勾去掉就行了哎,明天买瓶酒给马老师!

avrboy 发表于 2005-4-17 23:05:49

avr的芯片買回來就沒開jtag的!

HJJourAVR 发表于 2005-4-17 23:12:01

avr的芯片買回來就沒開jtag的! ??



所有ATMEL原厂出的带JTAG功能的AVR芯片,其JTAG功能都是开了的(默认JTAGEN=0)。

供应商是否因为检测而修改了就不得而知。

armok 发表于 2005-4-18 10:04:04

avrboy 发表于 2005-4-18 10:39:12

剛再看了一次datasheet, 原來攪錯的是我!! 【18楼】 HJJourAVR 說的對啊!!

jin210 发表于 2005-4-19 23:26:37

有意思
页: [1]
查看完整版本: 原創: 用avr-51實驗板做的led點陣顯示 (含字幕生成工具)