/***********************
** 函数名称: 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) |