#include

#include "DS1302.H"

sbit K_S = P1^0;    //显示模式sbit K_M = P1^1;    //修改sbit K_I = P1^2;    //加sbit K_D = P1^3;    //减

sbit Spk = P1^7;    //蜂鸣器

//共阳码表unsigned char code TABLE[]={

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0xBF,/*-*/

};

unsigned char SEG[6];                   //6位数码管对应缓冲区unsigned char state = 0;                //显示模式位unsigned char modify = 0;               //修改模式位

#define MC_H    25                      //修改状态下闪烁频率,越大闪烁越慢unsigned char mc = 0;                   //闪烁计时

//延时函数,每单位1msvoid Delay(unsigned int t)

{

unsigned int a,b;

for (a=0; a

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

;

}

//6位数码管显示函数void Display(void)

{

unsigned char i;

SYSTEMTIME T;

DS1302_GetTime_ALL(&T);                     //读时间数据

if (modify == 0 && T.Minute == 0 && T.Second < 2)

{                                           //整点报时,修改模式下不报,只响2秒        Spk = 0;

} else {

Spk = 1;

}

if (state == 0)                             //显示时分秒    {

SEG[0] = TABLE[T.Hour / 10];            //时十位        SEG[1] = TABLE[T.Hour % 10] & 0x7F;     //时个位,小数点点亮做分隔        SEG[2] = TABLE[T.Minute / 10];          //分十位        SEG[3] = TABLE[T.Minute % 10] & 0x7F;   //分个位,小数点点亮做分隔        SEG[4] = TABLE[T.Second / 10];          //秒十位        SEG[5] = TABLE[T.Second % 10] & 0x7F;   //秒个位,小数点点亮做分隔    } else if (state == 1)                      //显示年份    {

SEG[0] = 0xFF;                          //不显示        SEG[1] = TABLE[T.tYear / 10];           //年千位        SEG[2] = TABLE[T.tYear % 10];           //年百位        SEG[3] = TABLE[T.Year / 10];            //年十位        SEG[4] = TABLE[T.Year % 10];            //年个位        SEG[5] = 0xFF;                          //不显示    } else if (state == 2)                      //显示月日星期    {

SEG[0] = TABLE[T.Month / 10];           //月十位        SEG[1] = TABLE[T.Month % 10] & 0x7F;    //月个位,小数点点亮做分隔        SEG[2] = TABLE[T.Day / 10];             //日十位        SEG[3] = TABLE[T.Day % 10];             //日个位        SEG[4] = TABLE[10];                     //符号‘-’做分隔        SEG[5] = TABLE[T.Week - 1];                 //星期    }

if (modify && (mc > MC_H)) {        //修改状态下,对应位闪烁,        switch (modify)                 //通过查询当前修改状态确定闪烁位。        {

case 1:                         //时闪烁            SEG[0] = SEG[1] = 0xFF;     //对于共阳管,段码写0xFF即关闭不显示,得到闪烁效果            break;

case 2:                         //分闪烁            SEG[2] = SEG[3] = 0xFF;

break;

case 3:                         //秒闪烁            SEG[4] = SEG[5] = 0xFF;

break;

case 4:                         //年高两位闪烁            SEG[1] = SEG[2] = 0xFF;

break;

case 5:                         //年低两位闪烁            SEG[3] = SEG[4] = 0xFF;

break;

case 7:                         //月闪烁            SEG[0] = SEG[1] = 0xFF;

break;

case 8:                         //日闪烁            SEG[2] = SEG[3] = 0xFF;

break;

case 9:                         //星期闪烁            SEG[5] = 0xFF;

break;

}

}

for (i=0; i<6; i++)                 //数码管动态扫描    {

P0 = SEG[ i ];                    //送段码        P2 = ~(0x20 >> i);              //送位码        Delay(1);

P2 = 0xFF;                      //消影    }

if (++mc > 2 * MC_H)

mc = 0;

}

//按键处理函数void Key(void)

{

unsigned char t;

P1 |= 0x0F;

if (!K_S)                                       //按键按下    {

Delay(10);                                  //延时消抖        if (!K_S)                                   //按键确实按下        {

if (!modify)                            //非修改模式下用于切换显示模式            {

if (++state > 2)

state = 0;

}

if (modify)                             //如果在修改模式下,            {

modify = 0;                         //就退出修改模式,                DS1302_WriteData(0x8e,0x80);        //并打开写保护            }

}

while (!K_S)                                //等待按键释放            Display();

}

if (!K_M)

{

Delay(10);

if (!K_M)

{

if (modify == 0)                        //进入修改模式,            {

modify = 3 * state + 1;             //根据显示模式确定modify初值,时分秒123,年45,月日星期789                DS1302_WriteData(0x8e,0x00);        //关闭写保护            } else {

modify++;

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

case 0:

case 2:

if (modify > (3 * state + 3))   //时分秒,日星期模式下每个是3位                    {

modify = 0;

DS1302_WriteData(0x8e,0x80);//打开写保护                    }

break;

case 1:

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

modify = 0;

DS1302_WriteData(0x8e,0x80);//打开写保护                    }

break;

}

}

}

