Atmega16与DS1302数码管显示程序
其他的要显示请自己编写,能用1602显示更好*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
//#pragmadata: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 DDRA|=BIT(0)
//把SCK设为输出
#define RST_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(ucharadd,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);
}
}
Atmega16DS1302数码管显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
- 妤傛ḿ楠囩亸鍕暥瀹搞儳鈻肩敮鍫濆悋閹存劕鐓跨拋顓熸殌缁嬪顨滅憗锟�
閸忋劍鏌熸担宥咁劅娑旂姴鐨犳0鎴滅瑩娑撴氨鐓$拠鍡礉閹绘劕宕岄惍鏂垮絺瀹搞儰缍旈懗钘夊閿涘苯濮幃銊ユ彥闁喐鍨氶梹澶歌礋娴兼ḿ顫呴惃鍕殸妫版垵浼愮粙瀣瑎...
- 娑擃厾楠囩亸鍕暥瀹搞儳鈻肩敮鍫濆悋閹存劕鐓跨拋顓熸殌缁嬪顨滅憗锟�
缁箖鈧拷30婢舵岸妫亸鍕暥閸╃顔勭拠鍓р柤閿涘奔绗撶€硅埖宸跨拠鎾呯礉閸斺晛顒熼崨妯烘彥闁喕鎻崚棰佺娑擃亜鎮庨弽鐓庣殸妫版垵浼愮粙瀣瑎閻ㄥ嫯顩﹀Ч锟�...
- Agilent ADS 閺佹瑥顒熼崺纭咁唲鐠囧墽鈻兼總妤勵棅
娑撴挸顔嶉幒鍫n嚦閿涘苯鍙忛棃銏n唹鐟欘枃DS閸氬嫮顫掗崝鐔诲厴閸滃苯浼愮粙瀣安閻㈩煉绱遍崝鈺傚亶閻€劍娓堕惌顓犳畱閺冨爼妫跨€涳缚绱癆DS...
- HFSS鐎涳缚绡勯崺纭咁唲鐠囧墽鈻兼總妤勵棅
鐠у嫭绻佹稉鎾愁啀閹哄牐顕抽敍灞藉弿闂堛垼顔夐幒鍦欶SS閻ㄥ嫬濮涢懗钘夋嫲鎼存梻鏁ら敍灞藉簻閸斺晜鍋嶉崗銊╂桨缁崵绮洪崷鏉款劅娑旂姵甯夐幓顡嶧SS...
- CST瀵邦喗灏濆銉ょ稊鐎广倕鐓跨拋顓熸殌缁嬪顨滅憗锟�
閺夊孩妲戝ú瀣╁瘜鐠佽绱濋崗銊╂桨鐠佸弶宸緾ST閸氬嫰銆嶉崝鐔诲厴閸滃苯浼愮粙瀣安閻㈩煉绱濋崝鈺傚亶韫囶偊鈧喕鍤滅€涳附甯夐幓顡塖T鐠佹崘顓告惔鏃傛暏...
- 鐏忓嫰顣堕崺铏诡攨閸╃顔勭拠鍓р柤
娑撳洣绗€妤傛ɑ銈奸獮鍐叉勾鐠у嚖绱濇潻娆庣昂鐠囧墽鈻兼稉杞扮稑閸︺劌鐨犳0鎴炲Η閺堫垶顣崺鐔枫亣鐏炴洘瀚甸懘姘剧礉閹垫挷绗呴崸姘杽閻ㄥ嫪绗撴稉姘唨绾偓...
- 瀵邦喗灏濈亸鍕暥濞村鍣洪幙宥勭稊閸╃顔勭拠鍓р柤閸氬牓娉�
鐠愵厺鎷遍崥鍫ユ肠閺囨潙鐤勯幆鐙呯礉缂冩垵鍨庨妴渚€顣剁拫鍙樺崕閵嗕胶銇氬▔銏犳珤閵嗕椒淇婇崣閿嬬爱閿涘本鍨滅憰浣圭壉閺嶉绨块柅锟�...