搜索
bottom↓
回复: 21

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

[复制链接]

出0入0汤圆

发表于 2005-4-10 23:28:10 | 显示全部楼层 |阅读模式
//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[8] ;                                               



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_row]; //輸出led點陣數據

          delay_short(1000);

          k++;

          

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

          {

            w++;

                k = 0;

               

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

                {

              led_data[z] = led_data[z+1];

                }

               

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

                {

                  w=0;

                }

               

              led_data[7] = led_str[w]; // 下一行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编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2005-4-10 23:59:34 | 显示全部楼层
开玩笑的说,楼主很不厚道,本人很不高兴~~,编译时这么多错误~,哎,拿来主义行不通
头像被屏蔽

出0入0汤圆

发表于 2005-4-11 02:07:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2005-4-11 08:54:01 | 显示全部楼层
回 chen 陈老三: 我的代碼除了初始部分是由icc生成之外, 連字幕生成工具都是100%自己編的!! 我用的是icc6.31a 專業板, 只要你會一點c, 你看我的語法也沒有錯誤的, 雖然並不是最佳算法!!

出0入0汤圆

发表于 2005-4-11 09:15:07 | 显示全部楼层
点击此处下载armok0144922.rar





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

出0入0汤圆

 楼主| 发表于 2005-4-11 09:34:51 | 显示全部楼层
你只要貼上去windows的寫字板,再由寫字板貼回icc就不會出現問題, 因為這裡的文字是unicode的.

出0入0汤圆

发表于 2005-4-11 20:51:33 | 显示全部楼层
原来是我的Compiler设置中Target,Device Configuration中没有选ATMega16,还有,我的操作系统是win98,unicode不太好。现在行了,谢谢avrboy 單片小子 和 maxwell 阿牛!

出0入0汤圆

 楼主| 发表于 2005-4-11 23:06:02 | 显示全部楼层
加上了橫直取字幕功能!

点击此处下载armok0145023.zip

出0入0汤圆

发表于 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[8] ;                  

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[led_row];//我的C口烧坏了,呜呜!只得用B口代替。

     PORTC =led_data[led_row];

     delay_short(200);

     k++;

      

     if (k>=100)

              {  

       w++;

      k = 0;

      

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

      {

         led_data[z] = led_str[z+w];

      }

      

         if (w>=70)

      {

        w=0;

      }

      

         

     }

   }

      

  };

}





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

点击此处下载armok0145205.txt

出5入0汤圆

发表于 2005-4-13 09:35:51 | 显示全部楼层
PORTA = ~BIT(led_row);  



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

不好意思,刚接触c语言

出0入0汤圆

 楼主| 发表于 2005-4-13 10:18:14 | 显示全部楼层
回八樓: 你出現閃爍可能是你原用了mcu的1mhz內部rc振蕩吧, 我用的是4mhz的外晶振..

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

出0入0汤圆

发表于 2005-4-13 20:10:41 | 显示全部楼层
chen 陈老三:

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

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

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

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

出0入0汤圆

 楼主| 发表于 2005-4-14 00:26:33 | 显示全部楼层
我的port abcd口都ok!

出0入0汤圆

发表于 2005-4-17 08:08:29 | 显示全部楼层
ljpfjfj:

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

出0入0汤圆

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

出0入0汤圆

发表于 2005-4-17 16:40:12 | 显示全部楼层
这么说,我的M16是假残废了?赶快找找马老师的帖子!

出0入0汤圆

发表于 2005-4-17 16:58:04 | 显示全部楼层
呵呵,真的是这么一回事。





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

出0入0汤圆

 楼主| 发表于 2005-4-17 23:05:49 | 显示全部楼层
avr的芯片買回來就沒開jtag的!

出0入0汤圆

发表于 2005-4-17 23:12:01 | 显示全部楼层
avr的芯片買回來就沒開jtag的! ??



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

供应商是否因为检测而修改了就不得而知。
头像被屏蔽

出0入0汤圆

发表于 2005-4-18 10:04:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2005-4-18 10:39:12 | 显示全部楼层
剛再看了一次datasheet, 原來攪錯的是我!! 【18楼】 HJJourAVR 說的對啊!!

出0入0汤圆

发表于 2005-4-19 23:26:37 | 显示全部楼层
有意思
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 13:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表