找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD240*64液晶單片機驅(qū)動程序 一個DS1302開心時鐘萬年歷作品

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















關(guān)于此屏幕的Proteus仿真文件下載請到http://www.torrancerestoration.com/bbs/dpj-42069-1.html
LCD240*64液晶的51單片機驅(qū)動程序:
  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_()                                         //宏定義延時

  6. #define wds1302_sec                        0x80                //秒數(shù)據(jù)地址
  7. #define wds1302_min                        0x82                //分?jǐn)?shù)據(jù)地址
  8. #define wds1302_hr                        0x84                //時數(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ù)據(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;          //寫
  27. sbit rst=P1^6;          //復(fù)位
  28. sbit rest=P3^5;    //1302復(fù)位
  29. sbit sclk=P3^6;    //1302時鐘
  30. sbit io=P3^7;      //1302輸入輸出口

  31. void read1302display();

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

  35. uchar time_buf1[8]={0x15,0x12,0x04,0x16,0x25,0x00};//年月日時分秒周
  36. uchar buf[8] ;//空年月日時分秒周
  37. //uchar buf1[8];        //存修改完成的時間數(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;                                                                                        //中斷計數(shù)變量
  44. uchar bcd[2];                                                                                //從DS1302讀出數(shù)據(jù)轉(zhuǎn)BCD碼
  45. uchar flag=0,next;                                        //進入調(diào)節(jié)標(biāo)志位
  46. uchar yx=0;                                                                                        //鍵盤返回有效的值
  47. uchar code cgtab[]={
  48. //--黑點   --
  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. //-- 時 --
  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. //-- 開 --
  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ù)************************************/
  190. void delay(uint a)
  191. {
  192.         uchar b;
  193.         for( ;a>0;a--)
  194.         for(b=110;b>0;b--);
  195. }

  196. /***********************鍵盤掃描************************************/
  197. char key_scan()
  198. {
  199.         uchar temp;                        //定義變量
  200.         P0=0xef;                                //把高位一條拉低電平 11101111 給P0
  201.         temp=P0;                                //把P0口電平讀回給臨時變量
  202.         if((temp&0x0f)!=0x0f)        //檢測有無按鍵按下
  203.         {  
  204.             delay(10);                                //延時10毫秒
  205.             
  206.             temp=P0;                                //把P0口數(shù)值讀給變量
  207.                 P0=0xef;                                //重新給P0口賦值
  208.                 if((temp&0x0f)!=0x0f)        //檢測有無按鍵按下
  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;          // 檢測按鍵是否抬起
  231.                         }
  232.                   yx=1;                   //鍵盤輸入值有效  
  233.                 }

  234.         }
  235.         P0=0xdf;                                //把高位拉低一條 11011111  值給P0
  236.         temp=P0;                                //把P0口電平讀回給臨時變量
  237.         if((temp&0x0f)!=0x0f)        //檢測有無按鍵按下
  238.         {  
  239.             delay(10);                                   //延時10毫秒
  240.             P0=0xdf;                                        //再把數(shù)值給P0
  241.             temp=P0;                                        //P0數(shù)值讀給變量
  242.                 if((temp&0x0f)!=0x0f)                //再次檢測有無鍵按下
  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;          // 檢測按鍵是否抬起
  264.                         }
  265.                   yx=1;                   //鍵盤輸入值有效  
  266.                 }

  267.         }
  268.         P0=0xbf;                                //把高位拉低一條,10111111 把值給P0口
  269.         temp=P0;                                //把P0口電平讀回給臨時變量
  270.         if((temp&0x0f)!=0x0f)        //檢測有無按鍵按下
  271.         {  
  272.             delay(10);                                 //延時10毫秒
  273.             P0=0xbf;                                 //把值再給P0口
  274.             temp=P0;                                 //讀回P0口實際值
  275.                 if((temp&0x0f)!=0x0f)         //再檢測有無按鍵按下
  276.                 {
  277.                          temp=P0;                         //重新讀回P0口值
  278.                         switch(temp)                 //分支選擇
  279.                         {
  280.                                 case 0xbe:                 //10111110 按鍵3按下
  281.                                         key=3;         //按鍵值為3
  282.                                                 yx=1;    //鍵盤輸入值有效
  283.                                         break;         //返回退出
  284.                                 case 0xbd:                 //10111101 安鍵6按下
  285.                                                 key=6;         //按鍵值為6
  286.                                                 yx=1;                          //鍵盤輸入值有效
  287.                                                 break;         //返回退出
  288.                                 case 0xbb:                 //10111011 按鍵9按下
  289.                                         key=9;         //按鍵值為9
  290.                                                 yx=1;                          //鍵盤輸入值有效
  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;          // 檢測按鍵是否抬起
  301.                         }
  302.                         
  303.                 }

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

  308. /****************************ds1302寫數(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;                                  //拉低時鐘
  322.                 sclk=1;                //拉高時鐘數(shù)據(jù)給DS1302
  323.                
  324.                 k=k>>1;                //變量右移一位
  325.         }
  326.         rest=0;
  327.         sclk=0;
  328. }
  329.   
  330. /**************************ds1302地址寫入數(shù)據(jù)****************************/
  331. void write_ad_dat(uint addr,uchar date)
  332. {                                                                                
  333.         uchar i;                                                        //        定義變量
  334.     rest=0;                                                                //        復(fù)位片選
  335.         sclk=0;                                                                //        拉低時鐘
  336.     rest=1;                                                                //        置位片選
  337.     for(i=0;i<8;i++)                                        //        8次循環(huán)
  338.         {
  339.                 io=addr&0x01;                                        // 把地址中低位給IO口
  340.                 sclk=1;                                                        //        拉高時鐘使數(shù)據(jù)有效
  341.                 sclk=0;                                                  //        拉低時鐘給下個高電平做準(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ù)據(jù)有效
  348.                 sclk=0;                                                  //        拉低時鐘
  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時鐘
  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;                              //拉高時鐘                                       
  367.            delay(1);
  368.                 sclk=0;                                        //拉低時鐘寫入數(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;                                                        // 拉低時鐘電平
  380.         rest=1;                                                        // 置位片選
  381.         for(i=0;i<8;i++)                                // 8位循環(huán)
  382.         {
  383.                 sclk=0;                                                // 拉低時鐘
  384.                 io=addr&0x01;                                // 地址數(shù)據(jù)低位給IO口
  385.                 sclk=1;                                          //  拉高時鐘,使數(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;                                         //        拉低時鐘
  392.                 if(io) j|=0x80;                         //        如果IO口讀出高電平,給變量高位置1
  393.            sclk=1;                                         //        拉高電平給下次讀數(shù)據(jù)做準(zhǔn)備
  394.         }
  395.         rest=0;                                                 //        復(fù)位片選
  396.         return j;                                        //                返回讀出的變量值
  397. }
  398. /*******************寫命令*****************************************/
  399. void wrcomm(uchar comm)
  400. {
  401.         ce=0;                        //選中芯 片
  402.         rd=1;                        //讀高電平無效
  403.         cd=1;           //操作命令
  404.         wr=0;           //寫使能
  405.         P2=comm;         //把命令送給總線
  406.         nop();                        //延時
  407.         wr=1;                        //拉高寫
  408. }

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

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

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

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

  462. /************************寫雙字節(jié)參數(shù)命令*********************************/
  463. void double_parameter(uint a,uint b,uchar c)
  464. {
  465.         check_sta01();              //測忙
  466.         wrdate(a);               //寫第一字節(jié)參數(shù)
  467.         check_sta01();              //測忙
  468.         wrdate(b);               //寫第二節(jié)節(jié)參數(shù)
  469.         check_sta01();              //測忙
  470.         wrcomm(c);               //寫命令
  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ù)寫命令
  480.                 for(i=1;i<9;i++)
  481.                 {
  482.                    for(k=0;k<30;k++)                                                          //每行為30字符(240*64 )
  483.                         {
  484.                           check_sta03();                              //測忙
  485.                           wrdate(vlue);
  486.                         }                                              //寫入vlue值,0或1
  487.                 }
  488.                 check_sta03();                                                                          //測忙
  489.                 wrcomm(0xb2);                                                                          //關(guān)連續(xù)寫
  490.         }
  491.         if(state==1)                         //判斷state是否為1
  492.         {
  493.                 double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);    //圖開形區(qū)起始低,高位
  494.                 no_parameter(0xb0);                                                                                          //連續(xù)寫命令
  495.                 for(i=30*64;i>0;i--)                                                                                  //循環(huán)
  496.                 {
  497.                         check_sta03();                                                                                          //測連續(xù)寫忙
  498.                         wrdate(vlue);                                                                                          //寫入vlue值
  499.                 }
  500.                 check_sta03();                                                                                                  //測忙
  501.                 wrcomm(0xb2);                                                                                                  // 關(guān)閉連續(xù)寫
  502.         }
  503. }

  504. /****************************文本方式下寫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字符乘行加列,計算寫入起始位置
  511.         low=temp&0x00ff;                                                        //把結(jié)果低位賦給低變量
  512.         high=(temp>>8)&0x00ff;                                                //把結(jié)果高位給高變量
  513.         double_parameter(low,high,0x24);                        //寫入文本起始位置
  514.         no_parameter(0xb0);                                                        //連續(xù)寫命令
  515.         check_sta03();                                                                //測忙
  516.         wrdate(*addr);                                                                //寫入字符地址指針
  517.         check_sta03();                                                                //測連續(xù)寫忙
  518.         wrcomm(0xb2);                                                           //關(guān)閉連續(xù)寫
  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;                                //計算圖形寫入地址
  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);//寫入圖形首地址
  529.         no_parameter(0xb0);                                                                        //連續(xù)寫命令
  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();                                                                //測忙
  535.                         wrdate(* p++);                                                                //寫入圖形指針,然后加1地址
  536.                 }
  537.         }
  538.     check_sta03();                                                                                 //測忙
  539.         wrcomm(0xb2);                                                                             //關(guān)閉連續(xù)寫
  540. }

  541. /************************text下顯示16*16漢字**********************************************
  542. ***************text模式下是8*8字符,每個漢字要4個字符組成*********************************/
  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);   //寫入漢字坐標(biāo)
  551.         no_parameter(0xb0);                                  //開連續(xù)寫
  552.         check_sta03();                                          //測忙
  553.         wrdate(addr);                                          //寫入漢字左上4分之1
  554.         check_sta03();                                          //測試忙
  555.         wrdate(addr+2);                                          //寫入漢字右上4分之1
  556.         check_sta03();                                          //測忙
  557.         wrcomm(0xb2);                                      //關(guān)閉連續(xù)寫
  558.         delay(1);
  559.         temp=30*2*(hang-1)+30+(lie-1)*2;          //重新計算漢字坐標(biāo)也就是寫下部份,地址加一行(8*8)
  560.         low=temp&0x00ff;                                  //取出低位數(shù)值給變量
  561.         high=(temp>>8)&0x00ff;                          //右移8位取出高位給變量
  562.         double_parameter(low,high,0x24);   //寫入新起始地址(寫漢字下部份)
  563.         no_parameter(0xb0);                                  //連續(xù)寫命令
  564.         check_sta03();                                          //測忙
  565.         wrdate(addr+1);                                          //寫入漢字左下4分之1
  566.         check_sta03();                                          //測忙
  567.         wrdate(addr+3);                                          //寫入漢字右下4分之1
  568.         check_sta03();                                          //測忙
  569.         wrcomm(0xb2);                                      //關(guān)閉連續(xù)寫
  570. }

  571. /******************************自定義漢字寫入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);                                   //開連續(xù)寫
  578.         for(m=0;m<896+32;m++)                                //循環(huán)
  579.         {
  580.                 check_sta03();                                   //測忙
  581.                 wrdate(cgtab[m]);                                //寫入數(shù)據(jù)         
  582.         }
  583.         check_sta03();                                           //測忙
  584.         wrcomm(0xb2);                                                //關(guān)閉連續(xù)寫
  585. }


  586. /*****************************定時器初始化*************************************************/
  587. void time()
  588. {
  589.         TMOD=0x01;                                                                //開定時器0
  590.         TH0=(65536-5000)/256;                                        //賦值高
  591.         TL0=(65536-5000)%256;                                        //賦值低
  592.         EA=1;                                                                        //開總中斷
  593.         ET0=1;                                                                        //開定時器0中斷
  594.         TR0=1;                                                                        //啟動定時器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)                                                                 //變量計數(shù)到
  603.         {
  604.                 t=0;                                                                 //t重0開始
  605.                 t1=!t1;                                                                 //t1取反給t1
  606.         }        
  607. }         

  608. /**************************顯示漢字基本畫面*************************************/
  609. void display1()
  610. {
  611.         hz_display(0x80+(26-1)*4,1,6);                  //開
  612.         hz_display(0x80+(27-1)*4,1,7);                  //心
  613.         hz_display(0x80+(5-1)*4,1,8);                  //時
  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);                   //時
  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);                  //時
  637.         hz_display(0x80+(5-1)*4,4,5);                  //時
  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);                  //開
  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();                                                                //延時
  655.         nop();                                                                //延時
  656.         nop();                                                                //延時
  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);        //寫入文本首地址
  666.         double_parameter(30,0x00,0x41);                                                                //寫入文本區(qū)長度(一行幾個字節(jié))
  667.         double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x42);          //寫入圖形區(qū)首地址
  668.         double_parameter(30,0x00,0x43);                                                                                //寫入圖形區(qū)長度(一行幾個字節(jié))
  669.                                                                                                                                  
  670.         no_parameter(0x80);                 //文本 或 圖形
  671.         no_parameter(0x98);                 //圖形開文本關(guān)
  672.         all_display(1,0xff);          //表屏全亮
  673.         delay(5000);                         //延時
  674.         no_parameter(0xa7);                 //顯示8行光標(biāo)
  675.         no_parameter(0x94);                 //文本開圖形關(guān)
  676.     cgram();                                   //把字模寫入顯示屏自定義的CGRAM里
  677.           all_display(0,0x00);         //把文本區(qū)全顯示白
  678.            
  679. }

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

  694. /****************************時間調(diào)節(jié)程序***********************************************/
  695. void time_tz()
  696. {
  697.     uint z;                                                                                        //        定義變量
  698.         uchar s,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)閉寫保護
  705.                 write_ad_dat(wds1302_sec,0x80);                //暫停1302
  706.                     buf[0]&=0x0f;                                                    //清空年十位,變成0000
  707.                     buf[0]|=key_scan()<<4;                                    //鍵盤返回值左移4位變高位或上數(shù)組高位
  708.                     if(yx)next=1;
  709.                       write_ad_dat(wds1302_year,buf[0]);                  //寫年數(shù)據(jù)                                                         
  710.                     read1302display();                                                  //讀出1302中數(shù)據(jù)
  711.                 hz_display(0x80+0*4,2,5);                            //年十位黑點
  712.                     delay(200);                                                                //延時
  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é)年個位標(biāo)志
  717.                 {                                                                                                
  718.                         buf[0]&=0xf0;                                                                  //清空年個位,變成0000
  719.                     buf[0]|=key_scan();                                                  //鍵盤返回值或上數(shù)組
  720.                     if(yx)next=2;                                                                  //如果如果按鍵標(biāo)志位為有效,使調(diào)標(biāo)志到下一調(diào)節(jié)位
  721.                       write_ad_dat(wds1302_year,buf[0]);                      //寫年數(shù)據(jù)                                                         
  722.                     read1302display();                                                                //讀1302中數(shù)據(jù)供顯示
  723.                 hz_display(0x80+0*4,2,6);                                //年個位黑點
  724.                     delay(200);                                                                        //延時
  725.                 hz_display(0x80+(11-1+(buf[0]))*4,2,6);                 //個十位
  726.                         yx=0;                                                                                        //清除鍵盤有效標(biāo)志位
  727.                 }

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

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

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

  838.                 if(next==9)                                                                          //分個位調(diào)節(jié)標(biāo)志
  839.                 {
  840.                         buf[4]&=0xf0;                                                                  //清空分個位,變成0000
  841.                     if((9>=key_scan())&yx)                                                  //輸入值小于等于9和輸入標(biāo)志都有效
  842.                           {
  843.                            buf[4]|=key;                                                     //鍵盤返回值或上數(shù)組
  844.                        next=10;                                                                 //調(diào)節(jié)標(biāo)志位到秒十位
  845.                           }
  846.                       write_ad_dat(wds1302_min,buf[4]);                     //寫分?jǐn)?shù)據(jù)                                                         
  847.                     read1302display();                                                         //讀1302中數(shù)據(jù)
  848.                 hz_display(0x80+0*4,3,10);                            //分個位黑點
  849.                     delay(200);                                                                        //延時
  850.                 hz_display(0x80+(11-1+(buf[4]&0x0f))*4,3,10);  //分個位
  851.                         yx=0;                                                                                        //清除鍵盤輸入有效標(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;                                                  //鍵盤返回值左移4位變高位或上數(shù)組高位
  859.                          next=11;                                                                  //調(diào)節(jié)標(biāo)志位到秒個位
  860.                                 }
  861.                       write_ad_dat(wds1302_sec,buf[5]);                      //寫秒數(shù)據(jù)                                                         
  862.                     read1302display();                                                          //讀1302中數(shù)據(jù)
  863.                 hz_display(0x80+0*4,3,12);                           //秒十位黑點
  864.                     delay(200);                                                                  //延時
  865.                 hz_display(0x80+(11-1+(buf[5]>>4))*4,3,12);         //秒十位
  866.                         yx=0;                                                                                  //清除鍵盤輸入有效標(biāo)志位
  867.                  }

  868.                 if(next==11)                                                                          //秒個位調(diào)節(jié)標(biāo)志
  869.                 {
  870.                         buf[5]&=0xf0;                                                                  //清空秒個位,變成0000
  871.                     if((9>=key_scan())&yx)                                                  //輸入值小于等于9和輸入有效都為1
  872.                           {
  873.                            buf[5]|=key;                                                      //鍵盤返回值或上數(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);              //開1302寫保護
  877.                           }
  878.                       write_ad_dat(wds1302_sec,buf[5]);                      //寫分?jǐn)?shù)據(jù)                                                         
  879.                     read1302display();                                                          //讀出1302中數(shù)據(jù)
  880.                 hz_display(0x80+0*4,3,13);                           //分個位黑點
  881.                     delay(200);                                                                  //延時
  882.                 hz_display(0x80+(11-1+(buf[5]&0x0f))*4,3,13);         //分個位
  883.                         yx=0;                                                                                        //清除鍵盤輸入有效標(biāo)志
  884.                 }
  885.         }
  886. }

  887. /****************123123****讀出1302數(shù)據(jù)并顯示**************************************/
  888. void read1302display()
  889. {        uchar h;                                                                //定義變量
  890.     write_ad_dat(0x8e,0x00);                                //開1302寫保護
  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);                //讀小時                                            
  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);                 //年個位

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

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

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

  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);                 //分個位

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

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




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

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表