视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
AVR单片机 mega16 C语言 数码管程序
2025-10-05 17:11:32 责编:小OO
文档
/*******************************************

文件:SMG.C

环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10

硬件:ATMEGA16芯片

日期:2006年12月10日

功能:驱动开发板上的数码管,滚动显示1、2、3、4、5、6

备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)

/******************************************/

#include //包含型号头文件

#include //包含"位"操作头文件

#include //标准输入输出头文件

#include //包含自定义常量头文件

#pragma data:code

const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//将BCD码转换成数码管扫描码的数组

/*******************************************

函数名称: One_smg_display

功 能: 指定的数码管显示指定的内容

参 数: data--显示的内容(0-15)

number--指定的数码管(1-6)

返回值 : 无

/********************************************/

void One_smg_display(uchar data,uchar number)

{

PORTB|=0x3F; //输出位选

PORTA|=BIT(BITLK); //更新位选

Delayus(50); //调整时序

PORTA&=~BIT(BITLK); //锁存位选

PORTB=SEGMENT[data]; //输出段选

PORTA|=BIT(SEGLK); //更新段选

Delayus(50); //调整时序

PORTA&=~BIT(SEGLK); //锁存段选

number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)

PORTB=number; //输出位选

PORTA|=BIT(BITLK); //更新位选

Delayus(50); //调整时序

PORTA&=~BIT(BITLK); //锁存位选

}

/*******************************************

函数名称: All_smg_display

功 能: 6个数码管显示指定的内容

参 数: *pdata--显示内容数组地址

返回值 : 无

/********************************************/

void All_smg_display(uchar *pdata)

{

uchar i;

for(i=0;i<6;i++) //循环6次,6个数码管各亮一次

{

One_smg_display(pdata[i],i+1);

Delayms(1);

}

}

/*******************************************

函数名称: Cycle_smg_display

功 能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)

参 数: *pdata--显示内容数组地址

返回值 : 无

/********************************************/

void Cycle_smg_display(uchar *pdata)

{

uchar i,j;

for(i=0;i<240;i++) //共滚动6次,每次内容显示40个循环

{

for(j=0;j<6;j++) //扫描6个数码管

{

One_smg_display(pdata[(i/40+j)%6],j+1);//显示

Delayus(2000); //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)

}

}

}

/*******************************************

函数名称: main

功 能: 6个数码管循环滚动显示指定的内容

参 数: 无

返回值 : 无

/********************************************/

void main(void)

{

uchar data[6]={1,2,3,4,5,6};//六

个数码管滚动显示1,2,3,4,5,6

Board_init( ); //初始化开发板

while(1)

{

Cycle_smg_display(data);

}

}下载本文

显示全文
专题