/*此程序是一款用3216点阵屏与DS1302芯片以及

三个按键与STC12C5204AD 4KROM单片机组合成的

万年历电子钟具体功能如下:正常情况下上半屏

(3208)显示主时间。当第1次按下功能键时,下半

屏会左移滚动显示“年、月、日、星期”,当再

次按下时,便进入年、月、日、星期、闹铃等调

整模式,按加与减方便调整,附加功能,当在左

移滚动显示“年、月、日、星期”时,按下加“+”

按键,便可以回到主界面,当在响铃时,按下

“+键”便可以将本次响铃关闭,当按响铃时下“-”

按键时,便可以关闭闹铃功能,再次按下时,可

以恢复闹铃功能*/本文引用地址:http://www.eepw.com.cn/article/201611/323389.htm

视频效果祥见:http://www.tudou.com/programs/view/hQmJSwtHWWc/

完整的源代码下载地址:http://www.51hei.com/f/dzwnl.rar

#include #define uchar unsigned char

#define uint unsigned int

#define LINE P2//定义行线IO口,即74HC154控制端

sbit DATA1=P1^4;//74HC595数据端

sbit CLK=P1^5;//74HC595移位脉冲端

sbit CLKR=P1^6;//74HC595数据锁存端

sbit BBT =P2^7;//蜂鸣器引脚

sbit SCLK=P1^2;//DS1302移位脉冲端

sbit DATA=P1^1;//DS1302数据端

sbit RST=P1^0;//DS1302控制端

sbit key=P3^4;//功能按键

sbit key1=P3^3;//加"+"按键

sbit key2=P3^2;//加"+"按键

uchar line;//行扫描变量

uchar move;//移位次数变量

uchar mov;//年月日时间左移变量,即移8次将1个字移完后加1

uchar yin;//按键计数器变量,一共10次,即功能按键有10种功能

uchar lk;//扫描两行还是1行变量

uchar readvalue;//DS1302转换结果变量

uchar shi,fen,nian,yue,ri,xin;//分别为:小时/分钟/年/月/日/星期变量

uchar shin=12,fenn;//闹钟的小时与分钟变量

bit dian;//主时间小数点位变量

bit shr,a,b,c,d,e,f,g,h,i;//按键对应的10种功能位变量

bit flag;//主程序与调整时间切换变量,即进入调整时间部分就不进入主时间部分

bit flag1;//闹钟标志位变量

bit clockbiao;//闹钟响铃主标志位

uchar BUF[19];//4组缓存数组以便动态更改数据

/******************************************************/

/**************点阵0-9代码(8*6点阵)******************/

/******************************************************/

uchar code table[]={

0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x0E,//0

0x00,0x04,0x0C,0x04,0x04,0x04,0x04,0x0E,//1

0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x1F,//2

0x00,0x0E,0x11,0x01,0x06,0x03,0x11,0x0E,//3

0x00,0x06,0x06,0x0A,0x0A,0x12,0x1F,0x02,//4

0x00,0x1F,0x10,0x10,0x1E,0x01,0x01,0x1E,//5

0x00,0x0E,0x11,0x10,0x1E,0x11,0x11,0x0E,//6

0x00,0x1F,0x01,0x02,0x02,0x04,0x04,0x08,//7

0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x0E,//8

0x00,0x0E,0x11,0x11,0x0F,0x01,0x01,0x1E,//9

};

/******************************************************/

/**********两个小数黑屏及坚线代码8*6点阵)*************/

/******************************************************/

uchar code table1[]={

0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C,0x00,//为两个小数点":"

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//为黑屏代码

0x00,0x00,0x00,0x1E,0x1E,0x00,0x00,0x00//为两坚线"-"

};

/******************************************************/

/****此数组为74HC154译码器代码(注也可以不用数组)*****/

/******************************************************/

uchar code table2[]={

0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,//上半屏行代码 0-7行

0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff//下半屏行代码 8-15行

};

/******************************************************/

/*****************延时子程序1**************************/

/******************************************************/

void delaya(uint z)

{

uint x;

for(x=z;x>0;x--);

}

/******************************************************/

/*****************延时子程序2**************************/

/******************************************************/

void delay(uint z)

{

uint x,y;

for(x=200;x>0;x--)

for(y=z;y>0;y--);

}

/******************************************************/

/***************蜂鸣器响一声子程序********************/

/******************************************************/

void bbtsoud()

{

BBT=0;//打开蜂鸣器

delay(50);//延时

BBT=1;//关闭它

}

/**********************************/

//向1302写一个字节数据//

//入口参数:dat

/*********************************/

void write1302xei(uchar dat)

