数码之家

 找回密码
 立即注册
搜索
查看: 2694|回复: 6

求助:DS12c887+8位共阴数码管万年历代码问题求解答

[复制链接]
发表于 2020-8-31 23:06:51 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

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

 楼主| 发表于 2020-8-31 23:08:17 | 显示全部楼层

图片好像没有上传,再传一次。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2020-9-1 09:19:42 来自手机浏览器 | 显示全部楼层
你这是直驱吧?亮度不均匀。试试位码加三极管,或者改电阻大一些。
回复 支持 反对

使用道具 举报

发表于 2020-9-1 09:21:23 来自手机浏览器 | 显示全部楼层
74这些都拆了是为什么?有的话显示会好很多,也方便的多。
回复 支持 反对

使用道具 举报

发表于 2020-9-1 09:22:55 | 显示全部楼层
用于显示日期的r和m太小了,加大看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-1 11:25:50 | 显示全部楼层
谢谢楼上几位的回复,板子是旧板子上面的IC到我手里已经不知去向,我手里也没有就没有装,现在这都不是主要问题。
主要问题在代码就是:
1、日历不能设定调节。
2、时间显示转换到日历显示,日历显示时间太短看不清楚。
我不知道代码哪里有问题。
回复 支持 反对

使用道具 举报

发表于 2020-9-2 17:56:36 | 显示全部楼层
用max7219驱动吧,效果会好很多

DIY一个STC8F的四位数码管时钟---MiniClock
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-23 00:29 , Processed in 0.234000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表