久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1682|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九色在线观看 | 久久久一区二区三区 | av毛片 | 99re在线 | 亚洲码欧美码一区二区三区 | 日韩精品一区二区三区中文字幕 | 一区二区三区视频在线 | 精品av天堂毛片久久久借种 | 在线色网 | 日韩成人精品一区二区三区 | 亚洲经典一区 | 国产免费一区二区三区 | 午夜资源 | 色一级| 久久久久久高潮国产精品视 | 99精品99久久久久久宅男 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 日韩欧美三级 | 午夜资源 | 99精品久久久久久中文字幕 | 日韩精品一区二区三区中文字幕 | 精品国产区 | 97色在线观看免费视频 | 亚洲视频中文字幕 | 永久网站 | 99精品视频在线 | 免费成人av网站 | 亚洲欧美国产精品久久 | 成在线人视频免费视频 | 黄色网毛片| 欧美日韩综合 | 欧美综合一区 | 国产99精品 | 粉色午夜视频 | 91免费福利在线 | 国产乱码精品一区二区三区五月婷 | 狠狠综合网 | 天天玩天天操天天干 | 一区二视频 | 中文字幕视频在线观看 | 91视频在线看 |