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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2681|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的12864串行模式顯示萬年歷實(shí)現(xiàn)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:226407 發(fā)表于 2017-8-10 08:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
全部資料下載地址:
12864顯示萬年歷.rar (3.53 KB, 下載次數(shù): 44)

單片機(jī)源程序如下:
  1. /***************************************************************
  2. 系統(tǒng)名稱:電子萬年歷
  3. 日期:2008,7,18
  4. 功能描述:LCD12864串行模式顯示,DS1302讀取時(shí)間年月份,
  5. 18B20 讀取溫度
  6. ****************************************************************/
  7. #include <reg51.h>
  8. #include <intrins.h>
  9. #include <stdio.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. /*------------LCD12864相關(guān)聲明-----------------------------*/
  13. #define com 0
  14. #define dat 1
  15. sbit cs =P1^6;
  16. sbit sid=P1^4;
  17. sbit sck=P1^2;
  18. uchar code TAB1[]={"電字鐘w418781840"};//第一行初始化.
  19. uchar code TAB2[]={"20 年 月 日"}; //第二行
  20. uchar code TAB3[]={"星期 : : "}; //第三行
  21. uchar code TAB4[]={"室溫: ℃"}; //第四行
  22. /*----------------------DS1302相關(guān)聲明-------------------------*/
  23. char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:時(shí).
  24. 0x18,0x06,0x06,0x08}; //日:月:星期:年.
  25. uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302數(shù)字日期轉(zhuǎn)換為中文字符.
  26. sbit T_CLK=P2^4; /* 實(shí)時(shí)時(shí)鐘的時(shí)鐘線引腳*/
  27. sbit T_IO=P2^5; /* 實(shí)時(shí)時(shí)鐘的數(shù)據(jù)線*/
  28. sbit T_RST=P2^6; /* 實(shí)時(shí)時(shí)鐘的復(fù)位線引腳*/
  29. uchar bdata datbyte;
  30. sbit datbyte0=datbyte^0;
  31. sbit datbyte7=datbyte^7;
  32. /*--------------18B20相關(guān)聲明-------------------------------*/
  33. uchar dis1[16];
  34. sbit DQ=P1^0; /*DS18B20溫度檢測(cè)*/
  35. /*----------鍵盤相關(guān)聲明-------------------------------------*/
  36. sbit key=P3^2; //功能鍵
  37. sbit key1=P3^3; //只有加1鍵
  38. uchar sum,keyflag=0; //調(diào)用時(shí),分,秒,標(biāo)志,調(diào)用鍵盤處理標(biāo)志.
  39. /*--------------以下為L(zhǎng)CD12864相關(guān)函數(shù)--------------------------*/
  40. /**************************************************************
  41. 函數(shù)名稱:void delay1ms(uint x)
  42. 函數(shù)功能: 延時(shí)1MS
  43. ***************************************************************/
  44. void delay1ms(uint x)
  45. {
  46. uint i,j;
  47. for(i=0;i<x;i++)
  48. for(j=0;j<120;j++);
  49. }
  50. /**************************************************************
  51. 函數(shù)名稱:void w_12864byte(uchar byte)
  52. 函數(shù)功能: 寫字節(jié)
  53. **************************************************************/
  54. void w_12864byte(uchar byte)
  55. {
  56. uchar i;
  57. for(i=0;i<8;i++)
  58. {
  59. sck=0;
  60. byte<<=1;
  61. sid=CY;
  62. sck=1;
  63. }
  64. }
  65. /**************************************************************
  66. 函數(shù)名稱:uchar r_12864byte(void)
  67. 函數(shù)功能: 讀字節(jié)
  68. ***************************************************************/
  69. uchar r_12864byte(void)
  70. {
  71. uchar i,temp1,temp2;
  72. temp1 = 0;
  73. temp2 = 0;
  74. for(i=0;i<8;i++)
  75. {
  76. temp1=temp1<<1;
  77. sck = 0;
  78. sck = 1;
  79. sck = 0;
  80. if(sid) temp1++;
  81. }
  82. for(i=0;i<8;i++)
  83. {
  84. temp2=temp2<<1;
  85. sck = 0;
  86. sck = 1;
  87. sck = 0;
  88. if(sid) temp2++;
  89. }
  90. return ((0xf0&temp1)+(0x0f&temp2));
  91. }
  92. /**************************************************************
  93. 函數(shù)名稱:void c_12864busy( void )
  94. 函數(shù)功能: 檢測(cè)忙函數(shù)
  95. **************************************************************/
  96. void c_12864busy( void )
  97. {
  98. do
  99. w_12864byte(0xfc); //11111,RW(1),RS(0),0
  100. while(0x80&r_12864byte());
  101. }
  102. /**************************************************************
  103. 函數(shù)名稱:void w_12864(bit dat_com,uchar byt)
  104. 函數(shù)功能: 寫入函數(shù)
  105. ***************************************************************/
  106. void w_12864(bit dat_com,uchar byt)
  107. {
  108. uchar temp;
  109. if(dat_com==0) //為零,寫入指令
  110. temp=0xf8; //11111,RS(0),RW(0),0
  111. else //否則,寫入數(shù)據(jù)
  112. temp=0xfa; //11111,RS(1),RW(0),0
  113. cs=1;
  114. c_12864busy();
  115. w_12864byte(temp);
  116. w_12864byte(byt&0xf0); //寫入高四位
  117. w_12864byte(byt<<4); //寫入低四位
  118. cs=0;
  119. }
  120. /**************************************************************
  121. 函數(shù)名稱:void init_12864(void)
  122. 函數(shù)功能:初始化12864
  123. ***************************************************************/
  124. void init_12864(void)
  125. {
  126. w_12864(com,0x30); //基本指令功能.
  127. w_12864(com,0x0c); //顯示打開,關(guān)光標(biāo),反白關(guān).
  128. w_12864(com,0x01); //清屏指令.
  129. w_12864(com,0x06); //AC自動(dòng)加一
  130. }
  131. /*----------------以下為DS1302相關(guān)函數(shù)-------------------------*/
  132. /**************************************************************
  133. 函數(shù)名稱:void w_1302byte(uchar date)
  134. 函數(shù)功能:寫一個(gè)字節(jié)(上升沿)
  135. ***************************************************************/
  136. void w_1302byte(uchar date)
  137. { uchar i;
  138. datbyte=date;
  139. for(i=0;i<8;i++)
  140. { T_IO=datbyte0; //寫最低位
  141. T_CLK=0;
  142. T_CLK=1;
  143. datbyte>>=1;
  144. }
  145. }
  146. /**************************************************************
  147. 函數(shù)名稱:uchar r_1302byte(void)
  148. 函數(shù)功能:讀一個(gè)字節(jié)(下降沿)
  149. ***************************************************************/
  150. uchar r_1302byte(void)
  151. { uchar i;
  152. datbyte=0;
  153. for(i=0;i<8;i++)
  154. { datbyte7=T_IO; //讀最低位
  155. T_CLK=1;
  156. T_CLK=0;
  157. datbyte>>=1;
  158. }
  159. return(datbyte);
  160. }
  161. /***************************************************************
  162. 函數(shù)名稱:void write_1302(uchar addr,uchar date)
  163. 函數(shù)功能: 指定位置寫數(shù)據(jù)
  164. ****************************************************************/
  165. void write_1302(uchar addr,uchar date)
  166. { T_RST=0;
  167. T_CLK=0;
  168. T_RST=1;
  169. w_1302byte(addr);
  170. w_1302byte(date);
  171. T_CLK=0;
  172. T_RST=0;
  173. }
  174. /**************************************************************
  175. 函數(shù)名稱:uchar read_1302(uchar addr)
  176. 函數(shù)功能: 指定位置讀數(shù)據(jù)
  177. ****************************************************************/
  178. uchar read_1302(uchar addr)
  179. { uchar dat1,dat2,temp;
  180. T_RST=0;
  181. T_CLK=0;
  182. T_RST=1;
  183. w_1302byte(addr);
  184. temp=r_1302byte();
  185. T_RST=0;
  186. T_CLK=0;
  187. dat1=temp/16;
  188. dat2=temp%16;
  189. temp=dat1*10+dat2;
  190. return(temp);
  191. }
  192. /***************************************************************
  193. 函數(shù)名稱:void init_1302(void)
  194. 函數(shù)功能: 初始化
  195. *****************************************************************/
  196. void init_1302(void)
  197. { uchar i;
  198. uchar addr=0x80;
  199. write_1302(0x8e,0x00);
  200. for(i=0;i<7;i++)
  201. {
  202. write_1302(addr,TAB_1302[i]);
  203. addr+=2;
  204. }
  205. write_1302(0x8e,0x80);
  206. }
  207. /****************************************************************
  208. 函數(shù)名稱:void get_1302(void)
  209. 功能說明:讀取DS1302時(shí)鐘信息.
  210. *****************************************************************/
  211. void get_1302(void)
  212. { uchar i,addr=0x81;
  213. for(i=0;i<7;i++)
  214. { TAB_1302[i]=read_1302(addr);
  215. addr+=2;
  216. }
  217. }
  218. /*---------------以下為18B20相關(guān)函數(shù)-----------------------------*/
  219. /******************************************************************
  220. 函數(shù)名稱:void delay (uint x)
  221. 功能說明:若機(jī)器周期為1us,則本延時(shí)程序?yàn)檠訒r(shí) 4*x(us)
  222. ******************************************************************/
  223. void delay (uint x) //本板延時(shí)8us
  224. {
  225. while (--x);
  226. }

  227. /*****************************************************************
  228. 函數(shù)名稱:uchar bus_rest(void)
  229. 功能說明:產(chǎn)生單總線系統(tǒng)信號(hào)的總線復(fù)位信號(hào),并返回
  230. 總線上是否存在單總線器件信息
  231. ******************************************************************/
  232. uchar bus_rest(void)
  233. {
  234. uchar presence;
  235. DQ=0; //將DQ信號(hào)線拉低
  236. delay(29); //持續(xù)48US
  237. DQ=1; //釋放總線
  238. delay(3); //等待從設(shè)備將總線拉低
  239. presence=DQ; //保存當(dāng)前總線狀態(tài)
  240. delay(25); //等待總線初始化過程結(jié)束
  241. return presence;//返回是否有從設(shè)備將總線拉低

  242. }

  243. /****************************************************************
  244. 函數(shù)名稱:uchar r_1820BYTE(void)
  245. 功能說明:向單總線讀取一個(gè)數(shù)據(jù)字節(jié)
  246. *****************************************************************/
  247. uchar r_1820BYTE(void)
  248. {
  249. uchar i=0;
  250. uchar date = 0;
  251. for (i=8;i>0;i--)
  252. {
  253. DQ = 0; // 將DQ信號(hào)線拉低啟動(dòng)讀時(shí)隙
  254. DQ=1;// 釋放總線,等待從機(jī)動(dòng)車輛返回?cái)?shù)據(jù)位
  255. delay(1); //越接近15us越好; 準(zhǔn)備采樣總線上的信號(hào)
  256. date>>=1 ;
  257. if (DQ)
  258. date=date|0x80;
  259. delay(6);
  260. }
  261. return(date);
  262. }

  263. /*****************************************************************
  264. 函數(shù)名稱:void w_1280Byte(uchar bytevalue)
  265. 功能說明:向單總線寫一個(gè)數(shù)據(jù)字節(jié)
  266. ******************************************************************/
  267. void w_1280Byte(uchar bytevalue)
  268. {
  269. uchar i;
  270. for(i=0;i<8;i++)
  271. {
  272. DQ=0; // 將DQ信號(hào)線拉低啟動(dòng)讀時(shí)隙
  273. DQ=bytevalue&0x01; //
  274. delay(5);//等待寫時(shí)隙結(jié)束
  275. DQ=1; //釋放
  276. bytevalue>>=1;
  277. }
  278. delay(5); ////等待寫時(shí)隙結(jié)束
  279. }
  280. /*****************************************************************
  281. 函數(shù)名稱:uint read_T(void)
  282. 功能說明:讀取1820溫度
  283. *******************************************************************/
  284. uint read_T(void)
  285. {
  286. uchar a=0;
  287. uchar b=0;
  288. uint t=0;
  289. bus_rest();
  290. w_1280Byte(0xCC); // 跳過讀序號(hào)列號(hào)的操作 ;
  291. w_1280Byte(0x44); // 啟動(dòng)溫度轉(zhuǎn)換,模數(shù)轉(zhuǎn)化;
  292. bus_rest();
  293. w_1280Byte(0xCC); //跳過讀序號(hào)列號(hào)的操作 ;
  294. w_1280Byte(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 ;
  295. a=r_1820BYTE();// 低8位
  296. b=r_1820BYTE();// 高8位
  297. t=(b*256)+a;
  298. return(t);
  299. }
  300. /**************************************************************
  301. 函數(shù)名稱:void show_T(uint temp)
  302. 函數(shù)功能:顯示溫度
  303. **************************************************************/
  304. void show_T(uint temp)
  305. {
  306. int i;
  307. float ftemp;
  308. ftemp = temp* 0.0625;
  309. sprintf(dis1,"%f",ftemp);//把溫度值寫入數(shù)組內(nèi)存
  310. w_12864(com,0x98+3);
  311. for(i=0;i<5;i++)
  312. w_12864(dat,dis1[i]); //寫入溫度
  313. }
  314. /*---------------以下為顯示相關(guān)函數(shù)--------------------------*/
  315. /******************************
  316. 函數(shù)名稱: void fenli(uchar x,uchar y,uchar val)
  317. 功能描述: 指定位置寫入數(shù)據(jù)
  318. ********************************/
  319. void fenli(uchar x,uchar y,uchar val)
  320. { uchar ge,shi,addr,i=0;
  321. if(val==5)//這里把星期數(shù)字顯示的轉(zhuǎn)換為中文
  322. {
  323. w_12864(com,0x88+2);
  324. for(i=0;i<2;i++)
  325. { //一個(gè)漢字寫兩次
  326. if(TAB_1302[5]==0)w_12864(dat,TAB_XQ[i]);
  327. if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); //
  328. if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); //!!??星期三顯示沒規(guī)律,不知咋回事.
  329. if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]);
  330. if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]);
  331. if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]);
  332. if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]);
  333. }
  334. }
  335. else
  336. {
  337. shi=TAB_1302[val]/10;//分離十位
  338. ge=TAB_1302[val]%10;
  339. if(x==1)x=0x80;
  340. if(x==2)x=0x90;
  341. if(x==3)x=0x88;
  342. if(x==4)x=0x98;
  343. addr=x+y;
  344. w_12864(com,addr);//指定位置
  345. w_12864(dat,0x30+shi);//寫入
  346. w_12864(dat,0x30+ge);
  347. }
  348. }
  349. /*************************************************************
  350. 函數(shù)名稱:void display(void)
  351. 功能描述: 顯示函數(shù)
  352. **************************************************************/
  353. void display(void)
  354. { get_1302(); //讀1302
  355. fenli(3,7,0); //讀秒
  356. fenli(3,5,1); //讀分
  357. fenli(3,3,2); //讀時(shí)
  358. fenli(2,5,3); //讀日
  359. fenli(2,3,4); //讀月
  360. fenli(3,2,5); //讀星期
  361. fenli(2,1,6); //讀年
  362. }
  363. /*---------------按鍵處理相關(guān)函數(shù)--------------------------*/
  364. /************************************************************
  365. 函數(shù)名稱:void scanner()
  366. 功能描述: 按鍵函數(shù)
  367. *************************************************************/
  368. void scanner()
  369. { uchar i,j;
  370. if(!key) //功能鍵按下
  371. { delay1ms(500); //延時(shí)500MS
  372. if(!key) //還按下,退出時(shí)間調(diào)整
  373. { keyflag=0; //標(biāo)志位為0
  374. sum=0; //清0
  375. w_12864(com,0x0c);//清閃爍
  376. for(i=0;i<7;i++)//十進(jìn)制轉(zhuǎn)十六進(jìn)制
  377. { j=TAB_1302[i]/10;
  378. TAB_1302[i]=TAB_1302[i]%10;
  379. TAB_1302[i]=TAB_1302[i]+16*j;
  380. }
  381. init_1302(); //寫入1302
  382. while(!key); //等待釋放
  383. delay1ms(10); //延時(shí)消抖
  384. }
  385. else //500MS內(nèi)放開
  386. { keyflag=1; //標(biāo)志為1,進(jìn)行時(shí)間調(diào)整
  387. sum++; //功能鍵加1
  388. if(sum==8)
  389. sum=0;
  390. switch(sum)
  391. { case 1: //
  392. { w_12864(com,0x98+7);
  393. w_12864(com,0x0f);
  394. break;
  395. }
  396. case 2: //為2,年閃爍
  397. w_12864(com,0x90+1);
  398. break;
  399. case 3: //月閃爍
  400. w_12864(com,0x90+3);
  401. break;
  402. case 4: //日閃爍
  403. w_12864(com,0x90+5);
  404. break;
  405. case 5: //星期閃爍
  406. w_12864(com,0x88+2);
  407. break;
  408. case 6: //分閃爍
  409. w_12864(com,0x88+5);
  410. break;
  411. case 7: //時(shí)閃爍
  412. w_12864(com,0x88+3);
  413. break;
  414. }
  415. }
  416. }
  417. if(sum) //功能鍵按下
  418. {
  419. if(!key1)
  420. { delay1ms(10);
  421. if(!key1)
  422. { while(!key1);//等待加1鍵釋放
  423. delay1ms(10);
  424. if(sum==1)
  425. { //備用
  426. }
  427. if(sum==2)
  428. { TAB_1302[6]++;
  429. if(TAB_1302[6]==100)
  430. TAB_1302[6]=0;
  431. fenli(2,1,6);
  432. w_12864(com,0x90+1);//閃爍歸位
  433. }
  434. if(sum==3)
  435. { TAB_1302[4]++;
  436. if(TAB_1302[4]==13)
  437. TAB_1302[4]=1;
  438. fenli(2,3,4);
  439. w_12864(com,0x90+3);
  440. }
  441. if(sum==4)
  442. { TAB_1302[3]++;
  443. if(TAB_1302[3]==32)
  444. TAB_1302[3]=1;
  445. fenli(2,5,3);
  446. w_12864(com,0x90+5);
  447. }
  448. if(sum==5)
  449. { TAB_1302[5]++;
  450. if(TAB_1302[5]==7)
  451. TAB_1302[5]=0;
  452. fenli(3,2,5);
  453. w_12864(com,0x88+2);
  454. }
  455. if(sum==6)
  456. { TAB_1302[1]++;
  457. if(TAB_1302[1]==60)
  458. TAB_1302[1]=0;
  459. fenli(3,5,1);
  460. w_12864(com,0x88+5);
  461. }
  462. if(sum==7)
  463. { TAB_1302[2]++;
  464. if(TAB_1302[2]==24)
  465. TAB_1302[2]=0;
  466. fenli(3,3,2);
  467. w_12864(com,0x88+3);
  468. }
  469. }
  470. }

  471. }
  472. }
  473. //=============================================================
  474. void init(void)
  475. {
  476. uchar i;
  477. init_12864();
  478. init_1302();
  479. while(TAB1[i]!='\0')
  480. {
  481. w_12864(dat,TAB1[i]);
  482. i++;
  483. }
  484. i=0;
  485. w_12864(com,0x90);
  486. while(TAB2[i]!='\0')
  487. {
  488. w_12864(dat,TAB2[i]);
  489. i++;
  490. }
  491. i=0;
  492. w_12864(com,0x88);
  493. while(TAB3[i]!='\0')
  494. {
  495. w_12864(dat,TAB3[i]);
  496. i++;
  497. }
  498. i=0;
  499. w_12864(com,0x98);
  500. while(TAB4[i]!='\0')
  501. {
  502. w_12864(dat,TAB4[i]);
  503. i++;
  504. }
  505. }
  506. /*************************************************************
  507. 函數(shù)名稱:主函數(shù)
  508. 函數(shù)功能:
  509. **************************************************************/
  510. main()
  511. {
  512. init();
  513. while(1)
  514. {
  515. scanner(); //檢測(cè)鍵盤
  516. if(!keyflag) //標(biāo)志為0
  517. { display(); //調(diào)用顯示
  518. show_T(read_T()); //顯示溫度
  519. delay1ms(500);
  520. }
  521. }
  522. }
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:112242 發(fā)表于 2017-8-10 21:15 | 只看該作者
收藏了 謝謝LZ的分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:212052 發(fā)表于 2017-8-11 12:54 | 只看該作者
詳細(xì)的代碼。太有參考價(jià)值了。
回復(fù)