{

uchar x;

SCLK=0;delaya(2);

for(x=0;x<8;x++)

{

DATA=dat&0x01;//取出最低位,从而实现一位位传送

delaya(2);

SCLK=1;

delaya(2);

SCLK=0;

dat>>=1;//等待传送第二个字节

}

}

/**************************************/

//根据控制字向1302写一个字节数据//

//入口参数:控制参数kong,实际参数can

/*************************************/

void write1302(uchar kong,uchar can)

{

SCLK=0;

RST=0;

RST=1;

delaya(2);

write1302xei(kong);

write1302xei(can);

SCLK=1;

RST=0;

}

/**************************************/

//向1302读一个字节数据//

//入口参数:dat,x

/*************************************/

uchar read1302du()

{

uchar dat,x;

SCLK=0;

for(x=0;x<8;x++)

{

dat>>=1;

if(DATA==1)

dat|=0x80;

SCLK=1;

delaya(2);

SCLK=0;

delaya(2);

}

return dat;

}

/**************************************/

//根据控制字向1302读一个字节数据//

//入口参数:控制参数kong 实际参:dat

/*************************************/

uchar read1302(uchar kong)

{

uchar dat;

RST=0;

SCLK=0;

RST=1;

write1302xei(kong);

dat=read1302du();

SCLK=1;

RST=0;

return dat;

}

/**************************************/

//根据控制字向1302读一个字节数据//

//入口参数:分别写入:日期:2010-03-07 时间:23:59:54 星期天

/*************************************/

void init1302()

{

/*以下是掉电保护函数通过判断标志位是否为1来判断*/

uchar flag;

flag=read1302(0x81);//读秒数据

if(flag&0x80==1)//判断最高位是否为1,若为1则说明芯片停止工作了,若为0则说明没有停止

{

write1302(0x8e,0x00);//去掉保护

write1302(0x80,((12/10)<<4)|(12%10));/*显示54秒/*先将BCD码求模得到高位,然后左移四位,

得到了高四位,然后将BCD码求余这样就得到了低四位,然后相或就转换成了二进制代码了*/

write1302(0x82,((59/10)<<4)|(59%10));//显示59分

write1302(0x84,((23/10)<<4)|(23%10));//显示23点

write1302(0x86,((7/10)<<4)|(7%10));//显示07日

write1302(0x88,((3/10)<<4)|(3%10));//显示03月

write1302(0x8c,((10/10)<<4)|(10%10));//显示10年

write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天

write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻

write1302(0x8e,0x80);//打开保护

}

/*以下是开机复位函数*/

/*

write1302(0x8e,0x00);//去掉保护

write1302(0x80,((12/10)<<4)|(12%10));/*显示54秒/*先将BCD码求模得到高位,然后左移四位,

//得到了高四位,然后将BCD码求余这样就得到了低四位,然后相或就转换成了二进制代码了

write1302(0x82,((59/10)<<4)|(59%10));//显示59分

write1302(0x84,((23/10)<<4)|(23%10));//显示23点

write1302(0x86,((7/10)<<4)|(7%10));//显示07日

write1302(0x88,((3/10)<<4)|(3%10));//显示03月

write1302(0x8c,((10/10)<<4)|(10%10));//显示10年

write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天

write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻

write1302(0x8e,0x80);//打开保护

*/

}

/******************************************************/

/***************DS1302转换结果子程序********************/

/******************************************************/

void value()

{

readvalue=read1302(0x83);//读入分地址

fen=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分16进制转换成10进制

readvalue=read1302(0x85);//读入小时地址

shi=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将小时16进制转换成10进制

readvalue=read1302(0x87);//读入日地址

ri=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分日进制转换成10进制

readvalue=read1302(0x89);//读入月地址

yue=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分月进制转换成10进制

readvalue=read1302(0x8d);//读入年地址

nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将分年进制转换成10进制

readvalue=read1302(0x8b);//读入星期地址

xin=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分星期进制转换成10进制

}

/********************************/

/**74HC595移位寄存器送数子函数***/

/********************************/

void song(uchar dat)//带参数函数

{

uchar num;//定义变量

for(num=0;num<6;num++)//移动6次将数据发送完毕

{

dat>>=1;//将数移走一位

DATA1=CY;//为1就将74HC595数据端置1

CLK=0;//上升沿送走数据

CLK=1;//高电平形成上升沿

}

}

/******************************************************/

/***装一线数据子函数(即一行数据)主时间装数函数********/

/******************************************************/

void yixian(uchar shi,uchar ge,uchar z)

