/*

*  Desc:DS12C887 6位数码管显示

*

*/

#include

#define SEG_DAT P0

#define SEG_BIT P2

#define DS_DAT  P0

#define DS_SEC  0x00

#define DS_MIN  0x02

#define DS_HOR  0x04

#define DS_WEK  0x06

#define DS_DAY  0x07

#define DS_MON  0x08

#define DS_YER  0x09

#define DS_R_A  0x0A

#define DS_R_B  0x0B

#define DS_R_C  0x0C

#define DS_R_D  0x0D

#define DS_Y_S  0x0E    //年千百位

#define CNT_M   30     //控制闪烁速度,为偶数

#define BCD_DEC(X)  (((X & 0xF0) >> 4) * 10 + (X & 0x0F))

#define DEC_BCD(X)  (((X / 10) << 4) | (X % 10))

sbit DS_DS = P3^0;

sbit DS_RW = P3^1;

sbit DS_AS = P3^2;

sbit DS_CS = P3^3;

sbit KEY1  = P1^0;

sbit KEY2  = P1^1;

sbit KEY3  = P1^2;

sbit KEY4  = P1^3;

unsigned char dispMode = 0; //显示模式

unsigned char modify   = 0; //修改模式

unsigned char count    = 0; //修改模式下闪烁计数

unsigned char DIS[6];

unsigned char code C_DAT[]={

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0xBF,/*-*/

};

unsigned char code C_BIT[]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};

void Delay(unsigned int t)

{

unsigned int a,b;

for (a=0; a

for (b=0; b<123; b++)

;

}

void DS12887_Write(unsigned char addres,unsigned char dat)

{

DS_AS = 1;

DS_DS = 1;

DS_RW = 1;

DS_CS = 0;

DS_DAT = addres;

DS_AS = 0;  //add will be write when AS full down

DS_RW = 0;

DS_DAT = dat;

DS_RW = 1;

DS_AS = 1;

DS_CS = 1;

}

unsigned char DS12887_Read(unsigned char addres)

{

unsigned char d;

DS_AS = 1;

DS_DS = 1;

DS_RW = 1;

DS_CS = 0;

DS_DAT = addres;

DS_AS = 0;

DS_DS = 0;

DS_DAT = 0xFF;

d = DS_DAT;

DS_DS = 1;

DS_AS = 1;

DS_CS = 1;

return d;

}

void DS12887_Init(void)

{

if (DS12887_Read(DS_Y_S) == 0)

{

DS12887_Write(DS_Y_S, 0x20);

DS12887_Write(DS_HOR, 0x12);

DS12887_Write(DS_R_A, 0x20);

DS12887_Write(DS_R_B, 0x02);  //BCD

}

}

void Display(void)

{

unsigned char i;

if (dispMode == 0)                          //显示模式0,时分秒

{

i = DS12887_Read(DS_HOR) & 0x7F;

DIS[0] = C_DAT[i >> 4];

DIS[1] = C_DAT[i & 0x0F] & 0x7F;

i = DS12887_Read(DS_MIN);

DIS[2] = C_DAT[i >> 4];

DIS[3] = C_DAT[i & 0x0F] & 0x7F;

i = DS12887_Read(DS_SEC);

DIS[4] = C_DAT[i >> 4];

DIS[5] = C_DAT[i & 0x0F] & 0x7F;

if (modify != 0 && count > CNT_M)   //修改模式123下闪烁

{

DIS[2 * (modify - 1)] = 0xFF;

DIS[2 * (modify - 1) + 1] = 0xFF;

}

} else if (dispMode == 1)                   //显示模式1,年

{

DIS[0] = 0xFF;

i = DS12887_Read(DS_Y_S);               //年高两位,在RAM里0x0E

DIS[1] = C_DAT[i >> 4];

DIS[2] = C_DAT[i & 0x0F];

i = DS12887_Read(DS_YER);               //年低两位

DIS[3] = C_DAT[i >> 4];

DIS[4] = C_DAT[i & 0x0F];

DIS[5] = 0xFF;

if (modify != 0 && count > CNT_M)   //修改模式45下闪烁

{

DIS[2 * (modify - 4) + 1] = 0xFF;

DIS[2 * (modify - 4) + 2] = 0xFF;

}

} else if (dispMode == 2)                   //显示模式2,月日 星期

{

i = DS12887_Read(DS_MON);               //月

if (i < 10)

DIS[0] = 0xFF;

else

DIS[0] = C_DAT[i >> 4];

DIS[1] = C_DAT[i & 0x0F] & 0x7F;        //显示小数点

i = DS12887_Read(DS_DAY);               //日

DIS[2] = C_DAT[i >> 4];

DIS[3] = C_DAT[i & 0x0F];

i = DS12887_Read(DS_WEK);               //星期

DIS[4] = C_DAT[10];                     //用'-'隔开

DIS[5] = C_DAT[(i - 1) & 0x0F];         //1~7,第一天是星期天

if (modify != 0 && count > CNT_M)   //修改模式789下闪烁

{

if (modify != 9)                    //星期修改时,‘-’不闪烁

DIS[2 * (modify - 7)] = 0xFF;

DIS[2 * (modify - 7) + 1] = 0xFF;

}

}

for (i=0; i<6; i++)

{

SEG_DAT = DIS[ i];

SEG_BIT = C_BIT[ i];

Delay(1);

SEG_BIT = 0xFF;

}

count++;                        //用于修改模式下闪烁

if (count > 2 * CNT_M)

count = 0;

}

/*计算当月的天数*/

unsigned char getDay(void)

{

unsigned char tYear,tMonth;

tYear = BCD_DEC(DS12887_Read(DS_YER));  //当前年

tMonth = BCD_DEC(DS12887_Read(DS_MON));//当前月

switch (tMonth)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:return 31;  //1、3、5、7、8、10、12 月均为31天

case 4:

case 6:

case 9:

case 11:return 30;  //4、6、9、11 月均为30天

case 2:

if (tYear%4==0) //2月闰年为29天

return 29;

else

return 28;  //平年为28天

default:    return 0;

}

}

