原創: 用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 陈老三: 我的代碼除了初始部分是由icc生成之外, 連字幕生成工具都是100%自己編的!! 我用的是icc6.31a 專業板, 只要你會一點c, 你看我的語法也沒有錯誤的, 雖然並不是最佳算法!! 点击此处下载armok0144922.rar
我改了一下,语法都没有错,可能是把程序贴上来的时候,排版不一样!建议上传压缩文件:) 你只要貼上去windows的寫字板,再由寫字板貼回icc就不會出現問題, 因為這裡的文字是unicode的. 原来是我的Compiler设置中Target,Device Configuration中没有选ATMega16,还有,我的操作系统是win98,unicode不太好。现在行了,谢谢avrboy 單片小子 和 maxwell 阿牛! 加上了橫直取字幕功能!
点击此处下载armok0145023.zip 把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 PORTA = ~BIT(led_row);
是不是把led_row的二进制值强制转换为位值啊??
不好意思,刚接触c语言 回八樓: 你出現閃爍可能是你原用了mcu的1mhz內部rc振蕩吧, 我用的是4mhz的外晶振..
回九樓: PORTA = BIT(led_row) 的意思是porta的第幾位置1, 加上~是因為要取反, led_row由0-7變化, 實現了led點陣的8行的掃瞄! chen 陈老三:
我的C口也不行,只得用B口代替。
pc0,pc1,pc6,pc7有相应的输出变化,pc2,pc3,pc4,pc5没有相应的输出变化.而这几个输出是jtag接口.
我的板子的M16的C口从没有用过,应该不会烧.
不知其他网友的实验板情况如何? 我的port abcd口都ok! ljpfjfj:
我的pc2,pc3,pc4,pc5也没有相应的输出变化,我是这样弄坏的,把isp线接到jtag口,对应的四个跳线也短接,打开isp软件,读取,没有反应,再读,没反应,再读,再读……,当我弄清楚jtag不是isp时,我的m16就已经这样残废了!呜呜! 在我写的帖子中,已经很明确的讲过,先使用ISP设置M16的熔丝位。除了选择系统时钟源外,还要设置熔丝位,将JTAG口禁止,这样你的PC2-PC5就可以作为正常的I/O使用了,否则PC2-PC5是“残废”的。另外建议允许AVR的电源检测功能,检测电平设置为4.0(5v系统供电时),这样可以提高整个系统上电的可靠性。 这么说,我的M16是假残废了?赶快找找马老师的帖子! 呵呵,真的是这么一回事。
http://cache.amobbs.com/bbs_upload782111/files_1/armok0145982.jpg
把JTAGEN的勾去掉就行了哎,明天买瓶酒给马老师! avr的芯片買回來就沒開jtag的! avr的芯片買回來就沒開jtag的! ??
所有ATMEL原厂出的带JTAG功能的AVR芯片,其JTAG功能都是开了的(默认JTAGEN=0)。
供应商是否因为检测而修改了就不得而知。 剛再看了一次datasheet, 原來攪錯的是我!! 【18楼】 HJJourAVR 說的對啊!! 有意思
页:
[1]