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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1916|回復: 10
打印 上一主題 下一主題
收起左側

求教單片機怎么和16*64的點陣屏連接

  [復制鏈接]
回帖獎勵 300 黑幣 回復本帖可獲得 150 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
在用單片機做一個數字電子鐘,學校實驗室拿的16*64的點陣屏,但是不會用

51hei圖片_20240523215620.jpg (4.12 MB, 下載次數: 41)

51hei圖片_20240523215620.jpg

51hei圖片_20240523215633.jpg (4.55 MB, 下載次數: 42)

51hei圖片_20240523215633.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1064915 發表于 2024-5-24 10:37 | 只看該作者
配套資料發上來
回復

使用道具 舉報

板凳
ID:1122046 發表于 2024-5-24 10:38 | 只看該作者
  1. #include <REGX52.H>
  2. #include "STC12C5A60S2"
  3. #include "intrins.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar l_tmpDate[]={0,0,0,1,1,1,13};//秒分時日月周年08-05-15 12:00:00

  7. uchar l_tmpdisplay[15];   
  8. code uchar Write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位讀寫位  
  9. code uchar Read_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};  
  10. sbit SCK = P1^3; //DS1302時鐘;  
  11. sbit SDA = P1^4; //DS1302數據;  
  12. sbit RST = P1^5;// DS1302復位;   
  13. uchar set=0; //按鍵選擇標志位;
  14. char key_flag=0;//按鍵加減標志位;
  15. uchar menue=0; //菜單選擇標志位;
  16. uchar ok=0;  //確認標志位;  
  17. char miao,fen,shi,ri,yue,zhou,nian;/*時間日期數值標志位;*/
  18. /////////////DS1302寫一個字節/////
  19. void Write_Ds1302_Byte(uchar temp)  
  20. {   
  21.         uchar i;   
  22.         for (i=0;i<8;i++)      //循環8次 寫入數據  
  23.         {     
  24.                  SCK=0;      
  25.                 SDA=temp&0x01;     //每次傳輸低字節      
  26.                 temp>>=1;   //右移一位      
  27.                 SCK=1;   
  28.         }
  29. }
  30. /*****************/ /*                  
  31. 寫入DS1302                                    
  32. */ /************************/
  33. void Write_Ds1302(uchar address,uchar dat )      
  34. {   
  35.         RST=0;  _nop_();   
  36.         SCK=0;  _nop_();   
  37.         RST=1;       _nop_();                    //啟動   
  38.         Write_Ds1302_Byte(address); //發送地址   
  39.         Write_Ds1302_Byte(dat);  //發送數據   
  40.         RST=0;                //恢復
  41. }
  42. /***************/ /*                  
  43. 讀出DS1302數據                              
  44. */ /*********************/
  45. uchar Read_Ds1302 ( uchar address )
  46. {     
  47.         uchar i,temp=0x00;     
  48.         RST=0;  _nop_();  _nop_();   
  49.         SCK=0;  _nop_();  _nop_();   
  50.         RST=1;  _nop_();
  51.         _nop_();   
  52.         Write_Ds1302_Byte(address);     
  53.         for (i=0;i<8;i++)   //循環8次 讀取數據   
  54.         {      
  55.                 if(SDA)   
  56.                 {   
  57.                         temp|=0x80;   
  58.                 }   //每次傳輸低字節   
  59.                 temp>>=1;   //右移一位   
  60.                 SCK=1;     _nop_();     _nop_();   
  61.                 SCK=0;   
  62.         }
  63.         RST=0;  _nop_();            
  64. //以下為DS1302復位的穩定時間   
  65.         _nop_();  
  66.         RST=0;  
  67.         SCK=0;  _nop_();  _nop_();  _nop_();  _nop_();  
  68.         SCK=1;  _nop_();  _nop_();  
  69.         SDA=0;  _nop_();  _nop_();  
  70.         SDA=1;  _nop_();  _nop_();  
  71.         return (temp);   //返回
  72. }
  73. /**************************/ /*                  
  74. 讀時鐘數據                                   
  75. */ /***********************/
  76. void Read_RTC(void)         //讀取 日歷
  77. {   
  78.         uchar i,*p;   
  79.         p=Read_RTC_address;      //地址傳遞  
  80.         for(i=0;i<7;i++)      //分7次讀取 秒分時日月周年
  81.         {   
  82.                 l_tmpDate[i]=Read_Ds1302(*p);   
  83.                 p++;  
  84.         }   
  85. }
  86. /***************************/ /*                  
  87. 設定時鐘數據                                 
  88. */ /************************/
  89. void Set_RTC(void)      //設定 日歷
  90. {  
  91.         uchar i,*p,tmp;  
  92.         for(i=0;i<7;i++)         
  93.         {           //BCD處理   
  94.                 tmp=l_tmpDate[i]/10;   
  95.                 l_tmpDate[i]=l_tmpDate[i]%10;   
  96.                 l_tmpDate[i]=l_tmpDate[i]+tmp*16;   
  97.         }      
  98.         Write_Ds1302(0x8E,0X00); //關閉寫保護;      
  99.         p=Write_rtc_address; //傳地址   
  100.         for(i=0;i<7;i++)  //7次寫入 秒分時日月周年   
  101.         {     
  102.                 Write_Ds1302(*p,l_tmpDate[i]);      
  103.                 p++;   
  104.         }   
  105.         Write_Ds1302(0x8E,0x80); //打開寫保護;  
  106. }
  107. /*********8x16字模 ****************************/
  108. //取模方式:逐行式 逆向 陰碼  寬x高=8x16
  109. uchar code table[]={
  110. /*--  文字:  0  --*/  /*--  宋體12;  
  111. 此字體下對應的點陣為:寬x高=8x16   --*/  
  112. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
  113. 0x24,0x18,0x00,0x00,
  114. /*--  文字:  1  --*/  /*--  宋體12;  
  115. 此字體下對應的點陣為:寬x高=8x16   --*/  
  116. 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
  117. 0x08,0x3E,0x00,0x00,   
  118. /*--  文字:  2  --*/  /*--  宋體12;  
  119. 此字體下對應的點陣為:寬x高=8x16   --*/  
  120. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,
  121. 0x42,0x7E,0x00,0x00,   
  122. /*--  文字:  3  --*/  /*--  宋體12;  
  123. 此字體下對應的點陣為:寬x高=8x16   --*/  
  124. 0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,
  125. 0x22,0x1C,0x00,0x00,   
  126. /*--  文字:  4  --*/  /*--  宋體12;  
  127. 此字體下對應的點陣為:寬x高=8x16   --*/  
  128. 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,
  129. 0x20,0x78,0x00,0x00,   
  130. /*--  文字:  5  --*/  /*--  宋體12;  
  131. 此字體下對應的點陣為:寬x高=8x16   --*/  
  132. 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,
  133. 0x22,0x1C,0x00,0x00,
  134. /*--  文字:  6  --*/  /*--  宋體12;  
  135. 此字體下對應的點陣為:寬x高=8x16   --*/  
  136. 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,
  137. 0x24,0x18,0x00,0x00,   
  138. /*--  文字:  7  --*/  /*--  宋體12;  
  139. 此字體下對應的點陣為:寬x高=8x16   --*/  
  140. 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,
  141. 0x08,0x08,0x00,0x00,   
  142. /*--  文字:  8  --*/  /*--  宋體12;  
  143. 此字體下對應的點陣為:寬x高=8x16   --*/  
  144. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,
  145. 0x42,0x3C,0x00,0x00,   
  146. /*--  文字:  9  --*/  /*--  宋體12;  
  147. 此字體下對應的點陣為:寬x高=8x16   --*/  
  148. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,
  149. 0x24,0x1C,0x00,0x00,   
  150. /*--  文字:  -  --*///10;  /*--  宋體12;  
  151. //此字體下對應的點陣為:寬x高=8x16   --*/  
  152. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,
  153. 0x00,0x00,0x00,0x00,




  154. /*--  文字:  :  --*///11;  /*--  宋體12;  
  155. //此字體下對應的點陣為:寬x高=8x16   --*/  
  156. ////0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
  157. //0x18,0x18,0x00,0x00,0x00,0x00,

  158. 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
  159. 0x18,0x18,0x00,0x00,
  160. /*--  文字:  _  --*///12  /*--  宋體12;  
  161. //此字體下對應的點陣為:寬x高=8x16   --*/  
  162. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  163. 0x00,0x00,0x00,0xFF,   
  164. /****************空格****13*****************/
  165. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,
  166. 0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  167. //////////////C//14//////////////
  168. //取模方式:逐行式 逆向 陰碼  寬x高=8x16
  169. 0x00,0x00,0x3C,0x3E,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
  170. 0x02,0x3E,0x3C,0x00,

  171. //14   'a'-83;  
  172. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  0x42,0x78,0x44,
  173. 0x42,0x42,0xFC,0x00,0x00,/*"a",0*/   
  174. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,  
  175. 0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00,/*"b",1*/   
  176. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,  
  177. 0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00,/*"c",2*/   
  178. 0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,  
  179. 0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00,/*"d",3*/   
  180. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  
  181. 0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00,/*"e",4*/   
  182. 0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,  
  183. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"f",5*/   
  184. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,  
  185. 0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C,/*"g",6*/
  186. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,  
  187. 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",7*/   
  188. 0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,  
  189. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"i",8*/   
  190. 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,  
  191. 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E,/*"j",9*/   
  192. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,  
  193. 0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00,/*"k",10*/   
  194. 0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,  
  195. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"l",11*/
  196. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,  
  197. 0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00,/*"m",12*/   
  198. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,  
  199. 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"n",13*/   
  200. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  
  201. 0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",14*/   
  202. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,  
  203. 0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,/*"p",15*/   
  204. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,  
  205. 0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,/*"q",16*/   
  206. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,  
  207. 0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,/*"r",17*/   
  208. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,  
  209. 0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00,/*"s",18*/
  210. 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,  
  211. 0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00,/*"t",19*/   
  212. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,  
  213. 0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00,/*"u",20*/   
  214. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,  
  215. 0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00,/*"v",21*/   
  216. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,  
  217. 0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00,/*"w",22*/   
  218. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,  
  219. 0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00,/*"x",23*/   
  220. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,  
  221. 0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07,/*"y",24*/   
  222. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,  
  223. 0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00,/*"z",25*/
  224. };
  225. /************16x16 字模 ***************/
  226. //取模方式:逐行式 逆向 陰碼  寬x高=16x16
  227. uchar code table1[]={   
  228. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  229. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,
  230. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  231. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",0*/

  232. 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
  233. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  234. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  235. 0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"二",1*/
  236.   
  237. 0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,
  238. 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
  239. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  240. 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"三",2*/
  241.   
  242. 0x00,0x00,0x00,0x00,0xFE,0x3F,0x22,0x22,
  243. 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
  244. 0x12,0x22,0x12,0x3C,0x0A,0x20,0x06,0x20,  
  245. 0x02,0x20,0xFE,0x3F,0x02,0x20,0x00,0x00,/*"四",3*/   
  246. 0x00,0x00,0xFE,0x3F,0x40,0x00,0x40,0x00,
  247. 0x40,0x00,0x40,0x00,0xFC,0x0F,0x20,0x08,
  248. 0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,  
  249. 0x10,0x08,0x10,0x08,0xFF,0x7F,0x00,0x00,/*"五",4*/
  250. 0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x01,
  251. 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,
  252. 0x20,0x02,0x20,0x04,0x10,0x08,0x10,0x10,  
  253. 0x08,0x10,0x04,0x20,0x02,0x20,0x00,0x00,/*"六",5*/   
  254. 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,
  255. 0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
  256. 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,  
  257. 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"日",6*/   
  258. 0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,
  259. 0x08,0x08,0xF8,0x0F,0x80,0x00,0x88,0x00,
  260. 0xF8,0x1F,0x84,0x00,0x82,0x00,0xF8,0x0F,
  261. 0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00,/*"星",7*/   
  262. 0x44,0x00,0x44,0x3E,0xFE,0x22,0x44,0x22,
  263. 0x44,0x22,0x7C,0x3E,0x44,0x22,0x44,0x22,
  264. 0x7C,0x22,0x44,0x3E,0x44,0x22,0xFF,0x22,  
  265. 0x20,0x21,0x44,0x21,0x82,0x28,0x41,0x10,/*"期",8*/

  266. 0x00,0x00,0xE0,0x0F,0x62,0x0C,0xE6,0x0F,0x6C,0x0C,
  267. 0xEA,0x0F,0x06,0x00,0xF4,0x1F,0x3C,0x18,0xB0,0x1A,
  268. 0xBC,0x1A,0xB4,0x1A,0xB2,0x1A,0xFB,0x3F,0xF9,0x3F,
  269. 0x00,0x00,  /////////////////////溫////9//

  270. 0x00,0x00,0xC0,0x00,0x80,0x00,0xFC,0x0F,0x0C,0x00,
  271. 0x6C,0x03,0xFC,0x0F,0x6C,0x03,0xEC,0x03,0x0C,0x00,
  272. 0xEC,0x07,0x6C,0x06,0xCC,0x03,0x66,0x06,0x33,0x0C,
  273. 0x00,0x00,/////////////////度、、、、、、10//

  274. 0x00,0x00,0x0C,0x00,0xFC,0x1F,0x0C,0x00,0xF6,0x07,
  275. 0xB0,0x01,0xB0,0x01,0xB0,0x01,0xFC,0x0F,0x80,0x01,
  276. 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,
  277. 0x00,0x00,///////////年、、、、、、、、、11//

  278. 0x00,0x00,0xF8,0x0F,0x18,0x0C,0x18,0x0C,0x18,0x0C,
  279. 0xF8,0x0D,0x18,0x0C,0x18,0x0C,0xF8,0x0D,0x18,0x0C,
  280. 0x18,0x0C,0x1C,0x0C,0x1C,0x0C,0x0E,0x0F,0x06,0x06,
  281. 0x00,0x00,///////////月////////////12///

  282. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  283. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   
  284. //9; //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  285. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  286. };
  287. /***********************************************************
  288.         功   能:16x64點陣屏加DS1302顯示時間
  289.         單片機:STC12C5A60S2
  290.         晶  振:22.1184M
  291.         作  者:蘇義江改編自網絡
  292.         時  間:2016-6-18日
  293. ***********************************************************/
  294. #include <STC12C5A60S2.h>
  295. #include "macroandconst.h"
  296. #include  <intrins.h>
  297. #define uchar unsigned char
  298. #define uint unsigned int


  299. sbit R =P2^6; //上半屏數據
  300. sbit R1=P2^7; //下半屏數據
  301. sbit CLK=P2^4;   //74HC595的移位時鐘 SHCP
  302. sbit STB=P2^3;   //輸出鎖存  STCP 595鎖存信號

  303. //行掃描
  304. sbit A1   =P2^0;
  305. sbit B1   =P2^1;
  306. sbit C1   =P2^2;
  307. sbit OE   =P2^5;    //74HC138的使能

  308. sbit fmq  =P1^7;//蜂鳴器
  309. //按鍵
  310. sbit keymenue =P0^2; //功能
  311. sbit keyup    =P0^3; //加
  312. sbit keydown  =P0^4; //減
  313. sbit keyswitch=P0^5; //調整移位
  314. sbit keyok    =P0^6; //確認

  315. sbit DQ  =P1^6; //DS18B20的數據輸入/輸出腳DQ,根據情況設定
  316. //sbit wei =P2^7;//數碼管位選573使能
  317. //sbit duan=P2^6;//數碼管段選573使能
  318. uchar code smg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
  319.                                                 0x82,0xF8,0x80,0x90,0xBF}; //顯示段碼


  320. extern uchar code table[];
  321. extern uchar code table1[];  
  322. extern uchar set; //按鍵選擇標志位;
  323. extern char key_flag;//按鍵加減標志位;
  324. extern uchar menue; //菜單選擇標志位;
  325. extern uchar ok;  //確認標志位;

  326. uint sdata;//測量到的溫度的整數部分
  327. uchar xiaoshu1;//小數第一位
  328. uchar xiaoshu2;//小數第二位
  329. uchar xiaoshu;//兩位小數
  330. bit  fg=1; //溫度正負標志

  331. uint temp;              //溫度值


  332. extern char miao,fen,shi,ri,yue,zhou,nian;/*時間日期數值標志位;*/
  333. extern uchar l_tmpDate[];//秒分時日月周年08-05-15 12:00:00
  334. extern uchar l_tmpdisplay[];   
  335. extern void Write_Ds1302(uchar address,uchar dat );
  336. extern void Read_RTC(void);
  337. void data_change();
  338. uint num;

  339. void Delay10ms()  //@11.0592MHz
  340. {  
  341.         uchar i, j;   
  342.         i = 108;  
  343.         j = 145;  
  344.         do  
  345.         {   
  346.         while (--j);  
  347.         }
  348.         while (--i);
  349. }
  350. //STC12C5A單片機定時1us DS18B20延時
  351. void  delay_b20(uchar n)
  352. {   
  353.         while(n--)
  354.           {
  355.                   _nop_();      
  356.           }   
  357. }

  358. bit Init_DS18B20(void) //發送復位
  359. {                              
  360.         bit flag;         //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在   
  361.         DQ = 1;           //先將數據線拉高   
  362.         delay_b20(1); //略微延時約6微秒      ;  
  363.         DQ = 0;           //再將數據線從高拉低,要求保持480~960us  
  364.         delay_b20(500); //略微延時約600微秒       ;         
  365. //以向DS18B20發出一持續480~960us的低電平復位脈沖   
  366.         DQ = 1;           //釋放數據線(將數據線拉高)   
  367.         delay_b20(60);   //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)  
  368.         flag=DQ;          //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)        
  369.         delay_b20(500); //延時足夠長時間,等待存在脈沖輸出完畢       ;   
  370.         return flag;    //返回檢測成功標志
  371. }               
  372. uchar ReadOneChar(void)  
  373. {   
  374.         uchar i=0;   
  375.         uchar dat;  //儲存讀出的一個字節數據   
  376.         for (i=0;i<8;i++)   
  377.         {           
  378.                 DQ =1;       // 先將數據線拉高      
  379.                 delay_b20(1);     //等待一個機器周期        
  380.                 DQ = 0;      //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序      
  381.                 delay_b20(1);     //等待一個機器周期         
  382.                 DQ = 1;     //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備     
  383.                 delay_b20(1);               ;      //延時約6us,使主機在15us內采樣      
  384.                 dat>>=1;      
  385.                 if(DQ==1)         
  386.                 dat|=0x80;  //如果讀到的數據是1,則將1存入dat   
  387.                 else     
  388.                 dat|=0x00;//如果讀到的數據是0,則將0存入dat        //將單片機檢測到的電平信號DQ存入r[i]      
  389.                 delay_b20(60);         ;              //延時3us,兩個讀時序之間必須有大于1us的恢復期      
  390.         }                        
  391.         return(dat);    //返回讀出的十六進制數據
  392. }

  393. void WriteOneChar(uchar dat)
  394. {  
  395.         uchar i=0;  
  396.         for (i=0; i<8; i++)   
  397.         {     
  398.                 DQ =1;         // 先將數據線拉高     
  399.                 delay_b20(1);      //等待一個機器周期      
  400.                 DQ=0;          //將數據線從高拉低時即啟動寫時序           
  401.                 DQ=dat&0x01;   //利用與運算取出要寫的某位二進制數據,      
  402.                   //并將其送到數據線上等待DS18B20采樣     
  403.                 delay_b20(60);         ;
  404. //延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣     
  405.                 DQ=1;          //釋放數據線           
  406.                 delay_b20(60);
  407.                 dat>>=1;       //將dat中的各二進制位數據右移1位   
  408.         }   
  409.         delay_b20(1);
  410. }
  411. void ReadyReadTemp(void)
  412. {        
  413.         Init_DS18B20();     //將DS18B20初始化   
  414.         WriteOneChar(0xCC); // 跳過讀序號列號的操作  
  415.         WriteOneChar(0x44); // 啟動溫度轉換         
  416.         delay_b20(200); //轉換一次需要延時一段時間      
  417.         Init_DS18B20();     //將DS18B20初始化   
  418.         WriteOneChar(0xCC); //跳過讀序號列號的操作   
  419.         WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位  
  420. }


  421. uchar doe[4];
  422. uint wendu_duzhuanhuan()
  423. {
  424.         uint a,b,t;
  425.         Init_DS18B20();     //將DS18B20初始化   
  426.         WriteOneChar(0xCC); // 跳過讀序號列號的操作  
  427.         WriteOneChar(0x44); // 啟動溫度轉換         
  428.         delay_b20(200); //轉換一次需要延時一段時間      
  429.         Init_DS18B20();     //將DS18B20初始化   
  430.         WriteOneChar(0xCC); //跳過讀序號列號的操作   
  431.         WriteOneChar(0xBE); //讀取溫度寄存器,前兩個?
  432.         a=ReadOneChar();
  433.         b=ReadOneChar();
  434.         t=b;
  435.         t<<=8;
  436.         t=t|a;
  437.         t=t*0.6250+0.5;
  438.         return t;
  439. }
  440. void wenduzhuan()
  441. {
  442.         uint tp;
  443.         tp=wendu_duzhuanhuan();
  444.         doe[0]=tp/1000;
  445.         doe[1]=tp%1000/100;
  446.         doe[2]=tp%100/10;
  447.         doe[3]=tp%10;
  448. }

  449. void key()
  450. {     
  451. /*判斷選擇按鍵是否按下;如果按下了當松開的時候讓背光打開;set++;*/   
  452.         if(keyswitch==0)   
  453.         {      
  454.                 Delay10ms();     
  455.                 if(keyswitch==0)      
  456.                 {      
  457.                          Delay10ms();     
  458.                         while(keyswitch==0);         
  459.                         set++;     //功能變量
  460.                         if(set>9)
  461.                         {set=0;menue=0;}         
  462.                 }   
  463.         }

  464. /*up和down按鍵的檢測;加減標志位*/   
  465.         if(keyup==0)   
  466.         {
  467.                 Delay10ms();   
  468.                 if(keyup==0)     
  469.                 {            
  470.                         Delay10ms();   
  471.                         while(keyup==0);            
  472.                         key_flag++;  //加減標志位  
  473.                 }   
  474.         }
  475.         if(keydown==0)   
  476.         {
  477.                 Delay10ms();   
  478.                 if(keydown==0)   
  479.                 {         
  480.                         Delay10ms();   
  481.                         while(keydown==0);        
  482.                         key_flag--; //加減標志位   
  483.                 }
  484.         }   
  485.         if(keymenue==0)   
  486.         {   
  487.                 Delay10ms();   
  488.                 if(keymenue==0)   //菜單選擇標志位;   
  489.                 {               
  490.                         Delay10ms();   
  491.                         while(keymenue==0);         
  492.                         menue++;     //菜單變量  
  493.                         if(menue>4)menue=0;         
  494.                 }   
  495.         }
  496.         if(keyok==0)   
  497.         {     
  498.                 Delay10ms();     
  499.                 if(keyok==0)    //確認標志位;     
  500.                 {
  501.                         Delay10ms();           
  502.                         while(keyok==0);     
  503.                         ok++;     
  504.                         if(ok>1)     
  505.                         {     
  506.                                 ok=0;   
  507.                                  menue=0;     
  508.                                 set=0;     
  509.                         }     
  510.                 }     
  511.         }     
  512. }
  513. //行掃描
  514. void hangsao(uchar num)
  515. {
  516.         switch(num)
  517.         {
  518.                 case 0:C1=0;B1=0;A1=0;break;
  519.                 case 1:C1=0;B1=0;A1=1;break;
  520.                 case 2:C1=0;B1=1;A1=0;break;
  521.                 case 3:C1=0;B1=1;A1=1;break;
  522.                 case 4:C1=1;B1=0;A1=0;break;
  523.                 case 5:C1=1;B1=0;A1=1;break;
  524.                 case 6:C1=1;B1=1;A1=0;break;
  525.                 case 7:C1=1;B1=1;A1=1;break;
  526.                 default:break;
  527.         }
  528. }
  529. /*****595寫數據部分****************/

  530. void WriteByte(uchar DataR1,uchar DataR2)
  531. {
  532.         uchar i;
  533.         for(i = 0; i < 8; i++)//循環8次,把編碼傳給鎖存器
  534.         {
  535.                   R=DataR1& 0x01;  //上屏數據  先送低位
  536.                   R1=DataR2 & 0x01;//下屏數據  先送低位
  537.                   CLK = 0;
  538.                 _nop_();
  539.                   CLK = 1;
  540.                   DataR1>>= 1;
  541.                   DataR2>>= 1;      
  542.         }
  543. }

  544. /*void WriteByte(uchar dat)   
  545. {  
  546.         uchar i;  
  547.         for (i=0;i<8;i++)   //循環8次,把編碼傳給鎖存器  
  548.         {   
  549.                 dat=dat>>1;    //右移一位,取出該字節的最低位   
  550.                 R=CY;     //將該字節的最低位傳給R   
  551.                 CLK=0;     //上升沿將數據移入595   
  552.                 CLK=1;  
  553.         }
  554. }
  555. */
  556. void writebyteshuzi(uchar n)//顯示數字函數
  557. {  
  558.         WriteByte(~table[num+n*16],~table[num+n*16+8]);
  559. }
  560. void writebytehanzi(uchar n) //顯示漢字函數
  561. {  
  562.         WriteByte(~table1[2*num+n*32+0],~table1[2*num+n*32+16]);
  563.         WriteByte(~table1[2*num+n*32+1],~table1[2*num+n*32+16+1]);
  564. }

  565. /******調時部分*************************/
  566. void set_date_time()
  567. {  
  568.         if(set==2)
  569.         {        
  570.                 menue=0;   //秒調整
  571.                 miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];   
  572.                 miao=miao+key_flag;   
  573.                 if((key_flag<0)&(miao==0))miao=59;   
  574.                 if(miao>59)miao=0;   
  575.                 miao=miao%10+(miao/10)*16;   
  576.                 Write_Ds1302(0x8E,0x00);   
  577.                 Write_Ds1302(0x80,miao);   
  578.                 Write_Ds1302(0x8E,0x80);      
  579.         }
  580.         if(set==3)
  581.         {      
  582.                 menue=0;  //分調整
  583.                 fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];  
  584.                 fen=fen+key_flag;  
  585.                 if(fen>59)  
  586.                 {  fen=0;  }   
  587.                 if((key_flag<0)&&(fen<0))
  588.                 {  fen=59;  }     
  589.                         fen=fen%10+(fen/10)*16;   
  590.                         Write_Ds1302(0x8E,0x00);  
  591.                         Write_Ds1302(0x82,fen);  
  592.                         Write_Ds1302(0x8E,0x80);   
  593.                 }
  594.         if(set==4)
  595.         {
  596.                 menue=0;  //時調整
  597.                 shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];  
  598.                 shi=shi+key_flag;  
  599.                 if(shi>23)shi=0;  
  600.                 if((key_flag<0)&&(shi<0))shi=23;     
  601.                 shi=shi%10+(shi/10)*16;   
  602.                 Write_Ds1302(0x8E,0x00);  
  603.                 Write_Ds1302(0x84,shi);  
  604.                 Write_Ds1302(0x8E,0x80);   
  605.         }
  606.         if(set==5)
  607.         {     
  608.                 menue=1;  //日調整   
  609.                 ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];  
  610.                 ri=ri+key_flag;  
  611.                 if(ri>31)ri=1;  
  612.                 if((key_flag<0)&&(ri<1))ri=31;  
  613.                 ri=ri%10+(ri/10)*16;   
  614.                 Write_Ds1302(0x8E,0x00);  
  615.                 Write_Ds1302(0x86,ri);  
  616.                 Write_Ds1302(0x8E,0x80);   
  617.                 zhou=l_tmpdisplay[12];  //周調整
  618.                 zhou=zhou+key_flag;  
  619.                 if(zhou>7)zhou=1;
  620.                 if((key_flag<0)&&(zhou<1))zhou=7;  
  621.                 zhou=zhou%10+(zhou/10)*16;   
  622.                 Write_Ds1302(0x8E,0x00);  
  623.                 Write_Ds1302(0x8A,zhou);  
  624.                 Write_Ds1302(0x8E,0x80);   
  625.         }
  626.         if(set==6)
  627.         {   
  628.                 menue=1;  //月調整   
  629.                 yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];  
  630.                 yue=yue+key_flag;  
  631.                 if(yue>12)yue=1;  
  632.                 if((key_flag<0)&&(yue<1))yue=12;  
  633.                 yue=yue%10+(yue/10)*16;   
  634.                 Write_Ds1302(0x8E,0x00);  
  635.                 Write_Ds1302(0x88,yue);  
  636.                 Write_Ds1302(0x8E,0x80);   
  637.         }
  638.         if(set==7)            
  639.         {  
  640.                 menue=1;  //年調整
  641.                 nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;  
  642.                 if(nian>79)nian=0;  
  643.                 if((key_flag<0)&&(nian<0))nian=79;   
  644.                 nian=nian%10+(nian/10)*16;   
  645.                 Write_Ds1302(0x8E,0x00);  
  646.                 Write_Ds1302(0x8C,nian);  
  647.                 Write_Ds1302(0x8E,0x80);   
  648.          
  649.         }
  650.       
  651.         if(set==8)
  652.         {   
  653.                 menue=2; //周調整  
  654.                 zhou=l_tmpdisplay[12];
  655.                 zhou=zhou+key_flag;  
  656.                 if(zhou>7)zhou=1;  
  657.                 if((key_flag<0)&&(zhou<1))zhou=7;  
  658.                 zhou=zhou%10+(zhou/10)*16;   
  659.                 Write_Ds1302(0x8E,0x00);  
  660.                 Write_Ds1302(0x8A,zhou);  
  661.                 Write_Ds1302(0x8E,0x80);      
  662.         }
  663.         if(set==9)
  664.         {   
  665.                 menue=3;   //溫度調整
  666.                
  667.                 sdata=l_tmpdisplay[13]/10;
  668.                 sdata=l_tmpdisplay[14]%10;
  669.                 sdata=sdata+key_flag;                  
  670.                 sdata=sdata%10+(sdata/10)*16;                        
  671.         }   
  672.         key_flag=0;         
  673. }
  674. /******日期、時間、星期數據的轉化****************/
  675. void data_change()
  676. {     
  677.         l_tmpdisplay[0]=l_tmpDate[6]/16;   
  678.         l_tmpdisplay[1]=l_tmpDate[6]%16;//年;     
  679.         l_tmpdisplay[2]=l_tmpDate[4]/16;   
  680.         l_tmpdisplay[3]=l_tmpDate[4]%16;//月;     
  681.         l_tmpdisplay[4]=l_tmpDate[3]/16;   
  682.         l_tmpdisplay[5]=l_tmpDate[3]%16;//日;     
  683.         l_tmpdisplay[6]=l_tmpDate[2]/16;   
  684.         l_tmpdisplay[7]=l_tmpDate[2]%16;//小時;     
  685.         l_tmpdisplay[8]=l_tmpDate[1]/16;   
  686.         l_tmpdisplay[9]=l_tmpDate[1]%16;//分鐘;      
  687.         l_tmpdisplay[10]=l_tmpDate[0]/16;   
  688.         l_tmpdisplay[11]=l_tmpDate[0]%16;//秒鐘;
  689.         l_tmpdisplay[12]=l_tmpDate[5]%16;//顯示當前星期;
  690.       
  691.         l_tmpdisplay[13]=doe[1]/16;//溫度十位;
  692.         l_tmpdisplay[14]=doe[2]%16;//溫度個位;

  693. }

  694. /*******星期顯示處理*******************/
  695. void week()
  696. {  
  697.         if(l_tmpdisplay[12]==1)  
  698.         {  
  699.                 writebyteshuzi(13);   
  700.                 writebytehanzi(7);  
  701.                 writebytehanzi(8);  
  702.                 writebytehanzi(0);   
  703.                 writebyteshuzi(13);   
  704.         }  
  705.         if(l_tmpdisplay[12]==2)  
  706.         {  
  707.                 writebyteshuzi(13);   
  708.                 writebytehanzi(7);  
  709.                 writebytehanzi(8);  
  710.                 writebytehanzi(1);
  711.                 writebyteshuzi(13);   
  712.         }   
  713.         if(l_tmpdisplay[12]==3)  
  714.         {   
  715.                 writebyteshuzi(13);   
  716.                 writebytehanzi(7);  
  717.                 writebytehanzi(8);  
  718.                 writebytehanzi(2);   
  719.                 writebyteshuzi(13);   
  720.         }
  721.         if(l_tmpdisplay[12]==4)  
  722.         {   
  723.                 writebyteshuzi(13);   
  724.                 writebytehanzi(7);  
  725.                 writebytehanzi(8);  
  726.                 writebytehanzi(3);
  727.                 writebyteshuzi(13);   
  728.         }   
  729.         if(l_tmpdisplay[12]==5)  
  730.         {   
  731.                 writebyteshuzi(13);   
  732.                 writebytehanzi(7);  
  733.                 writebytehanzi(8);  
  734.                 writebytehanzi(4);   
  735.                 writebyteshuzi(13);   
  736.         }
  737.         if(l_tmpdisplay[12]==6)  
  738.         {   
  739.                 writebyteshuzi(13);   
  740.                 writebytehanzi(7);  
  741.                 writebytehanzi(8);  
  742.                 writebytehanzi(5);   
  743.                 writebyteshuzi(13);  
  744.         }   
  745.         if(l_tmpdisplay[12]==7)  
  746.         {  
  747.                 writebyteshuzi(13);   
  748.                 writebytehanzi(7);  
  749.                 writebytehanzi(8);
  750.                 writebytehanzi(6);   
  751.                 writebyteshuzi(13);   
  752.         }
  753. }
  754. void shijian()
  755. {            
  756.         writebyteshuzi(l_tmpdisplay[6]); //時;     
  757.         writebyteshuzi(l_tmpdisplay[7]);
  758.         writebyteshuzi(11);   //顯示分號  
  759.         writebyteshuzi(l_tmpdisplay[8]);     
  760.         writebyteshuzi(l_tmpdisplay[9]); //分;     
  761.         writebyteshuzi(11); //顯示分號     
  762.         writebyteshuzi(l_tmpdisplay[10]);     
  763.         writebyteshuzi(l_tmpdisplay[11]);//秒;
  764. }
  765. void riqi()
  766. {   
  767.         writebyteshuzi(l_tmpdisplay[0]);   
  768.         writebyteshuzi(l_tmpdisplay[1]); //年;   
  769.         writebyteshuzi(10);    //顯示橫杠
  770.       
  771.         writebyteshuzi(l_tmpdisplay[2]);   
  772.         writebyteshuzi(l_tmpdisplay[3]); //月;   
  773.         writebyteshuzi(10);//顯示橫杠   
  774.         writebyteshuzi(l_tmpdisplay[4]);   
  775.         writebyteshuzi(l_tmpdisplay[5]); //日;
  776. }
  777. void wendu()
  778. {
  779.         writebyteshuzi(13);
  780.         writebytehanzi(9);  
  781.         writebytehanzi(10);
  782.         writebyteshuzi(11);

  783.         writebyteshuzi(l_tmpdisplay[13]); //溫度
  784.         writebyteshuzi(l_tmpdisplay[14]);   

  785. }
  786. void main()
  787. {  
  788. //         Set_RTC();//對時(有備用電源對時一次就行)
  789.         ReadyReadTemp();//溫度轉換
  790.         wenduzhuan();      
  791.         menue=0;  
  792.         Write_Ds1302(0x8E,0x00);  
  793.         Write_Ds1302(0x90,0x80);  
  794.         Write_Ds1302(0x8E,0x80);  
  795.         while(1)  
  796.         {
  797.                 ReadyReadTemp();//溫度轉換
  798.                 wenduzhuan();
  799.                 key();   
  800.         //        for(num=0;num<16;num++)
  801.                 for(num=0;num<8;num++)   
  802.                 {   
  803.                        
  804.                         Read_RTC();//讀取時鐘   
  805.                         data_change();//時鐘數據處理   
  806.                         set_date_time(); /////調時部分
  807.                        
  808.                         
  809.                         if(menue==0)   
  810.                         {
  811.                                 if(set==2)//調整標志位;     
  812.                                 {      
  813.                                 writebyteshuzi(l_tmpdisplay[6]); //時;      
  814.                                 writebyteshuzi(l_tmpdisplay[7]);
  815.                                 writebyteshuzi(11);   //數字數組的第11位置,是":"
  816.                                 writebyteshuzi(l_tmpdisplay[8]);      
  817.                                 writebyteshuzi(l_tmpdisplay[9]); //分;      
  818.                                 writebyteshuzi(11);      
  819.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16+8]));         
  820.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16+8]));     
  821.                                 }
  822.                                 else
  823.                                 if(set==3)     
  824.                                 {     
  825.                         //        writebyteshuzi(l_tmpdisplay[6]); //時;     
  826.                         //        writebyteshuzi(l_tmpdisplay[7]);     
  827.                         //        writebyteshuzi(11);     
  828.                         //        WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16+8]));     
  829.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16+8]));     
  830.                                 writebyteshuzi(11);     
  831.                                 writebyteshuzi(l_tmpdisplay[10]);     
  832.                                 writebyteshuzi(l_tmpdisplay[11]);//秒;     
  833.                                 }
  834.                         /*        else
  835.                                 if(set==4)     
  836.                                 {     
  837.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16+8]));     
  838.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16+8]));     
  839.                                 writebyteshuzi(11);     
  840.                                 writebyteshuzi(l_tmpdisplay[8]);     
  841.                                 writebyteshuzi(l_tmpdisplay[9]);//分;     
  842.                                 writebyteshuzi(11);     
  843.                                 writebyteshuzi(l_tmpdisplay[10]);     
  844.                                 writebyteshuzi(l_tmpdisplay[11]);//秒;     
  845.                                 } */   
  846.                                 else shijian();      
  847.                                 }
  848.                                 else
  849.                                 if(menue==1)     
  850.                                 {     
  851.                                         if(set==5) //日期調整標志位;     
  852.                                         {        
  853.                                         writebyteshuzi(l_tmpdisplay[0]); //年;      
  854.                                         writebyteshuzi(l_tmpdisplay[1]);      
  855.                                         writebyteshuzi(10);      
  856.                                         writebyteshuzi(l_tmpdisplay[2]);      
  857.                                         writebyteshuzi(l_tmpdisplay[3]); //月;
  858.                                         writebyteshuzi(10);      
  859.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16+8]));         
  860.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16+8])); //日;     
  861.                                         }     
  862.                                         else
  863.                                         if(set==6)     
  864.                                         {
  865.                         //                writebyteshuzi(l_tmpdisplay[0]); //年;   
  866.                         //                writebyteshuzi(l_tmpdisplay[1]);     
  867.                         //                writebyteshuzi(10);     
  868.                         //                WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16+8]));     
  869.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16+8]));//月;     
  870.                                         writebyteshuzi(10);     
  871.                                         writebyteshuzi(l_tmpdisplay[4]);     
  872.                                         writebyteshuzi(l_tmpdisplay[5]);//日;     
  873.                                         }     
  874.                                 /*        else
  875.                                         if(set==7)     
  876.                                         {
  877.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16+8]));     
  878.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16+8]));//年;     
  879.                                         writebyteshuzi(10);     
  880.                                         writebyteshuzi(l_tmpdisplay[2]);     
  881.                                         writebyteshuzi(l_tmpdisplay[3]);//月;     
  882.                                         writebyteshuzi(10);     
  883.                                         writebyteshuzi(l_tmpdisplay[4]);     
  884.                                         writebyteshuzi(l_tmpdisplay[5]);//日;      
  885.                                         }    */
  886.                                         else riqi();   
  887.                                 }   
  888.                                 else
  889.                                 if(menue==2)   
  890.                                 {     
  891.                                         week();   
  892.                                 }
  893.                                 else  
  894.                                 if(menue==3)   
  895.                                 {     
  896.                                            writebyteshuzi(13);
  897.                                         writebytehanzi(9);//溫;                                 
  898.                                         writebytehanzi(10);//度?
  899.                                         writebyteshuzi(11);
  900.                                         writebyteshuzi(l_tmpdisplay[13]);
  901.                                         writebyteshuzi(l_tmpdisplay[14]);  
  902.                                        
  903.                                 }
  904.                               
  905.                               
  906.                                 else menue=0;   
  907.                                 if ((set<2)&&(menue==0))   
  908.                                 {     
  909.                                         if  ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>11)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<14))riqi();     
  910.                                         else
  911.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>26)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<29))week();
  912.                                         else
  913.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>41)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<44))riqi();     
  914.                                         else
  915.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>55)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<59))wendu();     
  916.                                         else shijian();        
  917.                                 }
  918.                                          
  919.                         //        P0=num;
  920.                                 OE=0;
  921.                                    STB=0;     //輸出鎖存
  922.                                 _nop_();      
  923.                                 STB=1;
  924.                                 OE=1;  
  925.                                 hangsao(num);
  926.                 }      
  927.         }
  928. }
