文件: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); } }下载本文