搜索
bottom↓
回复: 35

发贴庆祝一下:人生中的第一个C项目也是GCC项目

[复制链接]

出0入0汤圆

发表于 2005-12-2 08:14:55 | 显示全部楼层 |阅读模式
程序是小程序,写的很菜,请高手们指正一下,以增加我学GCC路上的信心!今天打算把串口加上去,用功能码来查询当前的计数值,和设置向上向下清零等操作。源程序如下:

/*项目名称:双向计时器,计时范围0-9999s 采用动态扫描

晶振:内部1Mhz  调试方法:JTAG+实验板 采用AVRSTUDIO4.12+WINAVR GCC

PA口对应数码管的七段 PB0-PB3对应数码管的位控制

日期:2005-12-1晚20:03分

*/

#include <avr/io.h>

#include <avr/signal.h>

#include <avr/interrupt.h>

#include <avr/pgmspace.h>

#include <avr/delay.h>

#define set_led1 PORTB|=0x01  //宏定义,个位选通位

#define clr_led1 PORTB&=~(1<<PB0) //关掉个位

#define set_led2 PORTB|=(1<<PB1) //选通十位

#define clr_led2 PORTB&=~(1<<PB1) //关掉十位

#define set_led3 PORTB|=(1<<PB2)  //选通百位

#define clr_led3 PORTB&=~(1<<PB2) //关掉百位

#define set_led4 PORTB|=(1<<PB3)  //选通千位

#define clr_led4 PORTB&=~(1<<PB3)  //关掉千位

unsigned char count,direction;  //定义时间计数及方向寄存器

unsigned int timer;   //计时寄存器

const unsigned char table[] PROGMEM={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //FLASH存储区显示数据

void disp(unsigned int data){   //显示程序,并将INT数转换成BCD码再表查送显示

   unsigned char temp;

   temp=data/1000;          //求千位

   if(temp) data-=1000*temp;

   PORTA=pgm_read_byte(table+temp);  //将千位送显示

   set_led4;

   _delay_ms(1);

   clr_led4;

   temp=data/100;   //求百位

   if(temp) data-=100*temp;

   PORTA=pgm_read_byte(table+temp);  //将百位送显示

   set_led3;

   _delay_ms(1);

   clr_led3;

   temp=data/10;  //求十位

   if(temp) data-=10*temp;

   PORTA=pgm_read_byte(table+temp);   //将十位送显示

   set_led2;

   _delay_ms(1);

   clr_led2;

   PORTA=pgm_read_byte(table+data);  //余数为个位,直接查表送显示

   set_led1;

   _delay_ms(1);

   clr_led1;

}

void load_timer_val(){

   TCNT0=12;    //250ms

}

void init(){

   DDRA=0xff;

   DDRB=0xff;

   DDRD=0b00011111;

   PORTD=0b11100000;

   PORTA=0xff;

   PORTB=0x10;

   TCCR0=5;    //FSYS/1024分频,普通定时模式250MS

   TIMSK=1;    //允计计数中断

   direction=1;   //上电复位时默认向上计数

   load_timer_val();

}

SIGNAL(SIG_OVERFLOW0){  //计数器0中断程序

   count++;

   if(count>4)

      {

            if(direction){

                    count=0;    //向上计数,最大为9999

                    timer++;

                   if(timer>9999) timer=0;

                   }

         else {

                    count=0;    //向下计数,大于65535时,自动为0

                        timer--;

                        if(timer==65535) timer=9999;

                        }

                    load_timer_val();

                }

   }

int main(){

   init();   //初始化设置

   sei();   //开中断

  while(1){

   disp(timer);

   if(bit_is_clear(PIND,PD7)){   //PD7为向上计数设置按键

         _delay_ms(2);

                 loop_until_bit_is_set(PORTD,PD7);

                 direction=1;

                 }

   if(bit_is_clear(PIND,PD6)){  //PD6为向下计数设置按键

         _delay_ms(2);

                 loop_until_bit_is_set(PORTD,PD6);

                 direction=0;

                 }

   if(bit_is_clear(PIND,PD5)){   //PD5为数据清零按键

         _delay_ms(2);

                 loop_until_bit_is_set(PORTD,PD5);

                 timer=0;

                 }

  }

   return 0;

}

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

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

出0入0汤圆

 楼主| 发表于 2005-12-2 08:22:30 | 显示全部楼层
我用的芯片是MEGA16,当然MEGA16只做这个东西是大材小用了。边学习边搜索。呵

出0入0汤圆

发表于 2005-12-2 08:33:17 | 显示全部楼层
请问楼上:你用的JTAG有芯片程序吗?若有请上传!!!

          我的对于AVRSTUDIO4.12不能仿真。谢谢!

出0入0汤圆

 楼主| 发表于 2005-12-2 08:48:42 | 显示全部楼层
不好意思,JTAG仿真器程序不在我手上。可能在笔记本里,我明天查找一下后,上传给你。看是否能运行?
头像被屏蔽

出0入0汤圆

发表于 2005-12-2 09:06:57 | 显示全部楼层
49131916 能否上传更详细的资料,如电路图,实物图等。



这样我们就能将你的贴子整理到网站上供其它人参考。你的人生第一个C项目也会更完美了 :)

出0入0汤圆

发表于 2005-12-2 09:15:38 | 显示全部楼层
好的!在这先谢谢了!

出0入0汤圆

 楼主| 发表于 2005-12-2 09:24:38 | 显示全部楼层