復制代碼
回復

使用道具 舉報

地板
ID:123289 發表于 2024-5-24 14:51 | 只看該作者
先讀通屏的使用手冊,而后在依手冊規則寫程序,就可以了。
回復

使用道具 舉報

5#
ID:788390 發表于 2024-5-29 16:13 | 只看該作者
可以參考P10的驅動方法,實際也是595驅動點燈
回復

使用道具 舉報

6#
ID:619259 發表于 2024-5-30 22:41 | 只看該作者
LED點陣,數據傳送一般為SPI總線方式和IIC總線方式,或專用芯片如MAX7221等。看電路上用的是什么芯片,按芯片時序編寫相應的驅動程序,單片機IO口再傳送數據就可以了。
回復

使用道具 舉報

7#
ID:619694 發表于 2024-6-2 12:38 | 只看該作者
就是跟8*8點陣屏幕一樣用,就是這些鎖存器有級聯的情況,搞清楚原理圖之后,寫程序控制與單片機直接相連的鎖存器,向下面的鎖存器傳數據就可以了
回復

使用道具 舉報

8#
ID:1116913 發表于 2024-7-13 17:15 | 只看該作者
如圖16*64數字電子時鐘

屏幕截圖 2024-07-13 171407.png (1.31 MB, 下載次數: 21)