void Key(void)

{

unsigned char i;

P1 = 0xFF;

if (KEY1 == 0)                           //显示模式更改

{

Delay(10);

if (KEY1 == 0)

{

if (modify)                                                        //修改模式下用于退出修改

modify = 0;

else {

DS12887_Write(DS_R_B, 0x62);

dispMode++;

if (dispMode > 2)

dispMode = 0;

}

}

while (KEY1 == 0)

Display();

}

if (KEY2 == 0)                                      //修改模式

{

Delay(10);

if (KEY2 == 0)

{

if (modify == 0)            //时分秒123,年45,月日星期789

{

modify = 3 * dispMode + 1;

DS12887_Write(DS_R_B, 0xE2);

} else {

modify++;

switch (dispMode)      //根据显示模式确定modify初值

{

case 0:

case 2:

if (modify > (3 * dispMode + 3))

//时分秒,日星期模式下每个是3位

{

modify = 0;

DS12887_Write(DS_R_B, 0x62);

}

break;

case 1:

if (modify > (3 * dispMode + 2))    //年模式下是2位

{

modify = 0;

DS12887_Write(DS_R_B, 0x62);

}

break;

}

}

}

while (KEY2 == 0)

Display();

}

if (KEY3 == 0)                                      //+

{

Delay(10);

if (KEY3 == 0)

{

switch (modify)

{

case 1:                                     //时

i = BCD_DEC(DS12887_Read(DS_HOR));

i++;

if (i > 23)

i = 0;

DS12887_Write(DS_HOR, DEC_BCD(i));

break;

case 2:                                     //分

i = BCD_DEC(DS12887_Read(DS_MIN));

i++;

if (i > 59)

i = 0;

DS12887_Write(DS_MIN, DEC_BCD(i));

break;

case 3:                                     //秒

i = BCD_DEC(DS12887_Read(DS_SEC));

i++;

if (i > 59)

i = 0;

DS12887_Write(DS_SEC, DEC_BCD(i));

break;

case 4:                                     //年高两位

i = BCD_DEC(DS12887_Read(DS_Y_S));

i++;

if (i > 21)

i = 19;

DS12887_Write(DS_Y_S, DEC_BCD(i));

break;

case 5:                                     //年低两位

i = BCD_DEC(DS12887_Read(DS_YER));

i++;

if (i > 99)

i = 0;

DS12887_Write(DS_YER, DEC_BCD(i));

break;

case 7:                                     //月

i = BCD_DEC(DS12887_Read(DS_MON));

i++;

if (i > 12)

i = 1;

DS12887_Write(DS_MON, DEC_BCD(i));

break;

case 8:                                     //日

i = BCD_DEC(DS12887_Read(DS_DAY));

i++;

if (i > getDay())

i = 1;

DS12887_Write(DS_DAY, DEC_BCD(i));

break;

case 9:                                     //星期

i = BCD_DEC(DS12887_Read(DS_WEK));

i++;

if (i > 7)

i = 1;

DS12887_Write(DS_WEK, DEC_BCD(i));

break;

}

}

while (KEY3 == 0)

Display();

}

if (KEY4 == 0)

{

Delay(10);

if (KEY4 == 0)

{

switch (modify)

{

case 1:                                     //时

i = BCD_DEC(DS12887_Read(DS_HOR));

if (i == 0)

i = 24;

i--;

DS12887_Write(DS_HOR, DEC_BCD(i));

break;

case 2:                                     //分

i = BCD_DEC(DS12887_Read(DS_MIN));

if (i == 0)

i = 60;

i--;

DS12887_Write(DS_MIN, DEC_BCD(i));

break;

case 3:                                     //秒

i = BCD_DEC(DS12887_Read(DS_SEC));

if (i == 0)

i = 60;

i--;

DS12887_Write(DS_SEC, DEC_BCD(i));

break;

case 4:                                     //年高两位

i = BCD_DEC(DS12887_Read(DS_Y_S));

if (i == 19)

i = 22;

i--;

DS12887_Write(DS_Y_S, DEC_BCD(i));

break;

case 5:                                     //年低两位

i = BCD_DEC(DS12887_Read(DS_YER));

if (i == 0)

i = 99;

else

i--;

DS12887_Write(DS_YER, DEC_BCD(i));

break;

case 7:                                     //月

i = BCD_DEC(DS12887_Read(DS_MON));

if (i == 1)

i = 12;

else

i--;

DS12887_Write(DS_MON, DEC_BCD(i));

break;

case 8:                                     //日

i = BCD_DEC(DS12887_Read(DS_DAY));

if (i == 1)

i = getDay();

else

i--;

DS12887_Write(DS_DAY, DEC_BCD(i));

break;

case 9:                                     //星期

i = BCD_DEC(DS12887_Read(DS_WEK));

if (i == 1)

i = 7;

else

i--;

DS12887_Write(DS_WEK, DEC_BCD(i));

break;

}

}

while (KEY4 == 0)

Display();

}

}

