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

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

QQ登錄

只需一步,快速開(kāi)始

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

LCD240*64液晶單片機(jī)驅(qū)動(dòng)程序 一個(gè)DS1302開(kāi)心時(shí)鐘萬(wàn)年歷作品

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102668 發(fā)表于 2016-1-11 04:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
手頭有個(gè)DS1302時(shí)鐘芯片,正好學(xué)習(xí)一下。這個(gè)蕊片具有掉電時(shí)鐘繼續(xù)走時(shí)的特點(diǎn)(要有電池或超級(jí)電容)。還是KEIL編程序,PROTEUS做仿真,然后加實(shí)物,用的lcd240×64液晶屏,驅(qū)動(dòng)芯片是t6963c,做了一個(gè)簡(jiǎn)單的開(kāi)心萬(wàn)年歷.















關(guān)于此屏幕的Proteus仿真文件下載請(qǐng)到http://www.zg4o1577.cn/bbs/dpj-42069-1.html
LCD240*64液晶的51單片機(jī)驅(qū)動(dòng)程序:
  1. #include<reg52.h>                                                // 52頭文件
  2. #include<intrins.h>                                                //        包含_onp_
  3. #define uchar unsigned char                                //宏定義uchar 為unsigned char
  4. #define uint unsigned int                                //宏定義uint   為unsiened int
  5. #define nop() _nop_()                                         //宏定義延時(shí)

  6. #define wds1302_sec                        0x80                //秒數(shù)據(jù)地址
  7. #define wds1302_min                        0x82                //分?jǐn)?shù)據(jù)地址
  8. #define wds1302_hr                        0x84                //時(shí)數(shù)據(jù)地址
  9. #define wds1302_date                0x86                //日數(shù)據(jù)地址
  10. #define wds1302_month                0x88                //月數(shù)據(jù)地址
  11. #define wds1302_day                        0x8a                //星期數(shù)據(jù)地址
  12. #define wds1302_year                0x8c                //年數(shù)據(jù)地址
  13. #define ds1302_control                0x8e                //控制數(shù)據(jù)地址
  14. #define ds1302_charger                0x90                 //涓流                        
  15. #define ds1302_clkburst                0xbe
  16. #define rds1302_sec                        0x81                //秒數(shù)據(jù)地址
  17. #define rds1302_min                        0x83                //分?jǐn)?shù)據(jù)地址
  18. #define rds1302_hr                        0x85                //時(shí)數(shù)據(jù)地址
  19. #define rds1302_date                0x87                //日數(shù)據(jù)地址
  20. #define rds1302_month                0x89                //月數(shù)據(jù)地址
  21. #define rds1302_day                        0x8b                //星期數(shù)據(jù)地址
  22. #define rds1302_year                0x8d                //年數(shù)據(jù)地址

  23. sbit ce=P1^0;          //片選
  24. sbit cd=P1^3;          //命令或數(shù)據(jù)
  25. sbit rd=P1^4;          //讀
  26. sbit wr=P1^5;          //寫(xiě)
  27. sbit rst=P1^6;          //復(fù)位
  28. sbit rest=P3^5;    //1302復(fù)位
  29. sbit sclk=P3^6;    //1302時(shí)鐘
  30. sbit io=P3^7;      //1302輸入輸出口

  31. void read1302display();

  32. //sbit sta0=P2^0;    //測(cè)執(zhí)行命令忙
  33. //sbit sta1=P2^1;    //測(cè)讀寫(xiě)數(shù)據(jù)忙
  34. //sbit sta2=P2^3;    //測(cè)連續(xù)寫(xiě)忙

  35. uchar time_buf1[8]={0x15,0x12,0x04,0x16,0x25,0x00};//年月日時(shí)分秒周
  36. uchar buf[8] ;//空年月日時(shí)分秒周
  37. //uchar buf1[8];        //存修改完成的時(shí)間數(shù)據(jù)

  38. uint text_size,graphic_size;                        //定義文本區(qū)和圖形區(qū)寬度
  39. uint text_startaddr,graphic_startaddr;              //文本和圖形土起始位
  40. uint text_startaddr_l,text_startaddr_h;             //定義文本區(qū)起始高位低位置
  41. uint graphic_startaddr_l,graphic_startaddr_h;       //定義圖形區(qū)首地址
  42. uint *p;                                            //圖片數(shù)據(jù)指針
  43. uint t,t1,key;                                                                                        //中斷計(jì)數(shù)變量
  44. uchar bcd[2];                                                                                //從DS1302讀出數(shù)據(jù)轉(zhuǎn)BCD碼
  45. uchar flag=0,next;                                        //進(jìn)入調(diào)節(jié)標(biāo)志位
  46. uchar yx=0;                                                                                        //鍵盤(pán)返回有效的值
  47. uchar code cgtab[]={
  48. //--黑點(diǎn)   --
  49.       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  50.       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  51.       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  52.       0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,         
  53. //-- 年 --
  54.       0x08,0x08,0x1F,0x11,0x21,0x41,0x1F,0x11,
  55.       0x11,0x11,0xFF,0x01,0x01,0x01,0x01,0x01,
  56.       0x00,0x08,0xFC,0x00,0x00,0x10,0xF8,0x00,
  57.       0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,
  58. //-- 月 --
  59.       0x00,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,
  60.       0x08,0x0F,0x08,0x08,0x10,0x10,0x20,0x40,
  61.       0x10,0xF8,0x10,0x10,0x10,0xF0,0x10,0x10,
  62.       0x10,0xF0,0x10,0x10,0x10,0x10,0x50,0x20,
  63. //-- 日 --
  64.       0x00,0x1F,0x10,0x10,0x10,0x10,0x10,0x1F,
  65.       0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x00,
  66.       0x10,0xF8,0x10,0x10,0x10,0x10,0x10,0xF0,
  67.       0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0x00,
  68. //-- 時(shí) --
  69.       0x00,0x04,0x7E,0x44,0x47,0x44,0x44,0x7C,
  70.       0x44,0x44,0x44,0x44,0x7C,0x44,0x00,0x00,
  71.       0x08,0x08,0x08,0x08,0xFE,0x08,0x08,0x88,
  72.       0x48,0x48,0x08,0x08,0x08,0x48,0x28,0x10,
  73. //-- 分 --
  74.       0x00,0x04,0x04,0x08,0x08,0x10,0x20,0x4F,
  75.       0x84,0x04,0x04,0x04,0x04,0x08,0x11,0x20,
  76.       0x80,0x80,0x40,0x40,0x20,0x10,0x08,0xEE,
  77.       0x24,0x20,0x20,0x20,0x20,0x20,0x40,0x80,
  78. //-- 秒 --
  79.       0x04,0x0E,0x78,0x08,0x08,0xFE,0x08,0x1D,
  80.       0x1A,0x28,0x28,0x48,0x88,0x08,0x08,0x0B,
  81.       0x20,0x20,0x20,0x20,0xA8,0xA6,0xA2,0x20,
  82.       0x24,0x24,0x28,0x10,0x20,0x40,0x80,0x00,
  83. //-- 周 --
  84.       0x00,0x3F,0x21,0x21,0x2F,0x21,0x21,0x3F,
  85.       0x20,0x27,0x24,0x24,0x24,0x47,0x84,0x00,
  86.       0x08,0xFC,0x08,0x48,0xE8,0x08,0x28,0xF8,
  87.       0x48,0xE8,0x48,0x48,0x48,0xC8,0x28,0x10,
  88. //-- 鬧 --
  89.       0x40,0x37,0x10,0x42,0x41,0x5F,0x41,0x41,
  90.       0x4F,0x49,0x49,0x49,0x49,0x41,0x41,0x40,
  91.       0x04,0xFE,0x04,0x04,0x24,0xF4,0x04,0x24,
  92.       0xF4,0x24,0x24,0x24,0x64,0x04,0x14,0x08,
  93. //-- 鐘 --
  94.       0x10,0x10,0x10,0x1C,0x21,0x21,0x7D,0x91,
  95.       0x11,0xFD,0x11,0x10,0x14,0x18,0x10,0x00,
  96.       0x20,0x20,0x20,0x24,0xFE,0x24,0x24,0x24,
  97.       0x24,0xFC,0x24,0x20,0x20,0x20,0x20,0x20,
  98. //-- 0 --
  99.       0x00,0x00,0x03,0x06,0x0C,0x0C,0x0C,0x0C,
  100.       0x0C,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
  101.       0x00,0x00,0xE0,0x30,0x18,0x18,0x18,0x18,
  102.       0x18,0x18,0x18,0x18,0x30,0xE0,0x00,0x00,
  103. //-- 1 --
  104.       0x00,0x00,0x00,0x03,0x01,0x01,0x01,0x01,
  105.       0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
  106.       0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,
  107.       0x80,0x80,0x80,0x80,0x80,0xC0,0x00,0x00,
  108. //-- 2 --
  109.       0x00,0x00,0x03,0x06,0x0C,0x0C,0x00,0x00,
  110.       0x00,0x00,0x01,0x03,0x06,0x0F,0x00,0x00,
  111.       0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,
  112.       0x60,0xC0,0x80,0x10,0x10,0xF0,0x00,0x00,
  113. //-- 3 --
  114.       0x00,0x00,0x03,0x06,0x0C,0x00,0x00,0x01,
  115.       0x00,0x00,0x00,0x0C,0x06,0x03,0x00,0x00,
  116.       0x00,0x00,0xC0,0x60,0x30,0x30,0x60,0xC0,
  117.       0x60,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
  118. //-- 4 --
  119.       0x00,0x00,0x00,0x01,0x03,0x02,0x06,0x0C,
  120.       0x0C,0x18,0x1F,0x00,0x00,0x01,0x00,0x00,
  121.       0x00,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
  122.       0xC0,0xC0,0xF0,0xC0,0xC0,0xE0,0x00,0x00,
  123. //-- 5 --
  124.       0x00,0x00,0x0F,0x0C,0x0C,0x0C,0x0F,0x0E,
  125.       0x00,0x00,0x00,0x0C,0x06,0x03,0x00,0x00,
  126.       0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x60,
  127.       0x30,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
  128. //-- 6 --
  129.       0x00,0x00,0x03,0x06,0x0C,0x0C,0x0D,0x0E,
  130.       0x0C,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
  131.       0x00,0x00,0xC0,0x60,0x30,0x00,0xC0,0x60,
  132.       0x30,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
  133. //-- 7 --
  134.       0x00,0x00,0x0F,0x0F,0x08,0x00,0x00,0x00,
  135.       0x01,0x01,0x03,0x03,0x03,0x03,0x00,0x00,
  136.       0x00,0x00,0xF0,0xF0,0x30,0x60,0xC0,0xC0,
  137.       0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  138. //-- 8 --
  139.       0x00,0x00,0x03,0x06,0x0C,0x0C,0x06,0x03,
  140.       0x06,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
  141.       0x00,0x00,0xC0,0x60,0x30,0x30,0x60,0xC0,
  142.       0x60,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
  143. //-- 9 --
  144.       0x00,0x00,0x03,0x06,0x0C,0x0C,0x0C,0x0C,
  145.       0x06,0x03,0x00,0x0C,0x06,0x03,0x00,0x00,
  146.       0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,
  147.       0x70,0xF0,0x30,0x30,0x60,0xC0,0x00,0x00,
  148. //-- : --
  149.       0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,
  150.       0x0F,0x06,0x00,0x06,0x0F,0x0F,0x06,0x00,
  151.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  152.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  153. //-- 祝 --
  154.       0x20,0x13,0x12,0x02,0xFE,0x0A,0x12,0x3B,
  155.       0x56,0x90,0x10,0x11,0x11,0x12,0x14,0x18,
  156.       0x08,0xFC,0x08,0x08,0x08,0x08,0x08,0xF8,
  157.       0xA8,0xA0,0xA0,0x20,0x22,0x22,0x1E,0x00,
  158. //-- 您 --
  159.       0x09,0x09,0x13,0x12,0x34,0x59,0x91,0x12,
  160.       0x14,0x11,0x10,0x02,0x51,0x50,0x90,0x0F,
  161.       0x00,0x00,0xFC,0x04,0x48,0x40,0x50,0x4C,
  162.       0x44,0x40,0x80,0x00,0x84,0x92,0x12,0xF0,
  163. //-- 刻 --
  164.       0x08,0x04,0x04,0xFF,0x04,0x08,0x10,0x7F,
  165.       0x02,0x04,0x09,0x72,0x06,0x19,0xE0,0x00,
  166.       0x04,0x04,0x84,0xC4,0x04,0xA4,0xA4,0x24,
  167.       0x24,0xA4,0x24,0x24,0x04,0x84,0x94,0x08,
  168. //-- 都 --
  169.       0x10,0x12,0x7F,0x12,0x14,0xFF,0x08,0x12,
  170.       0x3F,0x62,0xA2,0x3E,0x22,0x22,0x3E,0x22,
  171.       0x00,0x7C,0x44,0x44,0x48,0x48,0x50,0x48,
  172.       0x44,0x42,0x42,0x62,0x54,0x48,0x40,0x40,
  173. //-- 開(kāi) --
  174.       0x00,0x7F,0x08,0x08,0x08,0x08,0x08,0xFF,
  175.       0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,
  176.       0x08,0xFC,0x20,0x20,0x20,0x20,0x24,0xFE,
  177.       0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  178. //-- 心 --
  179.       0x02,0x01,0x00,0x00,0x08,0x08,0x28,0x28,
  180.       0x28,0x48,0x88,0x08,0x08,0x08,0x07,0x00,
  181.       0x00,0x00,0x80,0xC0,0x80,0x00,0x08,0x04,
  182.       0x02,0x02,0x02,0x00,0x10,0x10,0xF0,0x00,
  183. //-- 間 --
  184.       0x20,0x1B,0x08,0x40,0x4F,0x48,0x48,0x48,
  185.       0x4F,0x48,0x48,0x48,0x4F,0x48,0x40,0x40,
  186.       0x04,0xFE,0x04,0x24,0xF4,0x24,0x24,0x24,
  187.       0xE4,0x24,0x24,0x24,0xE4,0x24,0x14,0x08
  188. };                 

  189. /*********************延時(shí)函數(shù)************************************/
  190. void delay(uint a)
  191. {
  192.         uchar b;
  193.         for( ;a>0;a--)
  194.         for(b=110;b>0;b--);
  195. }

  196. /***********************鍵盤(pán)掃描************************************/
  197. char key_scan()
  198. {
  199.         uchar temp;                        //定義變量
  200.         P0=0xef;                                //把高位一條拉低電平 11101111 給P0
  201.         temp=P0;                                //把P0口電平讀回給臨時(shí)變量
  202.         if((temp&0x0f)!=0x0f)        //檢測(cè)有無(wú)按鍵按下
  203.         {  
  204.             delay(10);                                //延時(shí)10毫秒
  205.             
  206.             temp=P0;                                //把P0口數(shù)值讀給變量
  207.                 P0=0xef;                                //重新給P0口賦值
  208.                 if((temp&0x0f)!=0x0f)        //檢測(cè)有無(wú)按鍵按下
  209.                 {
  210.                          temp=P0;                        //把P0口數(shù)值讀給變量
  211.                         switch(temp)                //分支選擇數(shù)值
  212.                         {
  213.                                 case 0xee:                 //11101110 按鍵1按下
  214.                                         key=1;         //按鍵值為1
  215.                                                 
  216.                                         break;         //返回退出
  217.                                 case 0xed:                 //11101101 按鍵4按下
  218.                                                 key=4;         //按鍵值為4
  219.                                                 break;         //返回退出
  220.                                 case 0xeb:                 //11101011 按鍵7按下
  221.                                         key=7;         //按鍵值為7
  222.                                                 break;         //返回退出
  223.                                 case 0xe7:                 //11100111 按鍵*按下
  224.                                         key='*'; //按鍵值為*
  225.                                                 break;          //返回退出
  226.                         }
  227.                         while(temp!=0x0f)          //等待按鍵抬起
  228.                         {
  229.                                 temp=P0;                  // 把P0數(shù)值給變量
  230.                                 temp=temp&0x0f;          // 檢測(cè)按鍵是否抬起
  231.                         }
  232.                   yx=1;                   //鍵盤(pán)輸入值有效  
  233.                 }

  234.         }
  235.         P0=0xdf;                                //把高位拉低一條 11011111  值給P0
  236.         temp=P0;                                //把P0口電平讀回給臨時(shí)變量
  237.         if((temp&0x0f)!=0x0f)        //檢測(cè)有無(wú)按鍵按下
  238.         {  
  239.             delay(10);                                   //延時(shí)10毫秒
  240.             P0=0xdf;                                        //再把數(shù)值給P0
  241.             temp=P0;                                        //P0數(shù)值讀給變量
  242.                 if((temp&0x0f)!=0x0f)                //再次檢測(cè)有無(wú)鍵按下
  243.                 {
  244.                          temp=P0;                                //把P0口數(shù)值賦給變量
  245.                         switch(temp)                        //分支選擇
  246.                         {
  247.                                 case 0xde:                        //11011110 按鍵2按下
  248.                                         key=2;                //按鍵值為2
  249.                                         break;                //返回退出
  250.                                 case 0xdd:                        //11011101 按鍵5按下
  251.                                                 key=5;                //按鍵值為5
  252.                                                 break;                //返回退出
  253.                                 case 0xdb:                        //11011011 按鍵8按下
  254.                                         key=8;                //按鍵值為8
  255.                                                 break;                //退出返回
  256.                                 case 0xd7:                        //11010111 按鍵0按下
  257.                                         key=0;                //返回值為0
  258.                                                 break;                //返回退出               
  259.                         }
  260.                           while(temp!=0x0f)          //等待按鍵抬起
  261.                         {
  262.                                 temp=P0;                  // 把P0數(shù)值給變量
  263.                                 temp=temp&0x0f;          // 檢測(cè)按鍵是否抬起
  264.                         }
  265.                   yx=1;                   //鍵盤(pán)輸入值有效  
  266.                 }

  267.         }
  268.         P0=0xbf;                                //把高位拉低一條,10111111 把值給P0口
  269.         temp=P0;                                //把P0口電平讀回給臨時(shí)變量
  270.         if((temp&0x0f)!=0x0f)        //檢測(cè)有無(wú)按鍵按下
  271.         {  
  272.             delay(10);                                 //延時(shí)10毫秒
  273.             P0=0xbf;                                 //把值再給P0口
  274.             temp=P0;                                 //讀回P0口實(shí)際值
  275.                 if((temp&0x0f)!=0x0f)         //再檢測(cè)有無(wú)按鍵按下
  276.                 {
  277.                          temp=P0;                         //重新讀回P0口值
  278.                         switch(temp)                 //分支選擇
  279.                         {
  280.                                 case 0xbe:                 //10111110 按鍵3按下
  281.                                         key=3;         //按鍵值為3
  282.                                                 yx=1;    //鍵盤(pán)輸入值有效
  283.                                         break;         //返回退出
  284.                                 case 0xbd:                 //10111101 安鍵6按下
  285.                                                 key=6;         //按鍵值為6
  286.                                                 yx=1;                          //鍵盤(pán)輸入值有效
  287.                                                 break;         //返回退出
  288.                                 case 0xbb:                 //10111011 按鍵9按下
  289.                                         key=9;         //按鍵值為9
  290.                                                 yx=1;                          //鍵盤(pán)輸入值有效
  291.                                                 break;         //返回退出
  292.                                 case 0xb7:                 //10110111 按鍵#按下
  293.         //                                key='#';  //按鍵值為#
  294.                                                 flag=1;
  295.                                                 break;          //返回退出                        
  296.                         }
  297.                           while(temp!=0x0f)          //等待按鍵抬起
  298.                         {
  299.                                 temp=P0;                  // 把P0數(shù)值給變量
  300.                                 temp=temp&0x0f;          // 檢測(cè)按鍵是否抬起
  301.                         }
  302.                         
  303.                 }

  304.         }
  305.                           
  306.            return key;                   //函數(shù)結(jié)束返回按鍵數(shù)值           
  307. }

  308. /****************************ds1302寫(xiě)數(shù)據(jù)******************************/
  309. void write_date(uchar date)
  310. {
  311.         uchar i,k;                                          //定義變量
  312.         k=date;                                                  //數(shù)據(jù)賦給變量
  313.         rest=0;                    //置復(fù)位為0
  314.         sclk=0;
  315.         rest=1;                    //選中蕊片
  316. //        k=k>>1;
  317.         for(i=0;i<8;i++)           //循環(huán)8位數(shù)據(jù)
  318.         {
  319.                
  320.                 if(k&0x01)io=1;         //取出K低位給IO口
  321.                 sclk=0;                                  //拉低時(shí)鐘
  322.                 sclk=1;                //拉高時(shí)鐘數(shù)據(jù)給DS1302
  323.                
  324.                 k=k>>1;                //變量右移一位
  325.         }
  326.         rest=0;
  327.         sclk=0;
  328. }
  329.   
  330. /**************************ds1302地址寫(xiě)入數(shù)據(jù)****************************/
  331. void write_ad_dat(uint addr,uchar date)
  332. {                                                                                
  333.         uchar i;                                                        //        定義變量
  334.     rest=0;                                                                //        復(fù)位片選
  335.         sclk=0;                                                                //        拉低時(shí)鐘
  336.     rest=1;                                                                //        置位片選
  337.     for(i=0;i<8;i++)                                        //        8次循環(huán)
  338.         {
  339.                 io=addr&0x01;                                        // 把地址中低位給IO口
  340.                 sclk=1;                                                        //        拉高時(shí)鐘使數(shù)據(jù)有效
  341.                 sclk=0;                                                  //        拉低時(shí)鐘給下個(gè)高電平做準(zhǔn)備
  342.                 addr>>=1;                                          //        地址數(shù)據(jù)右移一位
  343.         }
  344.         for(i=0;i<8;i++)                                 //        8次循環(huán)
  345.         {
  346.                 io=date&0x01;                                  //        把數(shù)據(jù)低位給IO口
  347.                 sclk=1;                                                  //        拉高時(shí)鐘,使數(shù)據(jù)有效
  348.                 sclk=0;                                                  //        拉低時(shí)鐘
  349.                 date>>=1;                                          //        數(shù)據(jù)右移一位
  350.         }                                                                  
  351.         rest=0;                                                         //        復(fù)位片選
  352. }

  353. /***************************讀1302數(shù)據(jù)***********************************/
  354. uchar read_date()
  355. {
  356.         uchar i,k;                                        //定義變量
  357.         rest=1;                                                //片選為置位
  358.         sclk=1;                                                //拉高1302時(shí)鐘
  359.         for(i=0;i<8;i++)                        //8位數(shù)據(jù)循環(huán)
  360.         {         
  361.                
  362.                 if(io)                                 //讀IO口狀態(tài)給變量K
  363.                 {
  364.                         k=k|0x80;                 //如果IO口為1,變量賦值為1
  365.                 }
  366.                 sclk=1;                              //拉高時(shí)鐘                                       
  367.            delay(1);
  368.                 sclk=0;                                        //拉低時(shí)鐘寫(xiě)入數(shù)據(jù)
  369.                 k=k>>1;                                        //變量數(shù)據(jù)右移一位
  370.         }
  371.         rest=0;                     //關(guān)片選
  372.         return k;                                        //8位數(shù)據(jù)結(jié)束返回變量數(shù)值
  373. }

  374. /********************************讀地址數(shù)據(jù)********************************/
  375. uchar read_add_dat(uint addr)
  376. {        
  377.          uchar i,j;                                                //定義變量
  378.         rest=0;                                                        //復(fù)位片選
  379.         sclk=0;                                                        // 拉低時(shí)鐘電平
  380.         rest=1;                                                        // 置位片選
  381.         for(i=0;i<8;i++)                                // 8位循環(huán)
  382.         {
  383.                 sclk=0;                                                // 拉低時(shí)鐘
  384.                 io=addr&0x01;                                // 地址數(shù)據(jù)低位給IO口
  385.                 sclk=1;                                          //  拉高時(shí)鐘,使數(shù)據(jù)有效
  386.                 addr>>=1;                                        // 地址數(shù)據(jù)右移一位
  387.         }
  388.         for(i=0;i<8;i++)                          //  8次循環(huán)
  389.         {
  390.                 j>>=1;                                          //  變量右移一位
  391.                 sclk=0;                                         //        拉低時(shí)鐘
  392.                 if(io) j|=0x80;                         //        如果IO口讀出高電平,給變量高位置1
  393.            sclk=1;                                         //        拉高電平給下次讀數(shù)據(jù)做準(zhǔn)備
  394.         }
  395.         rest=0;                                                 //        復(fù)位片選
  396.         return j;                                        //                返回讀出的變量值
  397. }
  398. /*******************寫(xiě)命令*****************************************/
  399. void wrcomm(uchar comm)
  400. {
  401.         ce=0;                        //選中芯 片
  402.         rd=1;                        //讀高電平無(wú)效
  403.         cd=1;           //操作命令
  404.         wr=0;           //寫(xiě)使能
  405.         P2=comm;         //把命令送給總線
  406.         nop();                        //延時(shí)
  407.         wr=1;                        //拉高寫(xiě)
  408. }

  409. /*******************寫(xiě)數(shù)據(jù)******************************************/
  410. void wrdate(uchar date)
  411. {
  412.         ce=0;           //使能片選
  413.         rd=1;                        //讀無(wú)效
  414.         cd=0;           //操作命令
  415.         wr=0;           //使能寫(xiě)
  416.         P2=date;                //數(shù)據(jù)送給總線
  417.         nop();                        //延時(shí)
  418.         wr=1;                        //拉高寫(xiě)
  419. }

  420. /*******************測(cè)讀寫(xiě)命令忙***********************************/
  421. void check_sta01()
  422. {
  423.     uchar a;    //定義變量
  424.         ce=0;           //使能片選
  425.         wr=1;           //禁寫(xiě)
  426.         cd=1;           //命令有效
  427.         while(1)                //循環(huán)
  428.         {
  429.            P2=0xff;        //P2口為已知的高電平
  430.                 rd=0;       //使能讀
  431.                 a=P2;       //讀總線狀態(tài)
  432.                 nop();      //延時(shí)
  433.                 rd=1;       //拉高讀
  434.                 if((a&0x03)==0x03)        //測(cè)試等于0000 0011         
  435.                 return;      //測(cè)試如果讀寫(xiě)數(shù)據(jù)為不忙跳出循環(huán)
  436.         }
  437. }

  438. /*******************測(cè)試連續(xù)寫(xiě)忙************************************/
  439. void check_sta03()
  440. {
  441.     uchar a;           //定義變量
  442.         ce=0;                 //全能片選
  443.         wr=1;                 //禁寫(xiě)
  444.         cd=1;                 //命令有效
  445.         while(1)
  446.         {
  447.                 P2=0xff;                  //使P2為已知的高電平
  448.                 rd=0;                          //使能讀
  449.                 a=P2;              //讀總線狀態(tài)
  450.                 nop();             //延時(shí)
  451.                 rd=1;              //拉高讀
  452.                 if((a&0x08)==0x08)        //測(cè)試等于00001000
  453.                 return;            //測(cè)試如果連續(xù)讀為不忙跳出循環(huán)
  454.         }
  455. }

  456. /************************寫(xiě)無(wú)參數(shù)命令************************************/
  457. void no_parameter(uchar comm)
  458. {
  459.         check_sta01();              //測(cè)忙
  460.         wrcomm(comm);            //寫(xiě)命令
  461. }

  462. /************************寫(xiě)雙字節(jié)參數(shù)命令*********************************/
  463. void double_parameter(uint a,uint b,uchar c)
  464. {
  465.         check_sta01();              //測(cè)忙
  466.         wrdate(a);               //寫(xiě)第一字節(jié)參數(shù)
  467.         check_sta01();              //測(cè)忙
  468.         wrdate(b);               //寫(xiě)第二節(jié)節(jié)參數(shù)
  469.         check_sta01();              //測(cè)忙
  470.         wrcomm(c);               //寫(xiě)命令
  471. }

  472. /************************清屏全亮或全滅***********************************/
  473. void all_display(uchar state,uchar vlue)
  474. {
  475.     uint i,k;                         //定義變量
  476.         if(state==0)                     //判斷state是否為0為文本區(qū)
  477.         {
  478.                 double_parameter(text_startaddr_l,text_startaddr_h,0x24);   //文本區(qū)低位和高位起始地址
  479.                 no_parameter(0xb0);                                         //連續(xù)寫(xiě)命令
  480.                 for(i=1;i<9;i++)
  481.                 {
  482.                    for(k=0;k<30;k++)                                                          //每行為30字符(240*64 )
  483.                         {
  484.                           check_sta03();                              //測(cè)忙
  485.                           wrdate(vlue);
  486.                         }                                              //寫(xiě)入vlue值,0或1
  487.                 }
  488.                 check_sta03();                                                                          //測(cè)忙
  489.                 wrcomm(0xb2);                                                                          //關(guān)連續(xù)寫(xiě)
  490.         }
  491.         if(state==1)                         //判斷state是否為1
  492.         {
  493.                 double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);    //圖開(kāi)形區(qū)起始低,高位
  494.                 no_parameter(0xb0);                                                                                          //連續(xù)寫(xiě)命令
  495.                 for(i=30*64;i>0;i--)                                                                                  //循環(huán)
  496.                 {
  497.                         check_sta03();                                                                                          //測(cè)連續(xù)寫(xiě)忙
  498.                         wrdate(vlue);                                                                                          //寫(xiě)入vlue值
  499.                 }
  500.                 check_sta03();                                                                                                  //測(cè)忙
  501.                 wrcomm(0xb2);                                                                                                  // 關(guān)閉連續(xù)寫(xiě)
  502.         }
  503. }

  504. /****************************文本方式下寫(xiě)8*8字符******************************************/
  505. void text_ascii(uchar *addr,uchar hang,uchar lie)
  506. {
  507.         uchar temp;                                                                        //定義變量
  508.         uchar low;                                                                        //定義變量
  509.         uchar high;                                                                        //定義變量
  510.         temp=30*(hang-1)+(lie-1);                                        //每行30字符乘行加列,計(jì)算寫(xiě)入起始位置
  511.         low=temp&0x00ff;                                                        //把結(jié)果低位賦給低變量
  512.         high=(temp>>8)&0x00ff;                                                //把結(jié)果高位給高變量
  513.         double_parameter(low,high,0x24);                        //寫(xiě)入文本起始位置
  514.         no_parameter(0xb0);                                                        //連續(xù)寫(xiě)命令
  515.         check_sta03();                                                                //測(cè)忙
  516.         wrdate(*addr);                                                                //寫(xiě)入字符地址指針
  517.         check_sta03();                                                                //測(cè)連續(xù)寫(xiě)忙
  518.         wrcomm(0xb2);                                                           //關(guān)閉連續(xù)寫(xiě)
  519. }

  520. /**************************graphic下顯示圖片*********************************************/
  521. void display(uchar *p,uchar hang,uchar lie)
  522. {
  523.         uchar m,n;                                                                                        //定義變量
  524.         uint temp;                                           //定義變量
  525.         temp=(hang-1)*30+lie;                                //計(jì)算圖形寫(xiě)入地址
  526.         graphic_startaddr_l=temp&0x00ff;                     //取出低位數(shù)據(jù)
  527.         graphic_startaddr_h=(temp>>8)&0x00ff;
  528.         double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);//寫(xiě)入圖形首地址
  529.         no_parameter(0xb0);                                                                        //連續(xù)寫(xiě)命令
  530.         for(m=240;m>0;m--)                                                                        //循環(huán)行數(shù)
  531.         {
  532.                 for(n=30;n<0;n--)                                                                //每字節(jié)8位,列數(shù)/8
  533.                 {
  534.                         check_sta03();                                                                //測(cè)忙
  535.                         wrdate(* p++);                                                                //寫(xiě)入圖形指針,然后加1地址
  536.                 }
  537.         }
  538.     check_sta03();                                                                                 //測(cè)忙
  539.         wrcomm(0xb2);                                                                             //關(guān)閉連續(xù)寫(xiě)
  540. }

  541. /************************text下顯示16*16漢字**********************************************
  542. ***************text模式下是8*8字符,每個(gè)漢字要4個(gè)字符組成*********************************/
  543. void hz_display(uchar addr,uchar hang,uchar lie)
  544. {
  545.         uint temp;                                                  //定義變量
  546.         uchar low,high;                                          //定義變量
  547.         temp=30*2*(hang-1)+(lie-1)*2;          //把字的坐標(biāo)地址賦給變量
  548.         low=temp&0x00ff;                                  //取出坐標(biāo)低位數(shù)值
  549.         high=(temp>>8)&0x00ff;                          //右移8位取出坐標(biāo)高位數(shù)值
  550.         double_parameter(low,high,0x24);   //寫(xiě)入漢字坐標(biāo)
  551.         no_parameter(0xb0);                                  //開(kāi)連續(xù)寫(xiě)
  552.         check_sta03();                                          //測(cè)忙
  553.         wrdate(addr);                                          //寫(xiě)入漢字左上4分之1
  554.         check_sta03();                                          //測(cè)試忙
  555.         wrdate(addr+2);                                          //寫(xiě)入漢字右上4分之1
  556.         check_sta03();                                          //測(cè)忙
  557.         wrcomm(0xb2);                                      //關(guān)閉連續(xù)寫(xiě)
  558.         delay(1);
  559.         temp=30*2*(hang-1)+30+(lie-1)*2;          //重新計(jì)算漢字坐標(biāo)也就是寫(xiě)下部份,地址加一行(8*8)
  560.         low=temp&0x00ff;                                  //取出低位數(shù)值給變量
  561.         high=(temp>>8)&0x00ff;                          //右移8位取出高位給變量
  562.         double_parameter(low,high,0x24);   //寫(xiě)入新起始地址(寫(xiě)漢字下部份)
  563.         no_parameter(0xb0);                                  //連續(xù)寫(xiě)命令
  564.         check_sta03();                                          //測(cè)忙
  565.         wrdate(addr+1);                                          //寫(xiě)入漢字左下4分之1
  566.         check_sta03();                                          //測(cè)忙
  567.         wrdate(addr+3);                                          //寫(xiě)入漢字右下4分之1
  568.         check_sta03();                                          //測(cè)忙
  569.         wrcomm(0xb2);                                      //關(guān)閉連續(xù)寫(xiě)
  570. }

  571. /******************************自定義漢字寫(xiě)入CGRAM***************************************/
  572. void cgram()
  573. {
  574.         uint m=0;                                                        //定義變量
  575.         double_parameter(0x07,0x00,0x22);        //設(shè)定最高的1K為CGRAM  寄存器偏移設(shè)定
  576.         double_parameter(0x00,0x3c,0x24);        //
  577.         no_parameter(0xb0);                                   //開(kāi)連續(xù)寫(xiě)
  578.         for(m=0;m<896+32;m++)                                //循環(huán)
  579.         {
  580.                 check_sta03();                                   //測(cè)忙
  581.                 wrdate(cgtab[m]);                                //寫(xiě)入數(shù)據(jù)         
  582.         }
  583.         check_sta03();                                           //測(cè)忙
  584.         wrcomm(0xb2);                                                //關(guān)閉連續(xù)寫(xiě)
  585. }


  586. /*****************************定時(shí)器初始化*************************************************/
  587. void time()
  588. {
  589.         TMOD=0x01;                                                                //開(kāi)定時(shí)器0
  590.         TH0=(65536-5000)/256;                                        //賦值高
  591.         TL0=(65536-5000)%256;                                        //賦值低
  592.         EA=1;                                                                        //開(kāi)總中斷
  593.         ET0=1;                                                                        //開(kāi)定時(shí)器0中斷
  594.         TR0=1;                                                                        //啟動(dòng)定時(shí)器0
  595. }

  596. /****************************中斷函數(shù)*********************************/
  597. void t0time()interrupt 1
  598. {
  599.         TH0=(65536-5000)/256;                                         //重新賦值高位
  600.         TL0=(65536-5000)%256;                                         //重新賦值低位
  601.         t++;                                                                         //變量加
  602.         if(t==1000)                                                                 //變量計(jì)數(shù)到
  603.         {
  604.                 t=0;                                                                 //t重0開(kāi)始
  605.                 t1=!t1;                                                                 //t1取反給t1
  606.         }        
  607. }         

  608. /**************************顯示漢字基本畫(huà)面*************************************/
  609. void display1()
  610. {
  611.         hz_display(0x80+(26-1)*4,1,6);                  //開(kāi)
  612.         hz_display(0x80+(27-1)*4,1,7);                  //心
  613.         hz_display(0x80+(5-1)*4,1,8);                  //時(shí)
  614.         hz_display(0x80+(10-1)*4,1,9);                  //鐘

  615.         hz_display(0x80+(13-1)*4,2,3);                   //2
  616.     hz_display(0x80+(11-1)*4,2,4);                   //0
  617. //        hz_display(0x80+(12-1)*4,2,5);                   //1
  618. //        hz_display(0x80+(16-1)*4,2,6);                   //5
  619.         hz_display(0x80+(2-1)*4,2,7);                   //年
  620. //        hz_display(0x80+(12-1)*4,2,8);                   //1
  621. //        hz_display(0x80+(13-1)*4,2,9);               //2
  622.         hz_display(0x80+(3-1)*4,2,10);                   //月
  623. //        hz_display(0x80+(15-1)*4,2,12);           //4
  624.         hz_display(0x80+(4-1)*4,2,13);                   //日

  625.         hz_display(0x80+(5-1)*4,3,3);                   //時(shí)
  626.         hz_display(0x80+(28-1)*4,3,4);                   //間
  627. //        hz_display(0x80+(12-1)*4,3,6);                  //1
  628. //        hz_display(0x80+(17-1)*4,3,7);                  //6
  629.         hz_display(0x80+(21-1)*4,3,8);                  //:
  630. //        hz_display(0x80+(13-1)*4,3,9);                  //2
  631. //        hz_display(0x80+(16-1)*4,3,10);                  //5
  632.         hz_display(0x80+(6-1)*4,3,11);                  //分
  633.         hz_display(0x80+(7-1)*4,3,14);                  //秒

  634.         hz_display(0x80+(22-1)*4,4,2);                  //祝
  635.         hz_display(0x80+(23-1)*4,4,3);                  //您
  636.         hz_display(0x80+(5-1)*4,4,4);                  //時(shí)
  637.         hz_display(0x80+(5-1)*4,4,5);                  //時(shí)
  638.         hz_display(0x80+(24-1)*4,4,6);                  //刻
  639.         hz_display(0x80+(24-1)*4,4,7);                  //刻
  640.         hz_display(0x80+(6-1)*4,4,8);                  //分
  641.         hz_display(0x80+(6-1)*4,4,9);                  //分
  642.         hz_display(0x80+(7-1)*4,4,10);                  //秒
  643.         hz_display(0x80+(7-1)*4,4,11);                  //秒
  644.         hz_display(0x80+(25-1)*4,4,12);                  //都
  645.         hz_display(0x80+(26-1)*4,4,13);                  //開(kāi)
  646.         hz_display(0x80+(27-1)*4,4,14);                  //心                        
  647. }

  648. /**************************INIT************************************************/
  649. void init()
  650. {
  651.          
  652.          time();
  653.     rst=0;                                                                //拉低液晶屏復(fù)位腳
  654.         nop();                                                                //延時(shí)
  655.         nop();                                                                //延時(shí)
  656.         nop();                                                                //延時(shí)
  657.         rst=1;                                                                //拉高電平置位
  658.         text_size=graphic_size=30*64;                //文本和圖形區(qū)寬度
  659.         text_startaddr=0x0000;                            //文本區(qū)首地址
  660.         text_startaddr_l=text_startaddr;          //文本首地址低位
  661.         text_startaddr_h=text_startaddr>>8;          //文本首地址高位

  662.         graphic_startaddr=text_startaddr+text_size;         //圖形區(qū)首地址
  663.         graphic_startaddr_l=graphic_startaddr;                 //圖形區(qū)首地址低位
  664.         graphic_startaddr_h=graphic_startaddr>>8;         //圖形區(qū)首地址高位

  665.         double_parameter(text_startaddr_l,text_startaddr_h,0x40);        //寫(xiě)入文本首地址
  666.         double_parameter(30,0x00,0x41);                                                                //寫(xiě)入文本區(qū)長(zhǎng)度(一行幾個(gè)字節(jié))
  667.         double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x42);          //寫(xiě)入圖形區(qū)首地址
  668.         double_parameter(30,0x00,0x43);                                                                                //寫(xiě)入圖形區(qū)長(zhǎng)度(一行幾個(gè)字節(jié))
  669.                                                                                                                                  
  670.         no_parameter(0x80);                 //文本 或 圖形
  671.         no_parameter(0x98);                 //圖形開(kāi)文本關(guān)
  672.         all_display(1,0xff);          //表屏全亮
  673.         delay(5000);                         //延時(shí)
  674.         no_parameter(0xa7);                 //顯示8行光標(biāo)
  675.         no_parameter(0x94);                 //文本開(kāi)圖形關(guān)
  676.     cgram();                                   //把字模寫(xiě)入顯示屏自定義的CGRAM里
  677.           all_display(0,0x00);         //把文本區(qū)全顯示白
  678.            
  679. }

  680. /***********123123************寫(xiě)入DS1302年,月,日,時(shí)分?jǐn)?shù)據(jù)****************************/
  681. void write1302()
  682. {
  683.    
  684.         write_ad_dat(0x8e,0x00);                   //關(guān)閉寫(xiě)保護(hù)
  685.         write_ad_dat(wds1302_sec,0x80);                          //暫停
  686.         write_ad_dat(wds1302_year,buf[0]);                  //寫(xiě)年
  687.         write_ad_dat(wds1302_month,buf[1]);        //寫(xiě)月
  688.         write_ad_dat(wds1302_date,buf[2]);         //寫(xiě)天
  689.         write_ad_dat(wds1302_hr,buf[3]);           //寫(xiě)讀小時(shí)
  690.         write_ad_dat(wds1302_min,buf[4]);          //寫(xiě)分
  691.         write_ad_dat(wds1302_sec,buf[5]);          //寫(xiě)秒
  692.         write_ad_dat(ds1302_control,0x80);               //開(kāi)寫(xiě)保護(hù)
  693. }

  694. /****************************時(shí)間調(diào)節(jié)程序***********************************************/
  695. void time_tz()
  696. {
  697.     uint z;                                                                                        //        定義變量
  698.         uchar s,g;                                                                                // 變量十位,個(gè)位,高位,低位
  699.    while(flag)                                                                                //如果#按下表示要調(diào)節(jié)
  700.                                                            
  701.         {        
  702.             if(next==0)                                                                 //調(diào)節(jié)年十位標(biāo)志
  703.                 {
  704.                     write_ad_dat(0x8e,0x00);                 //關(guān)閉寫(xiě)保護(hù)
  705.                 write_ad_dat(wds1302_sec,0x80);                //暫停1302
  706.                     buf[0]&=0x0f;                                                    //清空年十位,變成0000
  707.                     buf[0]|=key_scan()<<4;                                    //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  708.                     if(yx)next=1;
  709.                       write_ad_dat(wds1302_year,buf[0]);                  //寫(xiě)年數(shù)據(jù)                                                         
  710.                     read1302display();                                                  //讀出1302中數(shù)據(jù)
  711.                 hz_display(0x80+0*4,2,5);                            //年十位黑點(diǎn)
  712.                     delay(200);                                                                //延時(shí)
  713.                 hz_display(0x80+(11-1+(buf[0]>>4))*4,2,5);   //年十位
  714.                         yx=0;                                                                                 //標(biāo)志位有效(就是有按鍵按下)
  715.                  }                                                                                                 //清除按鍵有效標(biāo)志位

  716.                 if(next==1)                                                                         //調(diào)節(jié)年個(gè)位標(biāo)志
  717.                 {                                                                                                
  718.                         buf[0]&=0xf0;                                                                  //清空年個(gè)位,變成0000
  719.                     buf[0]|=key_scan();                                                  //鍵盤(pán)返回值或上數(shù)組
  720.                     if(yx)next=2;                                                                  //如果如果按鍵標(biāo)志位為有效,使調(diào)標(biāo)志到下一調(diào)節(jié)位
  721.                       write_ad_dat(wds1302_year,buf[0]);                      //寫(xiě)年數(shù)據(jù)                                                         
  722.                     read1302display();                                                                //讀1302中數(shù)據(jù)供顯示
  723.                 hz_display(0x80+0*4,2,6);                                //年個(gè)位黑點(diǎn)
  724.                     delay(200);                                                                        //延時(shí)
  725.                 hz_display(0x80+(11-1+(buf[0]))*4,2,6);                 //個(gè)十位
  726.                         yx=0;                                                                                        //清除鍵盤(pán)有效標(biāo)志位
  727.                 }

  728.                 if(next==2)                                                                           //月十位調(diào)節(jié)標(biāo)志
  729.                 {
  730.                     buf[1]&=0x0f;                                                                  //清空月十位,變成0000
  731.                     if((1>=key_scan())&yx)                                       //測(cè)試鍵盤(pán)輸入數(shù)小于等于1和輸入有效都為1
  732.                           {
  733.                                  buf[1]|=key<<4;                                                  //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  734.                          next=3;                                                                  //使調(diào)節(jié)標(biāo)志位到月個(gè)位有效
  735.                                 }
  736.                       write_ad_dat(wds1302_month,buf[1]);                   //寫(xiě)月                                                         
  737.                     read1302display();                                                                //讀出1302中數(shù)據(jù)供顯示
  738.                 hz_display(0x80+0*4,2,8);                                //月十位黑點(diǎn)
  739.                     delay(200);                                                                        //延時(shí)
  740.                 hz_display(0x80+(11-1+(buf[1]>>4))*4,2,8);     //月十位
  741.                         yx=0;                                                                                        //清除鍵盤(pán)輸入數(shù)值有效位
  742.                  }

  743.                 if(next==3)                                                                                //月個(gè)位調(diào)節(jié)標(biāo)志
  744.                 {
  745.                         buf[1]&=0xf0;                                                                  //清空月個(gè)位,變成0000
  746.                     if((2>=key_scan())&yx)                                                  //測(cè)試輸入值小于等于2和輸入有效
  747.                           {
  748.                            buf[1]|=key;                                                      //鍵盤(pán)返回值或上數(shù)組(給數(shù)組賦值)
  749.                        next=4;                                                                          //使調(diào)節(jié)標(biāo)志位到小時(shí)調(diào)節(jié)
  750.                           }
  751.                       write_ad_dat(wds1302_month,buf[1]);                  //寫(xiě)月                                                         
  752.                     read1302display();                                                          //讀1302數(shù)據(jù)
  753.                 hz_display(0x80+0*4,2,9);                                //月個(gè)位黑點(diǎn)
  754.                     delay(200);                                                                        //延時(shí)
  755.                 hz_display(0x80+(11-1+(buf[1]&0x0f))*4,2,9);    //月個(gè)位
  756.                         yx=0;                                                                                        //清除鍵盤(pán)輸入有效位
  757.                 }
  758.                                                                                                                   
  759.                  if(next==4)                                                                           //日十位調(diào)節(jié)標(biāo)志
  760.                 {
  761.                     buf[2]&=0x0f;                                                                  //清空日十位,變成0000
  762.                     if((3>=key_scan())&yx)                                       //如果輸入值小于等于3和鍵盤(pán)輸入地為1
  763.                           {
  764.                                  buf[2]|=key<<4;                                                  //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  765.                          next=5;                                                                  //使調(diào)節(jié)標(biāo)志位到日個(gè)位
  766.                                 }
  767.                       write_ad_dat(wds1302_date,buf[2]);                      //寫(xiě)日數(shù)據(jù)                                                         
  768.                     read1302display();                                                          //讀出1302數(shù)據(jù)
  769.                 hz_display(0x80+0*4,2,11);                            //日十位黑點(diǎn)
  770.                     delay(200);                                                                        //延時(shí)
  771.                 hz_display(0x80+(11-1+(buf[2]>>4))*4,2,11);         //日十位
  772.                         yx=0;                                                                                        //清除鍵盤(pán)輸入有效
  773.                  }
  774.                                                                                                                         
  775.                 if(next==5)                                                                          //日個(gè)位調(diào)節(jié)標(biāo)志
  776.                 {
  777.                         buf[2]&=0xf0;                                                                  //清空日個(gè)位,變成0000
  778.                     if((9>=key_scan())&yx)                                                //如果輸入值小于等于9和輸入有效都為1
  779.                           {
  780.                            buf[2]|=key;                                                    //鍵盤(pán)返回值或上數(shù)組
  781.                        next=6;                                                                        //使調(diào)節(jié)標(biāo)志為時(shí)十位有效
  782.                                 if(buf[2]>0x31)next=4;                                        //如果輸入的日數(shù)據(jù)大于31天,回到日十位重新輸入
  783.                           }
  784.                       write_ad_dat(wds1302_date,buf[2]);                     //寫(xiě)日數(shù)據(jù)                                                         
  785.                     read1302display();                                                         //讀出1302中數(shù)據(jù)
  786.                 hz_display(0x80+0*4,2,12);                           //日個(gè)位黑點(diǎn)
  787.                     delay(200);                                                                  //延時(shí)
  788.                 hz_display(0x80+(11-1+(buf[2]&0x0f))*4,2,12);  //日個(gè)位
  789.                         yx=0;                                                                                  //清除鍵盤(pán)輸入有效標(biāo)志
  790.                 }

  791.                 if(next==6)                                                                          //小時(shí)調(diào)節(jié)標(biāo)志
  792.                 {
  793.                     buf[3]&=0x0f;                                                                  //清空時(shí)十位,變成0000
  794.                     if((2>=key_scan())&yx)                                       //如果輸入的值小于等于2,和鍵盤(pán)輸入有效
  795.                           {
  796.                                  buf[3]|=key<<4;                                                  //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  797.                          next=7;                                                                  //使調(diào)節(jié)標(biāo)志位以小時(shí)的個(gè)位
  798.                                 }
  799.                       write_ad_dat(wds1302_hr,buf[3]);                      //寫(xiě)小時(shí)數(shù)據(jù)                                                         
  800.                     read1302display();                                                          //讀1302數(shù)據(jù)
  801.                 hz_display(0x80+0*4,3,6);                                //時(shí)十位黑點(diǎn)
  802.                     delay(200);                                                                        //延時(shí)
  803.                 hz_display(0x80+(11-1+(buf[3]>>4))*4,3,6);     //時(shí)十位
  804.                         yx=0;
  805.                  }
  806.                                                                                                                  
  807.                 if(next==7)                                                                         //小時(shí)個(gè)位調(diào)節(jié)標(biāo)志
  808.                 {
  809.                         buf[3]&=0xf0;                                                                 //清空時(shí)個(gè)位,變成0000
  810.                     if((9>=key_scan())&yx)                                                 //輸入值和輸入有效都為1
  811.                           {
  812.                            buf[3]|=key;                                                     //鍵盤(pán)返回值或上數(shù)組
  813.                        next=8;                                                                         //調(diào)節(jié)標(biāo)志位到分十位
  814.                                 if(buf[3]>=0x24)next=6;                                         //如果輸入的數(shù)值大于24,返回時(shí)十位重新輸入
  815.                           }
  816.                       write_ad_dat(wds1302_hr,buf[3]);                      //寫(xiě)時(shí)數(shù)據(jù)                                                         
  817.                     read1302display();                                                          //讀1302中數(shù)據(jù)
  818.                 hz_display(0x80+0*4,3,7);                               //時(shí)個(gè)位黑點(diǎn)
  819.                     delay(200);                                                                  //延時(shí)
  820.                 hz_display(0x80+(11-1+(buf[3]&0x0f))*4,3,7);         //時(shí)個(gè)位
  821.                         yx=0;                                                                                  //清除鍵盤(pán)輸入有效標(biāo)志位
  822.                 }

  823.                 if(next==8)                                                                           //分十位調(diào)節(jié)標(biāo)志
  824.                 {
  825.                     buf[4]&=0x0f;                                                                  //清空分十位,變成0000
  826.                     if((5>=key_scan())&yx)                                       //輸入值小于等于5和鍵盤(pán)輸入都有效
  827.                           {
  828.                                  buf[4]|=key<<4;                                                  //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  829.                          next=9;                                                                  //調(diào)節(jié)標(biāo)志位到分個(gè)位
  830.                                 }
  831.                       write_ad_dat(wds1302_min,buf[4]);                      //寫(xiě)分?jǐn)?shù)據(jù)                                                         
  832.                     read1302display();                                                          //讀1302中數(shù)據(jù)
  833.                 hz_display(0x80+0*4,3,9);                               //分十位黑點(diǎn)
  834.                     delay(200);                                                                  //延時(shí)
  835.                 hz_display(0x80+(11-1+(buf[4]>>4))*4,3,9);    //分十位
  836.                         yx=0;                                                                                  //清除鍵盤(pán)輸入有效標(biāo)志位
  837.                  }

  838.                 if(next==9)                                                                          //分個(gè)位調(diào)節(jié)標(biāo)志
  839.                 {
  840.                         buf[4]&=0xf0;                                                                  //清空分個(gè)位,變成0000
  841.                     if((9>=key_scan())&yx)                                                  //輸入值小于等于9和輸入標(biāo)志都有效
  842.                           {
  843.                            buf[4]|=key;                                                     //鍵盤(pán)返回值或上數(shù)組
  844.                        next=10;                                                                 //調(diào)節(jié)標(biāo)志位到秒十位
  845.                           }
  846.                       write_ad_dat(wds1302_min,buf[4]);                     //寫(xiě)分?jǐn)?shù)據(jù)                                                         
  847.                     read1302display();                                                         //讀1302中數(shù)據(jù)
  848.                 hz_display(0x80+0*4,3,10);                            //分個(gè)位黑點(diǎn)
  849.                     delay(200);                                                                        //延時(shí)
  850.                 hz_display(0x80+(11-1+(buf[4]&0x0f))*4,3,10);  //分個(gè)位
  851.                         yx=0;                                                                                        //清除鍵盤(pán)輸入有效標(biāo)志位
  852.                 }

  853.                 if(next==10)                                                                                 //秒十位調(diào)節(jié)標(biāo)志
  854.                 {
  855.                     buf[5]&=0x0f;                                                                  //清空秒十位,變成0000
  856.                     if((5>=key_scan())&yx)                                       //輸入值小于等于5和輸入有效都為1
  857.                           {
  858.                                  buf[5]|=key<<4;                                                  //鍵盤(pán)返回值左移4位變高位或上數(shù)組高位
  859.                          next=11;                                                                  //調(diào)節(jié)標(biāo)志位到秒個(gè)位
  860.                                 }
  861.                       write_ad_dat(wds1302_sec,buf[5]);                      //寫(xiě)秒數(shù)據(jù)                                                         
  862.                     read1302display();                                                          //讀1302中數(shù)據(jù)
  863.                 hz_display(0x80+0*4,3,12);                           //秒十位黑點(diǎn)
  864.                     delay(200);                                                                  //延時(shí)
  865.                 hz_display(0x80+(11-1+(buf[5]>>4))*4,3,12);         //秒十位
  866.                         yx=0;                                                                                  //清除鍵盤(pán)輸入有效標(biāo)志位
  867.                  }

  868.                 if(next==11)                                                                          //秒個(gè)位調(diào)節(jié)標(biāo)志
  869.                 {
  870.                         buf[5]&=0xf0;                                                                  //清空秒個(gè)位,變成0000
  871.                     if((9>=key_scan())&yx)                                                  //輸入值小于等于9和輸入有效都為1
  872.                           {
  873.                            buf[5]|=key;                                                      //鍵盤(pán)返回值或上數(shù)組
  874.                        next=0;                                                                          //使調(diào)節(jié)標(biāo)志位到年十位,為下一次調(diào)節(jié)做準(zhǔn)備
  875.                                 flag=0;                                                                          //清除調(diào)節(jié)模式,回到正常顯示狀態(tài)
  876.                                 write_ad_dat(ds1302_control,0x80);              //開(kāi)1302寫(xiě)保護(hù)
  877.                           }
  878.                       write_ad_dat(wds1302_sec,buf[5]);                      //寫(xiě)分?jǐn)?shù)據(jù)                                                         
  879.                     read1302display();                                                          //讀出1302中數(shù)據(jù)
  880.                 hz_display(0x80+0*4,3,13);                           //分個(gè)位黑點(diǎn)
  881.                     delay(200);                                                                  //延時(shí)
  882.                 hz_display(0x80+(11-1+(buf[5]&0x0f))*4,3,13);         //分個(gè)位
  883.                         yx=0;                                                                                        //清除鍵盤(pán)輸入有效標(biāo)志
  884.                 }
  885.         }
  886. }

  887. /****************123123****讀出1302數(shù)據(jù)并顯示**************************************/
  888. void read1302display()
  889. {        uchar h;                                                                //定義變量
  890.     write_ad_dat(0x8e,0x00);                                //開(kāi)1302寫(xiě)保護(hù)
  891.         buf[0]=read_add_dat(rds1302_year);                //讀年
  892.         buf[1]=read_add_dat(rds1302_month);                //讀月
  893.         buf[2]=read_add_dat(rds1302_date);                //讀日
  894.         buf[3]=read_add_dat(rds1302_hr);                //讀小時(shí)                                            
  895.         buf[4]=read_add_dat(rds1302_min);                //讀分鐘                                 
  896.         buf[5]=read_add_dat(rds1302_sec);                //讀秒                        

  897.         hz_display(0x80+(11-1+(buf[0]>>4))*4,2,5);                     //年十位
  898.         hz_display(0x80+(11-1+(buf[0]&0x0f))*4,2,6);                 //年個(gè)位

  899.         hz_display(0x80+(11-1+(buf[1]>>4))*4,2,8);                     //月十位
  900.         hz_display(0x80+(11-1+(buf[1]&0x0f))*4,2,9);             //月個(gè)位

  901.         hz_display(0x80+(11-1+(buf[2]>>4))*4,2,11);             //日十位
  902.         hz_display(0x80+(11-1+(buf[2]&0x0f))*4,2,12);             //日個(gè)位

  903.         hz_display(0x80+(11-1+(buf[3]>>4))*4,3,6);                     //小時(shí)十位
  904.         hz_display(0x80+(11-1+(buf[3]&0x0f))*4,3,7);                 //小時(shí)個(gè)位

  905.         hz_display(0x80+(21-1)*4,3,8);                                 //:
  906.         hz_display(0x80+(11-1+(buf[4]>>4))*4,3,9);                     //分十位
  907.         hz_display(0x80+(11-1+(buf[4]&0x0f))*4,3,10);                 //分個(gè)位

  908.     hz_display(0x80+(11-1+(buf[5]>>4))*4,3,12);                     //秒十位
  909.         hz_display(0x80+(11-1+(buf[5]&0x0f))*4,3,13);                 //秒個(gè)位

  910. }
  911. /***************************主程序*******************************************************/
  912. void main()
  913. {
  914.     uchar i;                                                                                  //定義變量
  915.     init();                                                                                          //初屏顯示
  916.         display1();                                                                                  //顯示漢字畫(huà)面
  917.         for(i=0;i<8;i++)                                                                  //把原始數(shù)據(jù)給顯示數(shù)組
  918.         {
  919.                 buf[i]=time_buf1[i];                                                  //常量數(shù)組數(shù)據(jù)賦給變量數(shù)組
  920.         }
  921.         write1302();                                                                          //寫(xiě)入年,月日時(shí),時(shí)間數(shù)據(jù)
  922.         while(1)
  923.         {
  924.              key_scan();                                                                          //  鍵盤(pán)掃描
  925.                 time_tz();                                                                          //  時(shí)間調(diào)整
  926.                 read1302display();                                                          //讀1302數(shù)據(jù)并顯示                                 
  927.         }      
  928. }        
