搜索
bottom↓
回复: 4

16*16 led点阵,自下面上滚动显视+流水灯+马老师算法+proteus

[复制链接]

出0入0汤圆

发表于 2011-12-31 11:22:41 | 显示全部楼层 |阅读模式
/***********************
** 函数名称: 16*16 led点阵软件,自下面上滚动显视,+流水灯
** Chip type : ATmega16
** Clock frequency : 1.000000 MHz
** 功能描述: 低位在前,阳码,逐行扫描(从上到下),16*16,PA,PB为正极
** 输 入:
** 输出   :
** 全局变量: 无
** 调用模块:
** 说明:+马潮老师方法
** 注意:
********************/
/*********************************************************************************************************
**                       16*16 led点阵软件
**                       (c) Copyright 2011-12-31, GaoYunHe
**                             All Rights Reserved
**
**                                 V2.0.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名:16*16 led点阵软件
**创   建   人: 何高云
**最后修改日期: 2011-12-31
**描     述:  
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 何高云
** 版 本: V2.00
** 日 期: 2011-12-31
** 描 述: +马潮老师方法
**
*******************************************************/

#define f_cpu        1000000ul
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define uchar  unsigned char
#define uint   unsigned int

#define row1  PORTA
#define row2  PORTB
#define line1 PORTC
#define line2 PORTD

uchar count;

void init_drive()
  {
    DDRA=0XFF; PORTA=0X00;
        DDRB=0XFF; PORTB=0X00;
    DDRC=0XFF; PORTC=0X00;
        DDRD=0XFF; PORTD=0X00;
  }

void timer0_init()
{
   TCCR0=0X05;  
   TCNT0=256-f_cpu/1024.0*0.05;
   TIMSK=_BV(TOIE0);
   sei();
}

void delay_us(uint x)
{
   while(x--);
}

void delay_ms(uint x)
{
   uchar t;
   while(x--)
   for(t=0;t<120;t--)
     {
           ;
         }
}

//----------------------2字自下而上滚动显视---------------------------

uchar const table[]=
{

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x7F,0xFF,0x01,0xC0,0x7F,0xFF,0x07,0xF0,
0x77,0xF7,0x07,0xF0,0x77,0xF7,0x07,0xF0,
0x7F,0xEF,0x01,0xC0,0xFF,0xDF,0x6F,0xFF,
0xEB,0xEE,0xEB,0xDB,0x19,0xD8,0xFF,0xFF,//"惠",

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xEF,0xDF,0xEF,0xDE,0xEF,0xDE,0xEF,0xDE,
0xEF,0xDC,0xCD,0xDA,0xAD,0xDA,0xAD,0xD6,
0xEE,0xD6,0xEF,0xDE,0xEF,0xDE,0xF7,0xDE,
0xF7,0xDE,0xFB,0xDE,0xFB,0xDE,0xFD,0xDF,//"州"

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};

int main()
  {             
    uchar i=0,j=0;
        uchar  line=0;  
    uchar point=0xff,time_ok=1,point_bit=0;

        uint t=0;
        init_drive();
        timer0_init();

     while(1)
         {                
          for(j=0;j<48;j++)        // (16/字)*(N字+1)
           {
            for(t=0;t<10;t++) //移动延时(移动速度)
             {
              for(i=0;i<16;i++)
               {
                 row1=table[j*2+i*2];
                     row2=table[j*2+i*2+1];
                     if(i<8)    //扫描字的上半部位                  
                      line1=(0x80>>i);          
                     else                 //扫描字的下半部位
                      line2=(0x80>>(i-8));
//---------流水灯 start---------------------
                         if(i==line)
                           {
                 if((point_bit<9) || (point_bit>40))//第1行左、右判定
                               row2=table[j*2+i*2] & point;  
                 else
                                   row1=table[j*2+i*2+1] & point;
                }

             if(count>2)//流水灯速度
                           {
                             count=0;
                                 time_ok=1;
                           }
             if(time_ok)//定时
                           {
                            time_ok=0;
                if( point_bit<16)//第0行流水灯
                                  {
                                   if(point_bit<8)//第0行左、右判定
                                     {
                                      line=0;point=~(0x80>>point_bit);
                                          }
                   else
                                      {
                                      line=0;point=~(0x80>>(point_bit-8));
                                          }
                                   }
                if(point_bit>=17 && point_bit<32)//第15列流水灯
                                  {
                                           ++line; point=0xfe;
                                  }

                if(point_bit>=32 && point_bit<48)//第15行流水灯
                                  {
                                   if(point_bit<40)
                                     {
                                      line=15;point=~(0x01<<(point_bit-32));
                                          }
                   else
                                      {
                                      line=15;point=~(0x01<<(point_bit-40));
                                          }
                                  }
                                  
                                  if(point_bit>=48)     //第0列流水灯
                                  {
                                        --line; point=0x7f;
                                  }

                if(++point_bit>62)////流水灯复位
                                   point_bit=0;
                           }                                   
                        
                     _delay_us(100);
                     line1=0X00;          //消隐
                     line2=0x00;        //消隐
                   }                  
                  }
                }                
         }
  }  



ISR(TIMER0_OVF_vect)
{
   TCNT0=256-f_cpu/1024.0*0.05;
   count++;
}