屏幕截圖 2024-07-13 171407.png
回復

使用道具 舉報

9#
ID:1034262 發表于 2024-7-13 22:23 | 只看該作者
看著像74HC595驅動的,HUB08接口。
回復

使用道具 舉報

10#
ID:1129414 發表于 2024-8-5 08:29 | 只看該作者
A/B/C/D連接通用io口,DS連接RXD,SH-CP連接TXD,ST-CP連接INT0
回復

使用道具 舉報

11#
ID:982617 發表于 2024-8-7 17:09 | 只看該作者
連接單片機與16x64點陣屏的步驟主要包括硬件連接與軟件驅動。以下是基本步驟和概念:

### 硬件連接

1. **電源連接**:確保單片機的電源引腳(如VCC或5V)與點陣屏的電源(通常為5V)相連接,同時確保有地線(GND)連接。

2. **數據線**:點陣屏通常使用4線或8線制接口(取決于具體的點陣屏型號)。對于4線制接口,需要連接如下:
   - D0 - D3 或 D4 - D7:單片機的4個數據線,用于輸出點陣屏的數據信息。
   - 通常還需要連接兩個控制信號線:
     - RS(Register Select):選擇是發送數據還是命令。
     - E(Enable):用于發送數據命令,使點陣屏準備接收數據。
   - 可能還需要一個**WR(Write)**或**R/W**信號(取決于點陣屏型號),用于指示是寫入數據還是讀取數據(但有的點陣屏可能不使用此信號)。