好的,现在就画个图来,实物图在家里运行着呢。

点击此处下载armok0190307.rar

出0入0汤圆

发表于 2005-12-2 17:52:34 | 显示全部楼层
你用IO口直接驱动LED,它的亮度如何。我用16的IO直接驱动4个的时候,亮度就很难保证,改用9013驱动。

出0入0汤圆

发表于 2005-12-2 17:58:24 | 显示全部楼层
不可能,电路有问题。

一个LED流过10mA已经很亮了,何况AVR的IO能力达到30mA以上.

出0入0汤圆

发表于 2005-12-2 18:55:19 | 显示全部楼层
扫描达不到10mA

出0入0汤圆

 楼主| 发表于 2005-12-10 09:22:53 | 显示全部楼层
jackrich不好意思,那个文件没有找到。上次电脑坏了,我也是别人发的。

还有那个说亮度的,亮度还可以的。直接扫描驱动4-8个都不成问题

出0入0汤圆

发表于 2005-12-15 09:07:35 | 显示全部楼层
编译通不过,

> "make.exe" all

make.exe: *** No rule to make target `all'.  Stop.



> Process Exit Code: 2

出0入0汤圆

 楼主| 发表于 2006-1-10 15:22:56 | 显示全部楼层
通的过的。。我是用STUDIO4。12+WINAVR GCC

出0入0汤圆

发表于 2006-2-6 16:09:37 | 显示全部楼层
er

出0入0汤圆

发表于 2006-2-6 16:10:15 | 显示全部楼层
ert e

出0入0汤圆

发表于 2006-2-6 16:12:24 | 显示全部楼层
我是做LED的,在扫描的时候5mA就可以了.

出0入0汤圆

发表于 2006-2-8 17:02:17 | 显示全部楼层
恭喜呀,我也在学gcc

出0入0汤圆

发表于 2006-2-11 15:39:19 | 显示全部楼层
太感谢了

  _delay_ms(2);

       loop_until_bit_is_set(PORTD,PD5);

这个延时去掉后,按键就没有抖动了

出0入0汤圆

发表于 2006-3-11 18:34:08 | 显示全部楼层
-------- begin --------

avr-gcc (GCC) 3.4.3

Copyright (C) 2004 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



g++    -c -o GCC1.o GCC1.C

process_begin: CreateProcess((null), g++ -c -o GCC1.o GCC1.C, ...) failed.

make (e=2): The system cannot find the file specified.



make.exe: *** [GCC1.o] Error 2



> Process Exit Code: 2

出0入0汤圆

发表于 2006-3-30 12:42:39 | 显示全部楼层
我受下了!

出0入0汤圆

发表于 2006-8-22 21:25:16 | 显示全部楼层
多多学习,我收下了

出0入0汤圆

发表于 2006-9-16 15:41:48 | 显示全部楼层
xiexie

出0入0汤圆

发表于 2006-9-16 21:19:33 | 显示全部楼层
没那么严重吧,上升到人生的高度了

出0入0汤圆

发表于 2006-9-28 17:17:15 | 显示全部楼层
我也要学习学习!

出0入0汤圆

发表于 2006-10-6 17:42:40 | 显示全部楼层
int main(){

   init();   //初始化设置

   sei();   //开中断

  while(1){

   disp(timer);  

   if(bit_is_clear(PIND,PD7)){   //PD7为向上计数设置按键 调试时怎么PIND7为零??

         _delay_ms(2);

       loop_until_bit_is_set(PORTD,PD7);

       direction=1;      

       }

   if(bit_is_clear(PIND,PD6)){  //PD6为向下计数设置按键

         _delay_ms(2);

       loop_until_bit_is_set(PORTD,PD6);

       direction=0;     //走到这里TIMER就不会加了??//

       }

   if(bit_is_clear(PIND,PD5)){   //PD5为数据清零按键

         _delay_ms(2);

       loop_until_bit_is_set(PORTD,PD5);

       timer=0;

       }

  }

   return 0;

}

所以上拉时D口输出为1,但PIN却为0,我想就一个按键接在D口,怎么实现按下为零了,,,,

出0入0汤圆

发表于 2008-2-19 16:38:43 | 显示全部楼层
我顶

出0入0汤圆

发表于 2009-12-1 20:33:26 | 显示全部楼层
avr 的 一定要好好学学呵呵

出0入0汤圆

发表于 2009-12-3 11:16:30 | 显示全部楼层
我也要好好学习!

出0入8汤圆

发表于 2009-12-3 11:29:14 | 显示全部楼层
楼主gcc版本最好也写上。

出0入0汤圆

发表于 2009-12-26 23:26:14 | 显示全部楼层
mark~~~

出0入0汤圆

发表于 2009-12-27 14:24:19 | 显示全部楼层
看不明白哦

出0入0汤圆

发表于 2009-12-27 14:32:24 | 显示全部楼层
祝贺!

出0入4汤圆

发表于 2010-5-7 21:57:10 | 显示全部楼层
我也正在摸索中!

出0入0汤圆

发表于 2010-5-8 09:44:42 | 显示全部楼层
哇,最近很流行挖坟啊

出0入0汤圆

发表于 2010-12-24 15:23:39 | 显示全部楼层
不错,仿真通过

出0入0汤圆

发表于 2012-2-9 21:20:38 | 显示全部楼层
能把前面的宏定义给讲解一下,不懂,我是刚开始学习GCC。。谢谢~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 23:35

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

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