while (!K_M)

Display();

}

if (!K_I)

{

Delay(10);

if (!K_I)

{

switch (modify)                         //根据当前修改状态确定修改什么值            {

case 0:

break;

case 1:                                 //小时                t = BCD2DEC(DS1302_ReadData(DS1302_HOUR + 1));

if (++t > 23)                       //不能超过23                    t = 0;

DS1302_WriteData(DS1302_HOUR, DEC2BCD(t));

break;

case 2:                                 //分                t = BCD2DEC(DS1302_ReadData(DS1302_MINUTE + 1));

if (++t > 59)                       //不能超过59                    t = 0;

DS1302_WriteData(DS1302_MINUTE, DEC2BCD(t));

break;

case 3:                                 //秒                t = BCD2DEC(DS1302_ReadData(DS1302_SECOND + 1));

if (++t > 59)

t = 0;

DS1302_WriteData(DS1302_SECOND, DEC2BCD(t));

break;

case 4:                                 //年高两位                t = BCD2DEC(DS1302_ReadData(DS1302_TYEAR + 1));

if (++t > 29)                       //不能超过29,最小19                    t = 19;

DS1302_WriteData(DS1302_TYEAR, DEC2BCD(t));

break;

case 5:                                 //年低两位                t = BCD2DEC(DS1302_ReadData(DS1302_YEAR + 1));

if (++t > 99)                       //不能超过99                    t = 0;

DS1302_WriteData(DS1302_YEAR, DEC2BCD(t));

break;

case 7:                                 //不能超过12                t = BCD2DEC(DS1302_ReadData(DS1302_MONTH + 1));

if (++t > 12)

t = 1;

DS1302_WriteData(DS1302_MONTH, DEC2BCD(t));

break;

case 8:                                 //日                t = BCD2DEC(DS1302_ReadData(DS1302_DAY + 1));

if (++t > DS1302_GetTheDay())       //最大日期不能超过当月最大值                    t = 1;

DS1302_WriteData(DS1302_DAY, DEC2BCD(t));

break;

case 9:                                 //星期                t = BCD2DEC(DS1302_ReadData(DS1302_WEEK + 1));

if (++t > 7)                        //不能超过7                    t = 1;

DS1302_WriteData(DS1302_WEEK, DEC2BCD(t));

break;

}

}

while (!K_I)

Display();

}

if (!K_D)       //减    {

Delay(10);

if (!K_D)

{

switch (modify)

{

case 0:

break;

case 1:     //小时                t = BCD2DEC(DS1302_ReadData(DS1302_HOUR + 1));

if (t > 0)

t--;

else

t = 23;

DS1302_WriteData(DS1302_HOUR, DEC2BCD(t));

break;

case 2:     //分                t = BCD2DEC(DS1302_ReadData(DS1302_MINUTE + 1));

if (t > 0)

t--;

else

t = 59;

DS1302_WriteData(DS1302_MINUTE, DEC2BCD(t));

break;

case 3:     //秒                t = BCD2DEC(DS1302_ReadData(DS1302_SECOND + 1));

if (t > 0)

t--;

else

t = 59;

DS1302_WriteData(DS1302_SECOND, DEC2BCD(t));

break;

case 4:     //年高两位                t = BCD2DEC(DS1302_ReadData(DS1302_TYEAR + 1));

if (t > 19)

t--;

else

t = 29;

DS1302_WriteData(DS1302_TYEAR, DEC2BCD(t));

break;

case 5:     //年低两位                t = BCD2DEC(DS1302_ReadData(DS1302_YEAR + 1));

if (t > 0)

t--;

else

t = 99;

DS1302_WriteData(DS1302_YEAR, DEC2BCD(t));

break;

case 7:     //月                t = BCD2DEC(DS1302_ReadData(DS1302_MONTH + 1));

if (t > 1)

t--;

else

t = 12;

DS1302_WriteData(DS1302_MONTH, DEC2BCD(t));

break;

case 8:     //日                t = BCD2DEC(DS1302_ReadData(DS1302_DAY + 1));

if (t > 1)

t--;

else

t = DS1302_GetTheDay();

DS1302_WriteData(DS1302_DAY, DEC2BCD(t));

break;

case 9:     //星期                t = BCD2DEC(DS1302_ReadData(DS1302_WEEK + 1));

if (t > 1)

t--;

else

t = 7;

DS1302_WriteData(DS1302_WEEK, DEC2BCD(t));

break;

}

}

while (!K_D)

Display();

}

}

//主函数void main(void)

{

Spk = 1;                        //关蜂鸣器

DS1302_Init();                  //1302初始化

while (1)                       //主循环    {

Display();                  //显示        Key();                      //按键处理

}

}

