ghost1861 发表于 2008-6-20 15:51:22

请教老师,点阵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;
          }
   
   }
}

machao 发表于 2008-6-20 16:18:39

考好英语后,静下心来,仔细分析一下,这样对你有好处的.

honami520 发表于 2008-6-20 16:24:28

所以说看程序比写程序难.看display_code里是8个数,看来还是静态显示一个字符的8*8点阵吧,让我自己写很轻松搞定,但是我也没看懂这个ROW的意思,可能你自己调试下就知道了!有些东西一调试就知道用法,原因了!

kbdcj2000 发表于 2008-6-20 16:28:45

你用画图软件做个8x8点的图片,然后1行是一个8位二进制数,0表示黑,1表示白,你填满就知道为什么是12了。嘿嘿,方法笨了点,但很直观喔。

machao 发表于 2008-6-20 17:23:34

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]
查看完整版本: 请教老师,点阵led这个程序看不懂