四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数
#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(); //按键处理
}
}
四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数相关推荐
- 51单片机数码管滚动显示学号_数协微课 | LED数码管与51单片机应用
遇见工学,学在工学 停课不停学 数协电子组教学微课 它又来了 让我们开始学起来吧! 本期学习内容 LED数码管的结构与工作原理及相关原理图介绍 51单片机的应用:静态数码管显示.动态数码管显示 LED ...
- python avg函数_学习python第三天之多行函数
多行函数:(聚合函数/分组函数) 解释:多条数据进入,单条结果出来(多进单出) 1).max(obj):最大值 2).min(obj):最小值 3).sum(num):求和 4).avg(num):求 ...
- opencv java 显示图片_【opencv三】利用opencv读取显示图片
在opencv中读取显示图片的头文件是highgui.hpp. 整体代码如下,如要测试自己的图片,需要将代码段中的图片地址更改为自己图片的绝对路径. #include "opencv2/hi ...
- python初学者必背函数_新手必看python vlog 1: 函数
关注本慕没烦恼,python新手瞧一瞧. 从今天开始,本慕开始为新手们带来福利啦!!祝各位python新手们事业有成!!? 今天,我们从最基础的开始讲. 首先大家安装PyCharm了吧!!解释器安装好 ...
- python语言输入杨辉三角_?新手求教:请问怎样用python 显示杨辉三角,任意输入一个数N,输出一个N 1层的杨辉三角。...
如何用python输出杨辉三角 iangles里用到了yield,yield 的作用就是把一个函数变成一个 generator 用python语言输出九九乘法表 杨辉三角 求代码 1.九九乘法表def ...
- 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 ...
- javascript在第三个文本框中显示文字_一段中的个别文字,显示在目录中
样例 说明 通常,目录中显示的文字是应用了标题样式的整段文字,而不是段落中的个别文字但有时,需要让个别文字,或者正文中根本不存在的文字,显示在目录中.要求:目录中只显示段落开头的摘要二字简述 设置 步 ...
- python声明匿名函数_举例讲解Python的lambda语句声明匿名函数的用法
所谓匿名函数,即是不需要定义函数,像表达式一样使用,不需要函数名(很多时候名字让我很困扰),一些简单的函数简单化, 举个例子 我需要两个整数相加的函数,通常是这么定义的def add(x, y): r ...
- python key=lambda函数_使用’key’和lambda表达式的python max函数
我来自OOP背景,尝试学习Python.我使用的是max函数,该函数使用lambda表达式返回Player类型的实例,其中players列表中的totalScore最大. def winner(): ...
最新文章
- Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
- 网页设计和用户界面设计
- MySql wait_timeout问题解决办法。
- SQLServer数据库收缩相关知识笔记
- 一步步编写操作系统 66 浅析c库函数与系统调用1
- Linux中断 - tasklet
- java中Long的比较
- CSS实现标题右侧“更多”
- python打印不同颜色的字_Python 根据日志级别打印不同颜色的日志的方法示例
- 一款基于jquery和css3实现的摩天轮式分享按钮
- 洛谷P2862 [USACO06JAN]把牛Corral the Cows
- 设计模式(二):难忘一次分享盛宴
- 使用 Capistrano 和写作 Ruby 迭代边缘部署
- 机电设备如何有效监控?手把手教你最实用的
- 推荐系统学习笔记-FNN
- ultraedit许可证id 7位数字_优雅的数据库ID设计
- 19.通证的分类(各种分类一览表)
- 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文但“good”不是回文,试写一个算法判断给定字符是否为回文。
- Vue CLI 3搭建
- 【PAT】1030 完美数列 (25 分)
热门文章
- Laravel-admin添加模型路由报错出现问题:Model does not exists !
- matlab实现音频信号的左右声道信号分离_立体声分离度与立体声相关系数
- jquery饼状图插件的指引线_JQuery图表插件Highcharts示例教程
- 苹果mac休眠快捷键_Mac技巧|如何高效使用苹果便笺?用便笺快捷键快速完成操作...
- linux中脚本退出函数,Linux 命令 shell 脚本之09(函数)
- 不规则图形数格子的方法_小学数学,怎么数平面图形中长方形与正方形个数
- c++ 获取计算机域名_每日一题| 计算机考研20200825
- icu入院宣教流程图_ICU患者及家属的健康教育PPT.ppt
- matlab debug出现k,MATLAB下的程序调试
- android+布局倾斜,android – 如何在Eclipse图形布局视图中使斜...