标题:
单片机电子钟程序如何修改为静态显示?6位 时分秒 74hc595 6个74HC595 D1302
[打印本页]
作者:
鬼推磨
时间:
2020-3-20 12:58
标题:
单片机电子钟程序如何修改为静态显示?6位 时分秒 74hc595 6个74HC595 D1302
dbb44aed2e738bd4549dad5fa18b87d6277ff924.jpg
(234.96 KB, 下载次数: 43)
下载附件
2020-3-20 12:57 上传
电子钟程序 6位 时分秒 74hc595 6个74HC595 D1302 电子数码钟
具体见2楼
作者:
鬼推磨
时间:
2020-3-20 13:02
或者怎么把下面代码改动增加实时时钟模块+DS1302模块
简单的来说,我需要静态数码钟,。不需要那种动态扫描的数码钟
#include <reg51.h> //包含访问sfr库函数reg51.h
sbit K0=P1^2; //定义K0为P1.2(时钟修正标志键)
sbit K1=P1^1; //定义K1为P1.1(修正移位键)
sbit K2=P1^0; //定义K2为P1.0(修正加1键)
sbit OEs=P1^3; //定义OEs为P1.3(秒输出控制端,0有效)
sbit OEm=P1^4; //定义OEm为P1.4(分输出控制端,0有效)
sbit OEh=P1^5; //定义OEh为P1.5(时输出控制端,0有效)
sbit RCK=P1^6; //定义RCK为P1.6(输出锁存控制端,上升沿有效)
sbit LED=P1^7; //定义LED为P1.7(秒闪烁控制端,0有效)
unsigned int ms05=0; //定义0.5ms计数器ms05,并清0
unsigned char h=0, m=0, s=0; //定义时分秒计数器h、m、s,并清0
unsigned char n=0; //定义修正位序号n
unsigned char code c[10]={ //定义共阳逆序字段码数组,并赋值
0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
void disp6 ( ){ //6位显示子函数
unsigned char i; //定义序号变量i
unsigned char a[6]; //定义时分秒数组a[6]
a[5]=c[h/10]; a[4]=c[h%10]; //取出时显示字段码
a[3]=c[m/10]; a[2]=c[m%10]; //取出分显示字段码
a[1]=c[s/10]; a[0]=c[s%10]; //取出秒显示字段码
for (i=0; i<6; i++){ //6位显示字段码依次串行输出
SBUF=a[i]; //串行发送一帧数据
while (TI==0); TI=0;} //等待一帧数据串行发送完毕,完毕后TI清0
RCK=0; RCK=1;} //595 RCK端输入触发正脉冲
void key ( ){ //时钟修正键处理子函数
TR1=1; //时钟修正键按下,T1运行(用于修正位闪烁)
if (K1==0){ //若移位键按下,则
while (K1==0); //等待移位键释放
n++; //移位键释放后,修正位序号加1
if (n==3) n=0;} //若序号超限,复0
if (K2==0){ //若加1键按下,则
while (K2==0); //等待加1键释放
switch (n){ //switch散转,根据修正位序号修正时分秒
case 0: {h++; //时计数器加1
if (h==24) h=0; break;} //若时计数器超限,复0,跳出加1循环
case 1: {m++; //分计数器加1
if (m==60) m=0; break;} //若分计数器超限,复0,跳出加1循环
case 2: {s++; //秒计数器加1
if (s==60) s=0; break;}} //若秒计数器超限,复0,跳出加1循环
disp6 ();}} //刷新显示
void main ( ){ //主函数
TMOD=0x12; //置T0定时器方式2,T1定时器方式1(定时131ms)
SCON=0; //置串口方式0
TH0=TL0=0x06; //置T0定时0.5ms初值(fosc=6MHz)
IP=0x02; //置T0高优先级
TR0=1; //T0运行
IE=0x8a; //T0、T1开中,串行禁中
P1=0xc7; //秒闪烁暗
disp6 (); //595允许输出,初始显示0
while (1) { //无限循环
while (K0==1); //等待时钟修正键按下
if (K0==0) key ();}} //修正键按下,调用时钟修正键处理子函数
void t0( ) interrupt 1{ //T0中断函数(0.5ms中断)
ms05++; //0.5ms计数器加1
if (K0==1) {TR1=0; //若时钟修正键已释放,T1停运行
OEh=0; OEm=0; OEs=0;} //时分秒显示停闪烁
if (ms05==1000) LED=!LED; //0.5s到,秒闪烁亮
if (ms05==2000) {LED=!LED; //1s到,秒闪烁暗
ms05=0; //0.5ms计数器清0
if (++s==60) {s=0; //秒计数器加1,满60s,秒计数器清0
if (++m==60) {m=0; //分计数器加1,满60m,分计数器清0
if (++h==24) h=0;}} //时计数器加1,满24h,时计数器清0
disp6 ();}} //满1s,刷新显示
void t1( ) interrupt 3{ //T1中断函数(修正位闪烁中断)
switch (n) { //switch散转,根据修正位序号闪烁
case 0: {OEh=!OEh; OEm=0; OEs=0; break;} //时显示闪烁
case 1: {OEm=!OEm; OEh=0; OEs=0; break;} //分显示闪烁
case 2: {OEs=!OEs; OEh=0; OEm=0; break;}}} //秒显示闪烁
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1