爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
经过十几天的学习折腾,终于能正常显示时间了,时间可以调整设定。现在的问题是不能进行日历的调整和日历显示时间太短无法看清,研究了几天不得要领,特来求助请大侠看看代码哪里有问题。谢谢了!
//端口改为P1-段码、P2-位码、P0-DS12CR887数据线。 //端口全部取反后显示全部是零,取消P2位码取反后显示位码是反的,在硬件上调整了位码端口取反后位置正常,日历和星期不能调节,转换后显示时间太短无法看清楚。 //编译通过改动两处报警去掉 if(aa==1);else if(aa==2)这两个加了一个=号
#include<reg51.h> #define uchar unsigned char #define uint unsigned int ucharhh,mm,ss,year,mouth,day,dd,week,aa,x,y,flag; uint temp; uchar codeled[14]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0x7f,0xff,0xc6};//不加小数点,这个是共阳极的写法,共阴极要取反。 uchar codeled1[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xa3}; //加了小数点 sbit key1=P3^5; //key1键调整时间时的‘位’选择功能 sbit key2=P3^6; //key2执行加功能 sbit key3=P3^7; //key3执行减功能 //sbit beep =P3^3; //暂时改为蜂鸣器代码中没有相关代码 /*定义DS12CR887数据线-------------------------*/ sbit DS_CS=P3^4; //定义DS12C887芯片片选端 (读哪个芯片)(已改端口) sbit DS_AS=P3^1; //定义DS12C887地址选通输入端 (读到那里去)(已改端口) sbit DS_RW=P3^2; //定义DS12C887读允许输入(让读以后,我来输入数据)(已改端口) sbit DS_DS=P3^0; //定义DS12C887读数据允许输入脚,这里mot接地(已改端口) #define DS_BUS P0 //DS12CR887数据总线(已改端口) /************//*DS12CR887驱动程序----------------------------*/ //向DS12CR887写数据函数 void ds_write(uchar add,uchar date) { DS_CS=0; //根据时序图把相应的脚变化高低,片选端,低电平有效 DS_AS=1; //地址选通输入端 DS_DS=1; //读允许输入脚 DS_RW=1; //写输入脚 DS_BUS=add; //写地址 DS_AS=0; DS_RW=0; DS_BUS=date; //写命令 DS_RW=1; DS_AS=1; DS_CS=1; } //读取DS12CR887的数据 uchar ds_read(uchar add) { uchar z; //定义一个无符号函数 DS_AS=1; //ALE,地址锁存允许//根据时序图,进行高低电平设置 DS_DS=1; //Read读入 DS_RW=1; //!WR 禁止写入 DS_CS=0; //片选输入 DS_BUS=add; //写地址,确定要读什么位置的值 DS_AS=0; DS_DS=0; DS_BUS=0xff; //先把P1进行置高,清理数据 z=DS_BUS; //把新的得到12c887里面的数值,赋值给ds_bus DS_DS=1; //根据时序图继续设置电平 DS_AS=1; DS_CS=1; return z; //谁调用它,什么位置调用的,就会把这个新得到的值在返回给他 } void delay(uint z) //延时 { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); }
//Timer计时器初始化程序 void Init_Com(void) { TMOD = 0x20; //定时器1工作在模式2的方式下 PCON = 0x00; //初始化电源管理寄存器 SCON = 0x50; //串口工作在模式1的方式下 TH1 = 0xfd;//定时器高位寄存器初始化 TL1 = 0xfd; //定时器低位寄存器初始化 TR1 = 1; //启动定时器 }
/////键盘扫描 void keyscan() //键盘扫描用于调整时间 { uchar x,y; //key1键调整时间时的‘位’选择功能,每按一下key1键,要调整的位就 if(key1==0) //调整时间时只预示要调整的位 { delay(30); //轮回预示呈现,以便调整 if(key1==0) { aa++; flag=1; while(!key1); } } if(aa==1) { //读小时 hh=ds_read(0x04); // 数码管1显示小时第一位 x=hh /10; P1=~0xff; //先把P进行置高,清理数据(已改端口) P2=0xff; //(已改端口) P2=0x7f; //(已改端口) P1=~led[x]; //(已改端口) delay(1); //数码管2显示小时第二位 y=hh % 10; P1=~0xff; //(已改端口) P2=0xbf; //(已改端口) P1=~led[y]; //(已改端口) delay(1); } if(aa==2) { //读分钟 mm=ds_read(0x02); //数码管4显示分钟第1位 x=mm /10; P1=~0xff; //(已改端口) P2=0xef; //(已改端口) P1=~led[x]; //(已改端口) delay(1); //数码管5显示分钟第2位 y=mm % 10; P1=~0xff; //(已改端口) P2=0xf7; //(已改端口) P1=~led[y]; //(已改端口) delay(1); } if(aa==3) { aa=0; flag=0; } if(key2==0) //key2键执行‘+’功能 { delay(50); if(key2==0) { switch(aa) { case 1:hh++; if(hh==24)hh=0; ds_write(0x04,hh);break; case 2:mm++; if(mm==60)mm=0; ds_write(0x02,mm);break; } while(!key2); } } if(key3==0) //key3执行-功能 { delay(5); if(key3==0) { switch(aa) { case1:hh--; if(hh==-1)hh=23; ds_write(0x04,hh);break; case 2:mm--; if(mm==-1)mm=59; ds_write(0x02,mm);break; } while(!key3); } } }
void show_time() { uint q=4000;// uchar x,y; while(q)//显示时间 小时--分--秒 { keyscan(); //读小时 hh=ds_read(0x04); // 数码管1显示小时第一位 x=hh /10; P1=~0xff; //(已改端口) P2=0xff; //(已改端口) P2=0x7f; //(已改端口) P1=~led[x]; //(已改端口) delay(1); //数码管2显示小时第二位 y=hh % 10; P1=~0xff; //(已改端口) P2=0xbf; //(已改端口) P1=~led[y]; //(已改端口) delay(1); //数码管3显示"--" P1=~0xff; //(已改端口) P2=0xdf; //(已改端口) P1=~led[10]; //(已改端口) delay(1); //读分钟 mm=ds_read(0x02); //数码管4显示分钟第1位 x=mm /10; P1=~0xff; //(已改端口) P2=0xef; //(已改端口) P1=~ led[x]; //(已改端口) delay(1); //数码管5显示分钟第2位 y=mm % 10; P1=~0xff; //(已改端口) P2=0xf7; //(已改端口) P1=~led[y]; //(已改端口) delay(1); // 数码管6显示"--" P1=~0xff; //(已改端口) P2=0xfb; //(已改端口) P1=~led[10]; //(已改端口) delay(1); //读秒钟 ss=ds_read(0x00); //数码管7显示秒钟第1位 x=ss /10; P1=~0xff; //(已改端口) P2=0xfd; //(已改端口) P1=~led[x]; //(已改端口) delay(1); //数码管7显示秒钟第2位 y=ss % 10 ; P1=~0xff; //(已改端口) P2=0xfe; //(已改端口) P1=~led[y]; //(已改端口) delay(1); q--; } }
void show_day() { uintr=900; while(r) //显示年、月、日 { keyscan(); //读月份 mouth=ds_read(0x08); //数码管5显示月份第1位 x=mouth/10; P1=~0xff; //(已改端口) P2=0x7f; //(已改端口) if(x==0) { P1=~led[12]; //(已改端口) delay(1); } else { P1=~led[x]; //(已改端口) delay(1); } // 数码管6显示月份第2位 y=mouth%10; P1=~0xff; //(已改端口) P2=0xbf; //(已改端口) P1=~led1[y]; //(已改端口) delay(1); //读日期 day=ds_read(0x07); //数码管7显示日期第1位 x=day /10; P1=~0xff; //(已改端口) P2=0xdf; //(已改端口) if(x==0) { P1=~led[12]; //(已改端口) delay(1); } else { P1=~led[x]; //(已改端口) delay(1); } //数码管7显示日期第2位 y=day % 10 ; P1=~0xff; //(已改端口) P2=0xef; //(已改端口) P1=~led1[y]; //(已改端口) delay(1); //读年 year=ds_read(0x09); // 数码管1显示年"2" P1=~0xff; //(已改端口) P2=0xf7; //(已改端口) P1=~led[2]; //(已改端口) delay(1); //数码管2显示年"0" P1=~0xff; //(已改端口) P2=0xfb; //(已改端口) P1=~led1[10]; //(已改端口) delay(1); //数码管3显示年百位 x=year/10; //(已改端口) P1=~0xff; //(已改端口) P2=0xfd; //(已改端口) P1=~led[x]; //(已改端口) delay(1); //数码管4显示年个位 y=year%10; P1=~0xff; //(已改端口) P2=0xfe; //(已改端口) P1=~led[y]; //(已改端口) delay(1); r--; } } void show_week() { uint m=80; while(m) ///显示温度、星期 { keyscan(); //读星期 week=ds_read(0x06); // 数码管8显示星期 x=week%10; P1=~0xff; //(已改端口) P2=0xfe; //(已改端口) P1=~led[x]; //(已改端口) delay(10); // 数码管7 去亮 P1=~0xff; //(已改端口) P2=0xfd; //(已改端口) P1=~led[12]; //(已改端口) delay(1); m--; } }
voidmain() { // time_init(); Init_Com(); //定时器串口初始化 aa=0; while(1) { keyscan(); show_time();//时间,日期显示 show_day(); show_week(); while(flag) { if(aa==1) {show_time();keyscan();} else if(aa==2) {show_time();keyscan();} else; } } } 时间显示22-59-02
|