资讯详情

Atmega16与DS1302数码管显示程序

/*本程序为八位共阴极且有两个573控制的动态扫描,本程序只用数码管显示到秒钟, 其他的要显示请自己编写,能用1602显示更好*/ #include <iom16v.h> #include <macros.h>//这里面有BIT(),所以要包含 #define uchar unsigned char #define uint unsigned int //#pragma data:code //注code的功能是把后面的数据存在程序存贮器中,不用code就放到了随机存贮器中. const table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00} ; /*如果用uchar table[]就放到了数据存贮器中。决不要这样用,这样占用空间多。*/ /*两个573,段码PA3,位码PA4*/ void delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=220;j>0;j--); } uchar time[7]={12,3,7,25,16,59,55};//年,周,月,日,时,分,秒 uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar year,week,month,day,hour,minute,second; #define SCK_CLR PORTA&=~BIT(0) //拉低时钟线 #define SCK_SET PORTA|=BIT(0) //拉高时钟线 #define SCK_OUT A|=BIT(0) //把SCK设为输出 #define R_CLR PORTA&=~BIT(2) //拉低RST线 #define RST_SET PORTA|=BIT(2) //拉高RST线 #define RST_OUT DDRA|=BIT(2) //把RST设为输出 #define IO_CLR PORTA&=~BIT(1) //拉低IO线 #define IO_SET PORTA|=BIT(1) //拉高IO线 #define IO_OUT DDRA|=BIT(1) //把IO设为输出 #define IO_IN DDRA&=~BIT(1) //把IO设为输出 #define IO_RD PINA&BIT(1) //从IO中读数据

void show(uchar dat,uchar wei) { DDRA|=BIT(3);//把PA3设为输出 DDRA|=BIT(4);//把PA4设为输出 DDRB=0XFF;//把PB口设为输出型,全为高 PORTA|=BIT(3); PORTB=table[dat]; PORTA&=~BIT(3); PORTB=0XFF; PORTB&=~BIT(wei); PORTA|=BIT(4); PORTA&=~BIT(4); delay_ms(1); } /********1302部分*************/ void write_1302_byte(uchar dat) { uchar i; IO_OUT; for(i=0;i<8;i++) { if(dat&0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; dat=dat>>1; } } uchar read_1302(uchar add) { uchar i,value; RST_CLR; SCK_CLR; RST_SET; write_1302_byte(add); IO_IN; for(i=0;i<8;i++) { value=value>>1; if(IO_RD) { value=value|0x80; } SCK_SET; SCK_CLR; } RST_CLR; return value; } void write_1302(uchar add,uchar dat) { RST_CLR; SCK_CLR; RST_SET; write_1302_byte(add); write_1302_byte(dat); RST_CLR; } void init_1302() { uchar i,k; for(i=0;i<7;i++) { k=time[i]/10; time[i]=time[i]%10; time[i]=time[i]+k*16;//这几句是把10进制数变成BCD16进制码 } write_1302(0x8e,0x00);//去除写保护 for(i=0;i<7;i++) { write_1302(write_add[i],time[i]); } write_1302(0x8e,0x80);//加上写保护 } void read_time()//读出所有时间 { uchar i; for(i=0;i<7;i++) { time[i]=read_1302(read_add[i]); } } void time_pro()//把读出的数值赋给年月日时分秒周 { year=time[0]; week=time[1]; month=time[2]; day=time[3]; hour=time[4]; minute=time[5]; second=time[6]; }

void display_sec(uchar dat) { uchar a,b; a=dat/16;//把BCD码转换成10进制数 b=dat%16; show(a,0); show(b,1); } /*显示年月日周时分请用上述程序稍加改动即可*/ void main() { SCK_OUT; RST_OUT; init_1302(); while(1) { read_time(); time_pro(); display_sec(second); } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台