使用道具 舉報(bào)

地板
ID:276685 發(fā)表于 2018-1-16 18:00 | 只看該作者
不錯(cuò),謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线观看视频一区 | 草久久 | 性做久久久久久免费观看欧美 | 91一区二区三区 | 精品久久一区 | 欧美专区在线 | 久久久久亚洲精品 | 国产精品免费一区二区三区四区 | 爱爱小视频 | 久久精品91久久久久久再现 | 另类一区 | 涩涩视频网站在线观看 | 日韩中文字幕一区二区 | 天天操天天拍 | 在线成人免费视频 | 91九色视频在线 | 国产成都精品91一区二区三 | 九九热在线观看 | 免费久久久久久 | 偷拍自拍第一页 | 欧美一区二区三区视频在线观看 | 国产精品欧美一区二区三区 | 三级成人片 | 欧美亚州 | 中文在线播放 | 亚洲一区二区中文字幕 | 欧美日韩亚洲国产 | 精品视频一区二区三区在线观看 | 一区二区三区精品视频 | 亚洲精品自在在线观看 | 国产视频第一页 | 欧美一区二区三区久久精品 | 免费观看的av毛片的网站 | 国产精品日韩在线观看一区二区 | 人人干人人干人人干 | 久久久.com| 黄色a级一级片 | 精品福利视频一区二区三区 | 欧美在线视频a | 久久tv在线观看 | 在线观看欧美一区 |