请教老师,点阵led这个程序看不懂
这是仿照您书上把ICC的改了一下,在winavr上编译,在proteus中仿真没有达到预期的效果,可能是仿真的问题,以下有些不懂得地方还请您指点:1、就是row变量为什么要小于12呢??打算在proteus中测试一下的,结果没有通过
2、还有主函数里面的i为什么也要小于12呢?
3、这个程序的动态扫描体现在哪里
刚开始学avr,有很多东西不明白,还请您指点,谢谢了(明天要考四六级,就先这个,本来还有一个的)
#include<avr/io.h>
#include"delay.c"
#define uchar unsigned char
#define uint unsigned int
uchar display_code={0x10,0x38,0x7c,0xfe,0x38,0x38,0x38,0x38};
void display(uchar row)
{
uchar i;
for(i=0;i<8;i++)
{
if(row<=7)
PORTA=display_code;
else
PORTA=0;
PORTC=~(1<<i);
delay_nms(2);
PORTC=0xff;
if((++row)>=12)
row=0;
}
}
int main(void)
{
uchar time_counter=0, i=0;
DDRA=0XFF;
PORTA=0X00;
DDRC=0XFF;
PORTC=0XFF;
while(1)
{
display(i);
delay_nms(9);
if((++time_counter)<4)
{
time_counter=0;
if((++i)>12)
i=0;
}
}
} 考好英语后,静下心来,仔细分析一下,这样对你有好处的. 所以说看程序比写程序难.看display_code里是8个数,看来还是静态显示一个字符的8*8点阵吧,让我自己写很轻松搞定,但是我也没看懂这个ROW的意思,可能你自己调试下就知道了!有些东西一调试就知道用法,原因了! 你用画图软件做个8x8点的图片,然后1行是一个8位二进制数,0表示黑,1表示白,你填满就知道为什么是12了。嘿嘿,方法笨了点,但很直观喔。 LZ和2楼:
1.display_code里是8个数,但显示过程中插上4个OO.否则箭头的头和尾部就连一起了.所以是12个.
2.就是显示一个8*8的点阵,也是动态扫描的,因为只能一行(列)一行(列)的显示.
3.这个是显示一个8*8可移动的点阵.要双扫描,显示本身扫描,显示的内容也要扫描移动.
4.这是垂直移动,水平移动还要复杂些.
5.代码惟一的缺点是使用了软件延时,后面学了T/C后,应该利用T/C重些代码,这样效率更高,才能真正在产品中使用.
6.C是基础,应该首先具备良好的编程能力,读懂别人的程序才能从中学习到更多的东西.自己写的并不一定是最好的最优化的(代码少,占用内存少,效率高等).建议2楼编写一个P190页上思考与练习(4)的代码,让大家学习学习.
7.如果编写与硬件相关的系统软件,课堂上学的C还不够,还要掌握很多的方法,思路和技巧.
页:
[1]