3. **時鐘信號**:點陣屏可能需要時鐘信號(如SDO或SCLK)來同步數據傳輸。這通常是一個單片機的時鐘輸出信號(如PCLK或SCLK)。

4. **VCOM**:對于某些點陣屏,可能需要一個VCOM(Common)線,用于給點陣屏的公共電極提供電壓。

### 軟件驅動

1. **初始化**:在程序中初始化點陣屏的端口和信號線。例如,設置D0-D3或D4-D7為輸出模式,設置RS為輸出模式等。

2. **顯示驅動**:編寫代碼來控制點陣屏顯示數字或時間。這通常涉及到將數字轉換為點陣屏能理解的格式(如8-bit字節),然后通過RS和E信號按順序發送數據到點陣屏。

3. **時序控制**:根據點陣屏的規格,確保在發送數據時遵循正確的時序操作。這可能包括在發送數據前后等待特定的時鐘信號,或者在E信號高電平期間發送數據等。

4. **循環顯示**:將顯示的時間更新為單片機當前的時間。這可能涉及到定時器中斷來定期更新顯示時間。

### 示例代碼

以下是一個非常基礎的偽代碼示例,展示如何初始化點陣屏和顯示數字:

```c
// 假設電源和信號線已經正確連接
setupPins(); // 初始化端口和信號線

// 顯示數字的函數
void showDigit(int digit) {
    // 將數字轉換為點陣屏能顯示的格式
    uint8_t digitData = 0xXX; // 這里的值取決于點陣屏的格式
   
    digitalWrite(RS, HIGH); // 發送數據命令
    sendData(digitData); // 發送數據到點陣屏(假設sendData函數已經定義)

    // 等待點陣屏更新顯示
    delay(10); // 示例等待時間,根據實際點陣屏的時序調整
   
    digitalWrite(E, HIGH); // 發送使能信號
    delay(1); // 等待點陣屏處理數據
    digitalWrite(E, LOW); // 取消使能信號
}

// 顯示時間的函數
void displayTime() {
    int hour, minute, second;
    // 獲取當前時間并賦值給hour, minute, second
   
    // 顯示小時
    showDigit(hour % 10);
   
    // 顯示冒號
    showColon();
   
    // 顯示分鐘
    showDigit(minute % 10);
   
    // 顯示冒號
    showColon();
   
    // 顯示秒
    showDigit(second % 10);
}

// 假設已經定義了初始化端口、發送數據到點陣屏、以及等待時間的函數
setupPins();
while (1) {
    displayTime();
}
```