void main (void)

{

unsigned char i;

DS12887_Init();

while (1)

{

Key();

Display();

}

}

java做一个万年历和闹钟,数字电子钟毕业设计源程序(加万年历和闹钟功能)...相关推荐

  1. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

  2. java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言

    点赞是一个互动性很强的功能,网站加入点赞可以增强用户之间的亲密度,可以利用点赞排出受欢迎文章或者其他的列表,所以今天教大家如何做一个类似于微博.QQ空间的点赞功能 需求分析: 首先要明确这个功能是需要 ...

  3. 使用ue4做一个可以显示任意数字变化的计数器方法

    使用ue4做一个可以显示任意数字变化过程的计数器 功能描述: 该功能可以任意输入一个数值然后通过UI绑定数值的方式来\显示数值变化的过程,例如可以显示从0变到100 或者从100变到0,同时还支持调节 ...

  4. 简单用java做一个图书管理系统

    简单用java做一个图书管理系统 首先,我们创建一个View类当做它的视图页 package view;import service.BookService; import service.UserS ...

  5. 用Java做一个跳一跳辅助

    用Java做一个跳一跳辅助 Java跳一跳辅助 首先..让大家看下效果: 由于是闲着没事写的.也懒得看OpenCV的API了. 要用到的工具如下: adb+jdk 把adb添加到环境变量里就行.很简单 ...

  6. java 0xf0_用java做一个最小的操作系统内核

    (系列视频实战可观看网易云课堂: Linux kernel Hacker, 从零构建自己的内核 ) 用java来做操作系统内核,太搞笑了吧.如果你这么想,同时嘴上发出呵呵一笑.那么我这篇文章的目的也算 ...

  7. 如何用java做一个网站

    小学期实践项目要求做一个网站,苦于无从下手,在网上找到了学习教程.当然网上教程很多,下面给大家推荐一个学习网址: JAVA WEB 项目教程-模仿天猫整站 J2EE版本项目没有使用SSH,SSM框架, ...

  8. Java做一个哄女朋友开心的小程序

    最近女朋友天天找我吵架得想着办法哄哄她,恰巧我还在找Java面向对象练手的小程序,两个需求一结合,ok,这个小程序诞生了. 主要目的:做一个以女朋友照片为背景的画布,装饰点小花小草小气球小爱心,另设一 ...

  9. java判断一个字符串是否为数字型(整数、小数、负数)

    1.采用正则表达式的方式来判断一个字符串是否为数字,这种方式判断面比较全面,可以判断正负.整数小数 String str1="12354哈哈";String str2=" ...