{

BUF[0]=table[(8*(shi/10))+line];//显示小时十位

BUF[1]=table[(8*(shi%10))+line];//显示小时个位

BUF[2]=table1[z*8+line];//显示两个小数点,注意是不同的数组内哟

BUF[3]=table[(8*(ge/10))+line];//显示分十位

BUF[4]=table[(8*(ge%10))+line];//显示分个位

}

/******************************************************/

/***装一线数据子函数(即一行数据)显示黑屏子程序********/

/******************************************************/

void yixianhei()

{

uchar linee,i;

if(line>8)//如果是显示下半屏,就会大于8

linee=line-8;

else

linee=line;//否则直接给数

for(i=0;i<5;i++)//循环5次得到5个数组的数

BUF[i]=table1[8+linee];//查表得到数,注意是数组1中的数

}

/******************************************************/

/*******主程序显示子程序(包括上半屏与下半屏)********/

/******************************************************/

void xianzhu(uchar nia,uchar ye,uchar rii,uchar xi)

{

uchar temp;//左移数值变量

char i;//有符号变量

for(move=0;move<8;move++)//左移8次让下半屏形成左移

{

for(line=0;line<8+lk;line++)//lk变量为选择上半屏还是全屏变量,当它等于0时,只显示上半屏时间,否则全屏显示

{

if(line<8)//如果它小于8则说明lk变量为0,只让它显示上半屏的主时间

{

yixian(shi,fen,dian);//调用主时间一线数值装载子函数

for(i=4;i>=0;i--)

song(~BUF[i]);//循环5次,将数组4-0的数全部发数到显示屏上

}

else//如果大于16则就循环左移显示下半屏的"年月日星期等信息"

{

uchar movee;//局部变量

movee=line-8;//line大于16,此时用它减去8就得到实际要显示的值

BUF[0]=table[16+movee];//显示数字"2"字

BUF[1]=table[movee];//显示数字"0"字

BUF[2]=table[(8*(nia/10))+movee];//显示年十位

BUF[3]=table[(8*(nia%10))+movee];//显示年个位

BUF[4]=table1[16+movee];//显示横线"-"

BUF[5]=table[(8*(ye/10))+movee];//显示月份十位

BUF[6]=table[(8*(ye%10))+movee];//显示月份个位

BUF[7]=table1[16+movee];//显示横线"-"

BUF[8]=table[(8*(rii/10))+movee];//显示日十位

BUF[9]=table[(8*(rii%10))+movee];//显示日个位

BUF[10]=table1[16+movee];//显示横线"-"

BUF[11]=table[(8*(xi%10))+movee];//显示星期几

for(i=4;i>=0;i--)//循环5次将数发送给下半屏

{

temp=((BUF[i+mov]<>(6-move)));//将左半屏数左移x位,然后将右

//半屏数右移6-x位,然后或一下就得到在左移了,此句是左移关键!

song(~temp);//送数出去

}

delaya(1000);//延时一下

}

LINE=table2[line];//打开行线,即174HC154行线端

CLKR=1;//在74HC595处锁存起来

CLKR=0;

CLKR=1;

delaya(800);//延时一下

}

}

mov++;//显示完一屏后,将移1个字变量加1,这样就完成下一字显示。原理是:显示下一个数组

if(mov>13)//移完14次,就将它清0。原因是,程序全部定了19个数组,前面显示数用了5个加现在14次,刚好19个数组

mov=0;//清0,重新开始显示

}

/******************************************************/

/**********闪烁间断显示子程序(包括下半屏)************/

/******************************************************/

void xianshan()

{

char ii;//有符号变量

for(line=0;line<8;line++)//扫描8次,即完成一个字的移动

{

if(flag1==0)//如果标志位为0,则以0.5秒速度显示时分钟主界面

yixian(shi,fen,dian);//调用时分秒主界面子程序

if(flag1==1)//如果标志位为1,则以0.5秒速度显示黑屏界面,形成闪烁效果

yixianhei();//调用黑屏子程序

for(ii=4;ii>=0;ii--)//循环5次将数发往显示屏

song(~BUF[ii]);//送数

LINE=table2[line];//打开行线,即174HC154行线端

CLKR=1;//在74HC595处锁存起来

CLKR=0;

CLKR=1;

delaya(800);

}

}