点击此处下载 ourdev_709200DBGVMU.rar(文件大小:21K) (原文件名:1616_led点阵.rar)

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-12-31 23:11:31 | 显示全部楼层
这个不是我的算法,我不推荐这样的代码。

出0入134汤圆

发表于 2011-12-31 23:20:32 | 显示全部楼层
看着太难受了,整理下

#define f_cpu   1000000ul
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define uchar  unsigned char
#define uint   unsigned int

#define row1  PORTA
#define row2  PORTB
#define line1 PORTC
#define line2 PORTD

uchar count;

void init_drive()
{
    DDRA = 0XFF; PORTA = 0X00;
    DDRB = 0XFF; PORTB = 0X00;
    DDRC = 0XFF; PORTC = 0X00;
    DDRD = 0XFF; PORTD = 0X00;
}

void timer0_init()
{
    TCCR0 = 0X05;
    TCNT0 = 256 - f_cpu / 1024.0 * 0.05;
    TIMSK = _BV(TOIE0);
    sei();
}

void delay_us(uint x)
{
    while(x--);
}

void delay_ms(uint x)
{
    uchar t;

    while(x--)
        for(t = 0; t < 120; t--) {
            ;
        }
}

//----------------------2字自下而上滚动显视---------------------------

uchar const table[] = {

    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,

    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,

    0x7F, 0xFF, 0x01, 0xC0, 0x7F, 0xFF, 0x07, 0xF0,
    0x77, 0xF7, 0x07, 0xF0, 0x77, 0xF7, 0x07, 0xF0,
    0x7F, 0xEF, 0x01, 0xC0, 0xFF, 0xDF, 0x6F, 0xFF,
    0xEB, 0xEE, 0xEB, 0xDB, 0x19, 0xD8, 0xFF, 0xFF, //"惠",

    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,

    0xEF, 0xDF, 0xEF, 0xDE, 0xEF, 0xDE, 0xEF, 0xDE,
    0xEF, 0xDC, 0xCD, 0xDA, 0xAD, 0xDA, 0xAD, 0xD6,
    0xEE, 0xD6, 0xEF, 0xDE, 0xEF, 0xDE, 0xF7, 0xDE,
    0xF7, 0xDE, 0xFB, 0xDE, 0xFB, 0xDE, 0xFD, 0xDF, //"州"

    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};

int main()
{
    uchar i = 0, j = 0;
    uchar  line = 0;
    uchar point = 0xff, time_ok = 1, point_bit = 0;

    uint t = 0;
    init_drive();
    timer0_init();

    while(1) {
        for(j = 0; j < 48; j++) {   // (16/字)*(N字+1)
            for(t = 0; t < 10; t++) { //移动延时(移动速度)
                for(i = 0; i < 16; i++) {
                    row1 = table[j*2+i*2];
                    row2 = table[j*2+i*2+1];

                    if(i < 8)  //扫描字的上半部位
                        line1 = (0x80 >> i);
                    else      //扫描字的下半部位
                        line2 = (0x80 >> (i - 8));

                    //---------流水灯 start---------------------
                    if(i == line) {
                        if((point_bit < 9) || (point_bit > 40)) //第1行左、右判定
                            row2 = table[j*2+i*2] & point;
                        else
                            row1 = table[j*2+i*2+1] & point;
                    }

                    if(count > 2) { //流水灯速度
                        count = 0;
                        time_ok = 1;
                    }

                    if(time_ok) { //定时
                        time_ok = 0;

                        if(point_bit < 16) { //第0行流水灯
                            if(point_bit < 8) { //第0行左、右判定
                                line = 0; point = ~(0x80 >> point_bit);
                            } else {
                                line = 0; point = ~(0x80 >> (point_bit - 8));
                            }
                        }

                        if(point_bit >= 17 && point_bit < 32) { //第15列流水灯
                            ++line; point = 0xfe;
                        }

                        if(point_bit >= 32 && point_bit < 48) { //第15行流水灯
                            if(point_bit < 40) {
                                line = 15; point = ~(0x01 << (point_bit - 32));
                            } else {
                                line = 15; point = ~(0x01 << (point_bit - 40));
                            }
                        }

                        if(point_bit >= 48) { //第0列流水灯
                            --line; point = 0x7f;
                        }

                        if(++point_bit > 62) ////流水灯复位
                            point_bit = 0;
                    }

                    _delay_us(100);
                    line1 = 0X00;    //消隐
                    line2 = 0x00;   //消隐
                }
            }
        }
    }
}



ISR(TIMER0_OVF_vect)
{
    TCNT0 = 256 - f_cpu / 1024.0 * 0.05;
    count++;
}

出0入0汤圆

发表于 2012-1-1 18:36:39 | 显示全部楼层
"ISR(TIMER0_OVF_vect)
{
    TCNT0 = 256 - f_cpu / 1024.0 * 0.05; "

wow!

出0入0汤圆

发表于 2012-1-1 18:51:23 | 显示全部楼层
回复【3楼】millwood0
"isr(timer0_ovf_vect)  
{  
    tcnt0 = 256 - f_cpu / 1024.0 * 0.05; "
wow!
-----------------------------------------------------------------------

还好,这个不是我的代码。

不过,millwood0朋友,请把“http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1503062&bbs_page_no=1&bbs_id=1003”这个帖子中你的代码做点修改,否则可能会误导许多其他人的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 18:57

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

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