最新文章

  1. 秋招必备:斩获腾讯offer的简历分享!
  2. 医工汇聚 智竞心电 | 首届中国心电智能大赛开启招募
  3. dataframe 通配符筛选
  4. POJ 2151 Check the difficulty of problems (概率dp)
  5. D3.js比例尺 定量比例尺 之 线性比例尺(v3版本)
  6. ORA-01552 :非系统表空间 'xxxx'不能使用系统回退段
  7. 集群节点列表编辑程序
  8. android view translateanimation,Android:有没有办法在TranslateAnimation之后获得View的最新位置?...
  9. 多线程问题,实现三个线程顺序循环输出123123123...
  10. 计算机网络放大器的作用,运算放大器工作原理是什么?
  11. 【洛谷】P3537 [POI2012]SZA-Cloakroom
  12. 如何设计神经网络结构,如何设计一个神经网络
  13. C/C++中CRT表示什么意思?
  14. Rademacher复杂度和VC-维
  15. 软工-点赞和取消点赞
  16. JAVA-----乱码的处理 乱码的解决方法总结
  17. 那些让面试官直呼内行的Java知识点(一)
  18. Androd studio无线调试及镜像投屏
  19. 参考文献名称怎么复制_游戏名称符号,非常漂亮稀有的
  20. verilog异步复位jk触发器_JK触发器(异步复位置位)

热门文章

  1. java与seo_学习seo和学习java哪个更好
  2. 关于建模---耦合度
  3. blood pressure android app,‎App Store 上的“Blood Pressure App ++”
  4. PHP与memcached实战
  5. ADB关闭华为系统更新
  6. Cuckoo沙箱安装步骤
  7. C语言 复数四则运算
  8. ubuntu14.04LTS下搜狗输入法问题汇总 (搜狗输入法崩溃,搜狗输入法候选区乱码,没有搜狗输入法皮肤)
  9. 第48讲 Android Camera2 API FD人脸检测
  10. 堆栈内存两张图理解-来自珠峰猛男周啸天