找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1331|回复: 1
打印 上一主题 下一主题
收起左侧

max7219数码管掉电时钟显示程序

[复制链接]
跳转到指定楼层
楼主
ID:581087 发表于 2019-7-10 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<STC15W4K32S4.h>                   // 引用标准库的头文件
  2. #define uchar unsigned char // 定义一下方便使用
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. char code dx516[3] _at_ 0x003b;// 这是为了仿真设置的
  6. #define WriteDeviceAddress 0xa0 // 定义器件在 IIC 总线中的地址,且方式为写
  7. #define ReadDeviceAddress 0xa1 // 定义器件在 IIC 总线中的地址,且方式为读

  8. sbit SCL=P1^6; // 串行IIC时钟
  9. sbit SDA=P1^7; // 串行IIC数据、地址

  10. sbit DIN = P0^0;                    // 串行数据输入
  11. sbit CLK = P0^1;                    // 串行时钟
  12. sbit LOAD = P4^6;                   // 显示数据锁存控制
  13. sbit led=P2^6;
  14. /****************************
  15. MAX7219特殊功能寄存器定义
  16. ************************/        

  17. #define DECODE_MODE   0x09            // 译码模式寄存器
  18. #define INTENSITY     0x0a                 // 亮度寄存器
  19. #define SCAN_LIMIT    0x0b              // 扫描位数寄存器
  20. #define SHUT_DOWN     0x0c               // 低功耗模式寄存器
  21. #define DISPLAY_TEST  0x0f            // 显示测试寄存器                                                          


  22. unsigned int cntb=0 ,n=0,m=0,k=0;

  23. void Write_Max7219_byte(unsigned char temp);
  24. void Write_Max7219(unsigned char address,unsigned char dat);
  25. void Init_Max7219(void);
  26. void delay_ms(unsigned int time);
  27. void Init_interrupt();
  28. void show();

  29. uchar Read24c02(uchar address);
  30. void  Write24c02(uchar ch,uchar address);
  31. void DelayMsK(unsigned int number);
  32. /* 主函数 */

  33. void main(void)

  34. {
  35.           Init_Max7219();                //7219初始化
  36.            Init_interrupt();        //定时器初始化
  37.               P1M0=0X00;
  38.                 P1M1=0X00;
  39.                 P2M0=0X00;
  40.                 P2M1=0X00;
  41.                 n=Read24c02(0x03);
  42.                 k=Read24c02(0x04);
  43.                 if(n>59||k>59)
  44.                 {                                           //防止首次上电读出的数据出错
  45.                 n=0;
  46.                 k=0;
  47.                 }
  48.      while(1)

  49.      {
  50.             
  51.         show();                        //调用数码管显示

  52.      }

  53. }
  54. /*******************************
  55. MAX7219显示子程序
  56. *******************************/


  57. void show()                         
  58. {
  59.                         Write24c02(n,0x03); // 写入一个字节到 24c02 中的0x03地址
  60.         DelayMsK(8000);
  61.         Write_Max7219(4,n%10);                //数码管分钟个位数值分离
  62.                            delay_ms(1);   
  63.                 Write_Max7219(3,n%100/10);        //数码管分钟十位数值分离
  64.                          delay_ms(1);  
  65.                                 Write24c02(k,0x04); // 写入一个字节到 24c02 中的0x04地址
  66.        DelayMsK(8000);
  67.                 Write_Max7219(2,k%10);           //数码管小时个位数值分离
  68.                                delay_ms(1);                                            
  69.                 Write_Max7219(1,k%100/10);        //数码管小时十位数值分离
  70.                               delay_ms(1);   


  71. }
  72. /**************************
  73. 定时器0初始化子程序
  74. *****************************/
  75. void Init_interrupt()               
  76. {
  77. TMOD=0X01;
  78. TH0=(65536-46080)/256;         //定时器赋初值11.0592MHZ晶振,赋初值TH0=(65536- 1000*50*(11.0592/12)/256)      50ms
  79. TL0=(65536-46080)/256;
  80.   TR0=1;
  81. ET0=1;
  82. IT0=1;
  83. IT1=1;
  84. EX0=1;
  85. EX1=1;
  86. EA=1;
  87. }
  88. /********************************
  89. ms级延时子程序
  90. ******************************/
  91. void delay_ms(unsigned int time)               
  92. {
  93. unsigned int i,j;
  94. for(i=time;i>0;i--)
  95. for(j=125;j>0;j--);
  96. }


  97. void t0(void) interrupt 1 using 0
  98. {
  99. TH0=(65536-46080)/256;
  100. TL0=(65536-46080)/256;
  101.   cntb ++;       
  102.    m++;
  103.     if(m==30)         ////m执行30次,led灯1s交替闪烁
  104.     {
  105.          led=~led;
  106.          m=0;
  107.     }
  108.                                   
  109.     if(cntb==1200)         //cntb执行1200次,一分钟时间到
  110.     {
  111.          n=n+1;                          //分钟变量加1操作
  112.          cntb=0;                     //定时器计数变量清零
  113.     }

  114.             if(n>59)                        //分钟 显示大于59秒
  115.           {          
  116.           k=k+1;                           //小时变量加1操作
  117.             n=0;                         //分钟变量清零       
  118.            }
  119.           
  120.               if(k>99)         //时间显示大于99小时
  121.           {          
  122.           k=99;        
  123.            }
  124.    
  125. }
  126. /******************
  127. MAX7219读数据子程序
  128. *********************/

  129. void Write_Max7219_byte(unsigned char temp)
  130. {
  131.    unsigned char i;
  132.    for(i=0;i<8;i++)                        //移位循环8次
  133.         {
  134.         CLK=0;                                        //清零时钟总线
  135.         DIN=(bit)(temp&0x80);        //每次取高字节亮
  136.         temp=temp<<1;                   //左移移位
  137.         CLK=1;                                   //时钟上升沿,发送高字节位
  138.         }
  139. }

  140.   /*****************************
  141.   MAX7219写数据子程序
  142.   *************************/
  143. void Write_Max7219(unsigned char address,unsigned char dat)
  144. {
  145. LOAD=0;                             //拉低片选线,选中器件
  146. Write_Max7219_byte(address);        //读取高字节地址位
  147. Write_Max7219_byte(dat);                //读取高字节数据位
  148. LOAD=1;                          //读取结束,上升沿锁存数据
  149. }

  150. /*****************************
  151.   MAX7219初始化子程序
  152.   *************************/
  153. void Init_Max7219(void)
  154. {
  155.     Write_Max7219(SHUT_DOWN,0x01);                   //开启正常工作模式
  156.     Write_Max7219(DISPLAY_TEST,0x00);                //选中工作模式
  157.         Write_Max7219(DECODE_MODE,0xff);                //选用全译码模式
  158.         Write_Max7219(SCAN_LIMIT,0x07);                        //8只LED全用
  159.         Write_Max7219(INTENSITY,0x0a);                        //设置初始亮度

  160. }


  161. // 定时函数
  162. void DelayMsK(unsigned int number)
  163. {
  164. unsigned char temp;
  165. for(;number!=0;number--)
  166. {
  167. for(temp=112;temp!=0;temp--) ;
  168. }
  169. }
  170. // 开始总线
  171. void Start()
  172. {
  173. SDA=1;
  174. SCL=1;
  175. SDA=0;
  176. SCL=0;
  177. }
  178. // 结束总线
  179. void Stop()
  180. {
  181. SCL=0;
  182. SDA=0;
  183. SCL=1;
  184. SDA=1;
  185. }
  186. // 发 ACK0
  187. void NoAck()
  188. {
  189. SDA=1;
  190. SCL=1;
  191. SCL=0;
  192. }
  193. // 测试 ACK
  194. bit TestAck()
  195. {
  196. bit ErrorBit;
  197. SDA=1;
  198. SCL=1;
  199. ErrorBit=SDA;
  200. SCL=0;
  201. return(ErrorBit);
  202. }
  203. // 写入 8 个 bit 到 24c02
  204. void Write8Bit(unsigned char input)
  205. {
  206. unsigned char temp;
  207. for(temp=8;temp!=0;temp--)
  208. {
  209. SDA=(bit)(input&0x80); //input&0x80 结果非零,转换成 bit 即为 1。
  210. SCL=1;
  211. SCL=0;
  212. input=input<<1;
  213. }  
  214. }
  215. void  Write24c02(uchar ch,uchar address)
  216. {
  217. Start();// 发送起始脉冲
  218. Write8Bit(WriteDeviceAddress); // 发送从器件地址,且方式为写。
  219. while(TestAck()); // 等待应答
  220. Write8Bit(address); // 发送要写入数据的字节地址
  221. while(TestAck()); // 等待应答
  222. Write8Bit(ch); // 发送要写的数据到被寻址的存储单元。
  223. while(TestAck()); // 等待应答
  224. Stop();// 发送停止信号, 24C02开始内部数据的擦写。 在内部擦写过程中 24C02 不再应答主器件的任何请求。
  225. DelayMsK(10);
  226. }
  227. // 从 24c02 中读出 8 个 bit
  228. uchar Read8Bit()
  229. {
  230. unsigned char temp,rbyte=0;
  231. for(temp=8;temp!=0;temp--)
  232. {
  233. SCL=1;
  234. rbyte=rbyte<<1;
  235. rbyte=rbyte|((unsigned char)(SDA));
  236. SCL=0;
  237. }
  238. return(rbyte);
  239. }
  240. // 选择性读操作,从 address 地址中读出 1 个字节
  241. uchar Read24c02(uchar address)
  242. {
  243. uchar ch;
  244. // 伪写操作
  245. Start();
  246. Write8Bit(WriteDeviceAddress); // 发送从器件地址,且方式为写。
  247. while(TestAck()); // 等待应答
  248. Write8Bit(address); // 发送要读的数据地址
  249. while(TestAck()); // 等待应答
  250. // 主器件重新发送起始信号和从器件地址此时 R/W 位置1
  251. Start();
  252. Write8Bit(ReadDeviceAddress); // 发送从器件地址,且方式为读。
  253. while(TestAck()); // 等待应答
  254. ch=Read8Bit(); // 读出 8bit
  255. NoAck();
  256. // 主机不应答
  257. Stop();
  258. // 主机产生停止信号
  259. return(ch);
  260. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-7-11 15:53 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表