基于8051单片机和DS12C8878位数码管显示的时钟(2)

更新时间:2024-03-30 17:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include #include

#define sec XBYTE[0xed00]//秒寄存器地址 #define min XBYTE[0xed02]//分寄存器地址 #define hour XBYTE[0xed04]//小时寄存器地址

#define DS12887a XBYTE[0xed0a]//12887A寄存器地址 #define DS12887b XBYTE[0xed0b]//12887B寄存器地址

unsigned char code b[8]={0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff}; //数码管地址 unsigned char code

数码管字符码c[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//

sbit beep=P1^4; sbit K2=P1^0; sbit K1=P1^1; sbit K3=P1^2;

//sbit DS12887CS=P2^1; sbit DISP=P2^4; sbit S1=P2^2;

unsigned char SS_1,SS_2,SS_3,SS_0;

单位延时2ms函数 //***************** ************************

void delay1ms(unsigned char t) { unsigned char i,j; for(;t>0;t--) for(i=2;i>0;i--) for(j=248;j>0;j--); }

//******** //12887初始化,所有中断禁止,24h制,二进制格式 ******** void clock_initial(void) { //DS12887CS=0; DS12887b=0x86;//禁止时钟更新 hour=0x00; min=0x00; sec=0x00; DS12887a=0x20;//启动内部锂电池 DS12887b=0x06;//启动时钟更新 //DS12887CS=1; }

//****************** 时间修改函数修改小时 **************** void clock_adj_h(char adj) { char temp; temp=hour; if((temp+adj)==0x18) { DS12887b=0x86; hour=0x00; DS12887b=0x06; } else if((temp+adj)==-1) { DS12887b=0x86; hour=0x17; DS12887b=0x06; } else { DS12887b=0x86; hour=temp+adj; DS12887b=0x06; } }

//****************** 时间修改函数修改分钟 ************************ void clock_adj_m(char adj) { char temp; temp=min; if((temp+adj)==0x3c) { DS12887b=0x86; min=0x00; DS12887b=0x06; } else if((temp+adj)==-1) {

DS12887b=0x86; min=0x3b; DS12887b=0x06; } else { DS12887b=0x86; min=temp+adj; DS12887b=0x06; } }

//****************** 读取时间及显示函数 ************************ void disp (void) { unsigned char i,h,m,s,j; unsigned char a[8]; //DS12887CS=0; h=hour; m=min; s=sec;//读取时间 //DS12887CS=1; a[0]=c[h/10]&SS_1;//小时十位 a[1]=c[h]&SS_1;//小时个位 a[2]=c[10]&SS_0;//显示“- ”“ a[3]=c[m/10]&SS_2;//分钟十位 a[4]=c[m]&SS_2;//分钟个位 a[5]=c[10]&SS_0;//显示“- ”“ a[6]=c[s/10]&SS_3;//秒十位 a[7]=c[s]&SS_3;//秒个位 for(j=0;j<2;j++) for(i=0;i<8;i++) { DISP=0; P0=a[i]; DISP=1; P2=b[i]; delay1ms(1); S1=0; } }

//***************** 按键扫描及求键码 ********************* void key_scan(void) { unsigned char a; char b; b=0; P1=P1|0x07; if(!(K1&&K2&&K3))//是否有按键按下 {

延时消抖 delay1ms(10);//

if(!(K1&&K2&&K3))// 确认是否有键按下 { if(K1==0) {a++;while(K1==0) disp();if(a==4)a=0;} if(K2==0){b= 1;while(K2==0) disp();} if(K3==0){b=-1;while(K3==0) disp();} } } switch(a) { case 0:{SS_3=0xff;b=0;}break; case 1:{SS_1=SS_0;if(b!=0){clock_adj_h(b);b=0;}}break; case 2:{SS_1=0xff;SS_2=SS_0;if(b!=0){clock_adj_m(b);b=0;}}break;

case 3:{SS_2=0xff;SS_3=SS_0;if(b!=0)

{DS12887b=0x86;sec=0x00;DS12887b=0x06;b=0;}}break;

default:{a=0;b=0;}break; } }

//*********************** 主函数 **************************** void main (void) { unsigned char i=1; S1=0;

}

TMOD=0x01; TR0=1; TH0=0x5f; TL0=0x00;

SS_0=0xff;SS_1=0xff;SS_2=0xff;SS_3=0xff; clock_initial();//初始化 while(1) { key_scan();//按键扫描 if(TF0) { if(i==7) { TF0=0; SS_0=~SS_0;//\闪烁显示 i=0; } else { TF0=0; i++; } }

}

disp();

本文来源:https://www.bwwdw.com/article/cter.html

Top