復(fù)制代碼




lcd240×64液晶屏驅(qū)動(dòng).rar

52.03 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干天天干 | 久久国产精品72免费观看 | 自拍视频在线观看 | 精品福利av导航 | 精品国产一区二区三区观看不卡 | 日韩中文字幕在线播放 | 国产久| 久草久草久草 | 色综合久久久久 | 亚洲一区二区不卡在线观看 | 日日碰碰 | 韩日一区二区三区 | 欧美日产国产成人免费图片 | www.成人免费视频 | 超碰在线免费av | 国产精品久久久久久一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 国产免费va | 成人精品久久日伦片大全免费 | 久久成人精品视频 | 欧美一级毛片免费观看 | 9久久| 午夜欧美一区二区三区在线播放 | 人人干人人艹 | 天天操天天操 | 精品欧美一区二区久久久伦 | 91av小视频| 久久这里只有精品首页 | 美女在线视频一区二区三区 | 日韩视频精品在线 | 欧美日韩亚洲系列 | 日日操操| 人人干天天干 | 欧美国产精品久久久 | 中文在线播放 | 欧美精品一区二区三区视频 | 精品国产乱码久久久久久久久 | 中文字幕第十五页 | 国产精品久久久久久久久久免费 | 91视频免费视频 | 亚洲自拍一区在线观看 |