网站地图 | 加入收藏 | English

网站首页 产品列表 软件下载 技术资料 付款方式 发货查询 关于我们 淘宝商城 论坛
搜索 高级/组合搜索
网站新闻
所有新闻
HiFi音响文章
站内新闻
单片机工具资料
汇编程序实例
C语言程序实例
单片机提高资料
单片机初学资料
单片机软件下载
单片机技术资料
  您的位置: 首页 >> 文章列表 >> 基于ATMEGA8单片机的LED动态显示程序设计

基于ATMEGA8单片机的LED动态显示程序设计


作者:单片机爱好者   转载自:单片机工具之家  发布日期:2011-4-17

用单片机来驱动多个七段数码管每个人都有自己的方法,有用74HC595(MC14094,74HC4094)类的串转并芯片的,有用锁存芯片来实现的,如74HC573锁存,如果单片机任务不太重,可以用动态扫描的方法,这样对于成本敏感,空间小的产品可以考虑.
下面是我常用的动态扫描电路.
//电路里有4个七段LED,用此程序,每个LED的刷新周期为200/4=50Hz。
//程序里实时改变DispResult的值,显示就会相应改变。
#include <iom8v.h>
#include <macros.h>

unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char LEDRefresh=0;
unsigned    char  DispResult=0;      

unsigned char LedLoop=0;                                                                                                                                     
void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xFF;
 PORTC = 0x00;
 DDRC  = 0x01;
 PORTD = 0x00;
 DDRD  = 0xFF;
}
//电路所用时钟为Mega8内部8M时钟。

//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 200Hz
// actual value:  200
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x63; //setup
 TCNT1L = 0xC0;
 OCR1AH = 0x03;
 OCR1AL = 0xE8;
 OCR1BH = 0x03;
 OCR1BL = 0xE8;
 ICR1H  = 0x03;
 ICR1L  = 0xE8;
 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0x63; //reload counter high value
 TCNT1L = 0xC0; //reload counter low value
 
 LEDRefresh=1;//刷新显示标志
/*分别选通四个LED*/
 LedLoop++; 
 LedLoop=LedLoop&0x03;
}
//输入参数为通道,和数字。
void LedDisp (unsigned char ch,unsigned char num)
{
unsigned char channel;
unsigned char number;
number = num;
 PORTB|=0x07;
 PORTC|=0x01;//把所有的LED都关掉。
switch(ch)
{
case  1:PORTB&=~0x04;break;//选通第一个LED
case 2:PORTB&=~0x02;break;//选通第二个LED
case 3:PORTB&=~0x01;break;//选通第三个LED
case 4:PORTC&=~0x01;break;//选通第四个LED
default :  break;
}
PORTD=~table[number];//向LED里放数据。

}
void CheckTime()
{
/***********显示任务,每5ms执行一次***************/
if(LEDRefresh==1)
{
switch(LedLoop)
{
case 0:LedDisp(1,DispResult%10);break;//第一个LED显示个位
case 1:LedDisp(2,DispResult/10%10);break;//第二个LED显示十位
case 2:LedDisp(3,DispResult/100%10);break;//第三个LED显示百位
case 3:LedDisp(4,DispResult/1000%10);break;//第四个LED显示千位
default: break;
}
LEDRefresh=0;
}
}
void main()
{
CLI(); //disable all interrupts
DispResult=2001;
port_init();
 timer1_init();
 MCUCR = 0x08;
// GICR  = 0x80;//打开中断1
 TIMSK = 0x04; //timer interrupt sources
 SEI(); //re-enable interrupts
while(1)
{
CheckTime();
}
}


【版权声明】
  1.任何网站转载本站内容必需注明“来源:单片机工具之家”。
  2.本网转载自其它媒体的信息,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
  3.未经本站明确许可,任何网站不得非法盗链软件下载连接及抄袭本网站原创内容资源。
  4.违反上述声明者,本网将追究其相关法律责任。谢谢!

分享到:
更多


关于我们
网站介绍
联系我们
付款方式
银行汇款
货到付款
发货方式
快递运输
上门自提
售后服务
退换货政策
质保承诺
购买方式
购物流程
在线订购

公司名称:深圳市乾龙盛电子科技有限公司   永久域名:http://www.pic16.net  网站名称:单片机工具之家
公司地址:广东省深圳市宝安区龙华镇民治路牛栏前大厦15楼A1502室  电话:0755-28187975  13715306011  联系人:唐先生
展销柜台:广东省深圳市福田区新亚洲电子二期三楼N3D033室(华强电子世界附件)【查看地图】  联系电话:0755-82543360
:淘宝商店   :qls@cxqmcu.com   :qls@cxqmcu.com
销售点击Q我:243355504 (唐永红)先生   技术支持点击Q我:443935535 (钟先生)
网站版权:单片机工具之家  粤ICP备09028690号