3208点阵时钟c语言程序,点阵万年历(带时间、年月日星期调整及闹钟功能)C程序...相关推荐

  1. 16x16点阵汉字c语言,16x16led点阵滚动汉字显示设计。

    下面给大家介绍下我制作的16*16led点阵设计,希望与各位电子爱好者共同讨论,共同进步. 下图是电路图连接图 下面是74HC154 4线-16线译码器引脚说明,以及地址/全能输入对应的输出表. 滚动 ...

  2. 小程序 数据库 时间_新增NBA2K19数据查询功能 小程序【大P数据库】更新公告

    自微信小程序[NBA2KOL2大P数据库]上线以来,我们就收到了很多朋友的热心反馈,其中就有不少朋友希望加入NBA2K19球员数据的查询功能. 之所以很多朋友会有这样的建议是因为在NBA2KOL2游戏 ...

  3. 校园跑腿微信小程序跑腿同学带直播新版源码

    校园跑腿微信小程序跑腿同学带直播新版源码 适用类型 微信小程序 测试环境:系统环境:CentOS Linux 7.6.1810 (Core).运行环境:宝塔 Linux v7.0.3(专业版).网站环 ...

  4. 时间窗车辆路径问题matlab代码,【图片】蚁群算法求解有时间窗约束的车辆路径问题matlab程序_蚁群算法吧_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 蚁群算法求解有时间窗约束的车辆路径问题matlab程序 1 简介 带时间窗的车辆路径问题(VRPTW)一般描述为从某一物流配送中心出发,用多台车辆向多个顾 ...

  5. 多接口网课题库等综合搜题微信小程序源码带流量主

    多接口网课题库等综合搜题微信小程序源码带流量主,网课搜题小程序 下载:https://download.csdn.net/download/qq_45102995/87785387

  6. 云摆摊 | 手把手教你制作ESP8266物联网创意点阵时钟,女朋友看了都想要!

    前段时间我(作者:默)在网上看到了一款很有意思的点阵时钟,它可以播报天气,查看 YouTube 的订阅数,还有好看的时间动画.你可以把它当做普通闹钟,也可以连接蓝牙把它当做音箱来使用.它的许多功能都很 ...

  7. 手把手教你制作ESP8266物联网创意点阵时钟,女朋友看了都想要!

    本文作者:默 & 铁熊 前段时间我在网上看到了一款很有意思的点阵时钟,它可以播报天气,查看 YouTube 的订阅数,还有好看的时间动画.你可以把它当做普通闹钟,也可以连接蓝牙把它当做音箱来使 ...

  8. DIY一个低成本多功能点阵时钟!

    大家好,转发一篇正念同学的文章 ---- 大家好,我是ZhengN. 本次转载一篇保姆级的diy教程:基于Esp8266的多功能点阵时钟 . 简介 很早就了解ESP8266了,当时也用这个搞过一些小d ...

  9. 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231

    基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231 这篇文章是自己打算做一个LED点阵时钟记录学习进度的,刚完成第一次点亮MAX7219四合一模块,所以先做好学习记 ...

最新文章

  1. Stuart Russell:有益AI三原则,需满足人类偏好
  2. Sublime Text 3 遇到的一些小坑的解决方法
  3. linux qt5.9交叉编译,ubuntu16交叉编译Qt5.9
  4. python typing typescript_将 python 数据转化为 TypeScript 格式
  5. 读配置文件能够保持顺序的 Java Properties 类
  6. java 查找list中指定字符串出现的次数
  7. IdentityServer4实战 - 谈谈 JWT 的安全策略
  8. [Java] 蓝桥杯ADV-170 算法提高 数字黑洞
  9. flex学习的博客...还是挺详细的
  10. 表白js特效 html爱情表白网站 html爱心代码
  11. Hive教程(01)- 初识Hive
  12. C语言如何求球的体积和表面
  13. 局域网之间两台计算机同屏,spacedesk解决两台电脑同屏的问题
  14. linux如何输入命令,linux中的命令如何输入
  15. 【历史上的今天】9 月 13 日:计算机先驱诞生日;第一台装载硬盘的超级计算机;《超级马里奥兄弟》发布
  16. 互联网日报 | 贾跃亭乐视网股票流拍;东航组建“三亚国际航空”;苹果线上WWDC大会22日举办...
  17. 教你快速随意重命名多个文件夹名称
  18. Windows服务器IIS搭建网站
  19. Mac下安装cordova-hot-code-push-cli失败
  20. 电脑桌面便签如何按农历日历设置便签提醒事项?

热门文章

  1. Spring Boot使用方法小札(3):应用启动后做一些事
  2. 图书条码mysql数据库_中琅条码软件如何连接MySQL批量生成128码
  3. MySQL数据库入门(十)多表复杂查询练习及讲解-下
  4. 微服务时代之2017年五军之战
  5. 杭电和深大计算机专业哪个好,杭州电子科技大学 还是 深圳大学?
  6. iOS调试程序的方法
  7. uart口图片_串口(USART)框图的讲解
  8. 我为啥叫这个名字,莫名其妙的油葫芦
  9. 八月暑期福利,10本Python热门书籍免费送!
  10. 【渝粤教育】 国家开放大学2020年春季 1308外国文学专题 参考试题