請根據實際使用的點陣屏型號和單片機型號調整代碼中的具體值和函數調用。每個點陣屏的接口和驅動細節可能有所不同,所以可能需要查閱點陣屏的用戶手冊或數據表來獲取正確的連接方式和指令格式。

### 注意事項

- 確保在編程前詳細閱讀點陣屏的用戶手冊或數據表,了解其具體的接口和操作方法。
- 如果點陣屏有特殊的初始化或復位步驟,請在程序開始時遵循這些步驟。
- 在調整顯示邏輯時,注意可能需要調整顯示的順序和時間以確保顯示正常。

希望這個指導能夠幫助您成功連接單片機與16x64點陣屏,并實現數字電子鐘功能!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩国精品一区 | 国产午夜精品一区二区三区 | 国产欧美在线视频 | 国产成人99| 欧美精品1区2区 | 欧美另类视频 | 美女久久 | 亚洲精品一二三 | 天天插天天射天天干 | 日韩国产在线 | 国产精品一区二区精品 | 中文字幕视频一区 | 日韩a视频 | 99亚洲视频 | 人人干人人超 | 在线成人av | 国产一区二区三区四区三区四 | 天堂一区二区三区 | 韩国av网站在线观看 | 91在线最新 | 欧美黑人体内she精在线观看 | 久久精品1 | 欧美久久一区二区三区 | 亚洲一区二区av | 欧美精品日韩精品 | 一区二区三区在线电影 | 看片地址 | 精品成人 | 99精品欧美一区二区蜜桃免费 | 久久成人精品 | 狠狠撸在线视频 | 国产区一区二区三区 | 国产精品美女久久久久久免费 | 国产乱码高清区二区三区在线 | 国产精品日韩欧美 | www.天天操.com| 国产1区2区在线观看 | 91久久精品 | 91精品国产91久久久久久最新 | 艹逼网| 一区二区三区免费在线观看 |