四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数相关推荐

  1. 51单片机数码管滚动显示学号_数协微课 | LED数码管与51单片机应用

    遇见工学,学在工学 停课不停学 数协电子组教学微课 它又来了 让我们开始学起来吧! 本期学习内容 LED数码管的结构与工作原理及相关原理图介绍 51单片机的应用:静态数码管显示.动态数码管显示 LED ...

  2. python avg函数_学习python第三天之多行函数

    多行函数:(聚合函数/分组函数) 解释:多条数据进入,单条结果出来(多进单出) 1).max(obj):最大值 2).min(obj):最小值 3).sum(num):求和 4).avg(num):求 ...

  3. opencv java 显示图片_【opencv三】利用opencv读取显示图片

    在opencv中读取显示图片的头文件是highgui.hpp. 整体代码如下,如要测试自己的图片,需要将代码段中的图片地址更改为自己图片的绝对路径. #include "opencv2/hi ...

  4. python初学者必背函数_新手必看python vlog 1: 函数

    关注本慕没烦恼,python新手瞧一瞧. 从今天开始,本慕开始为新手们带来福利啦!!祝各位python新手们事业有成!!? 今天,我们从最基础的开始讲. 首先大家安装PyCharm了吧!!解释器安装好 ...

  5. python语言输入杨辉三角_?新手求教:请问怎样用python 显示杨辉三角,任意输入一个数N,输出一个N 1层的杨辉三角。...

    如何用python输出杨辉三角 iangles里用到了yield,yield 的作用就是把一个函数变成一个 generator 用python语言输出九九乘法表 杨辉三角 求代码 1.九九乘法表def ...

  6. python一些常用函数_【python】常用的一些内置函数

    1.cmp cmp(A,B)函数,比较A,B的大小,如果A大于B,返回1,A小于B返回-1,A等于B返回0 print cmp(12,33) >>>-1 print cmp(&quo ...

  7. javascript在第三个文本框中显示文字_一段中的个别文字,显示在目录中

    样例 说明 通常,目录中显示的文字是应用了标题样式的整段文字,而不是段落中的个别文字但有时,需要让个别文字,或者正文中根本不存在的文字,显示在目录中.要求:目录中只显示段落开头的摘要二字简述 设置 步 ...

  8. python声明匿名函数_举例讲解Python的lambda语句声明匿名函数的用法

    所谓匿名函数,即是不需要定义函数,像表达式一样使用,不需要函数名(很多时候名字让我很困扰),一些简单的函数简单化, 举个例子 我需要两个整数相加的函数,通常是这么定义的def add(x, y): r ...

  9. python key=lambda函数_使用’key’和lambda表达式的python max函数

    我来自OOP背景,尝试学习Python.我使用的是max函数,该函数使用lambda表达式返回Player类型的实例,其中players列表中的totalScore最大. def winner(): ...

最新文章

  1. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
  2. 网页设计和用户界面设计
  3. MySql wait_timeout问题解决办法。
  4. SQLServer数据库收缩相关知识笔记
  5. 一步步编写操作系统 66 浅析c库函数与系统调用1
  6. Linux中断 - tasklet
  7. java中Long的比较
  8. CSS实现标题右侧“更多”
  9. python打印不同颜色的字_Python 根据日志级别打印不同颜色的日志的方法示例
  10. 一款基于jquery和css3实现的摩天轮式分享按钮
  11. 洛谷P2862 [USACO06JAN]把牛Corral the Cows
  12. 设计模式(二):难忘一次分享盛宴
  13. 使用 Capistrano 和写作 Ruby 迭代边缘部署
  14. 机电设备如何有效监控?手把手教你最实用的
  15. 推荐系统学习笔记-FNN
  16. ultraedit许可证id 7位数字_优雅的数据库ID设计
  17. 19.通证的分类(各种分类一览表)
  18. 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文但“good”不是回文,试写一个算法判断给定字符是否为回文。
  19. Vue CLI 3搭建
  20. 【PAT】1030 完美数列 (25 分)

热门文章

  1. Laravel-admin添加模型路由报错出现问题:Model does not exists !
  2. matlab实现音频信号的左右声道信号分离_立体声分离度与立体声相关系数
  3. jquery饼状图插件的指引线_JQuery图表插件Highcharts示例教程
  4. 苹果mac休眠快捷键_Mac技巧|如何高效使用苹果便笺?用便笺快捷键快速完成操作...
  5. linux中脚本退出函数,Linux 命令 shell 脚本之09(函数)
  6. 不规则图形数格子的方法_小学数学,怎么数平面图形中长方形与正方形个数
  7. c++ 获取计算机域名_每日一题| 计算机考研20200825
  8. icu入院宣教流程图_ICU患者及家属的健康教育PPT.ppt
  9. matlab debug出现k,MATLAB下的程序调试
  10. android+布局倾斜,android – 如何在Eclipse图形布局视图中使斜...