找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3963|回复: 0
打印 上一主题 下一主题
收起左侧

LCD240*64液晶单片机驱动程序 一个DS1302开心时钟万年历作品

[复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-11 04:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手头有个DS1302时钟芯片,正好学习一下。这个蕊片具有掉电时钟继续走时的特点(要有电池或超级电容)。还是KEIL编程序,PROTEUS做仿真,然后加实物,用的lcd240×64液晶屏,驱动芯片是t6963c,做了一个简单的开心万年历.















关于此屏幕的Proteus仿真文件下载请到http://www.51hei.com/bbs/dpj-42069-1.html
LCD240*64液晶的51单片机驱动程序:
  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                //秒数据地址
  7. #define wds1302_min                        0x82                //分数据地址
  8. #define wds1302_hr                        0x84                //时数据地址
  9. #define wds1302_date                0x86                //日数据地址
  10. #define wds1302_month                0x88                //月数据地址
  11. #define wds1302_day                        0x8a                //星期数据地址
  12. #define wds1302_year                0x8c                //年数据地址
  13. #define ds1302_control                0x8e                //控制数据地址
  14. #define ds1302_charger                0x90                 //涓流                        
  15. #define ds1302_clkburst                0xbe
  16. #define rds1302_sec                        0x81                //秒数据地址
  17. #define rds1302_min                        0x83                //分数据地址
  18. #define rds1302_hr                        0x85                //时数据地址
  19. #define rds1302_date                0x87                //日数据地址
  20. #define rds1302_month                0x89                //月数据地址
  21. #define rds1302_day                        0x8b                //星期数据地址
  22. #define rds1302_year                0x8d                //年数据地址

  23. sbit ce=P1^0;          //片选
  24. sbit cd=P1^3;          //命令或数据
  25. sbit rd=P1^4;          //读
  26. sbit wr=P1^5;          //写
  27. sbit rst=P1^6;          //复位
  28. sbit rest=P3^5;    //1302复位
  29. sbit sclk=P3^6;    //1302时钟
  30. sbit io=P3^7;      //1302输入输出口

  31. void read1302display();

  32. //sbit sta0=P2^0;    //测执行命令忙
  33. //sbit sta1=P2^1;    //测读写数据忙
  34. //sbit sta2=P2^3;    //测连续写忙

  35. uchar time_buf1[8]={0x15,0x12,0x04,0x16,0x25,0x00};//年月日时分秒周
  36. uchar buf[8] ;//空年月日时分秒周
  37. //uchar buf1[8];        //存修改完成的时间数据

  38. uint text_size,graphic_size;                        //定义文本区和图形区宽度
  39. uint text_startaddr,graphic_startaddr;              //文本和图形土起始位
  40. uint text_startaddr_l,text_startaddr_h;             //定义文本区起始高位低位置
  41. uint graphic_startaddr_l,graphic_startaddr_h;       //定义图形区首地址
  42. uint *p;                                            //图片数据指针
  43. uint t,t1,key;                                                                                        //中断计数变量
  44. uchar bcd[2];                                                                                //从DS1302读出数据转BCD码
  45. uchar flag=0,next;                                        //进入调节标志位
  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. /*********************延时函数************************************/
  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口数值读给变量
  207.                 P0=0xef;                                //重新给P0口赋值
  208.                 if((temp&0x0f)!=0x0f)        //检测有无按键按下
  209.                 {
  210.                          temp=P0;                        //把P0口数值读给变量
  211.                         switch(temp)                //分支选择数值
  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数值给变量
  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;                                        //再把数值给P0
  241.             temp=P0;                                        //P0数值读给变量
  242.                 if((temp&0x0f)!=0x0f)                //再次检测有无键按下
  243.                 {
  244.                          temp=P0;                                //把P0口数值赋给变量
  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数值给变量
  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数值给变量
  300.                                 temp=temp&0x0f;          // 检测按键是否抬起
  301.                         }
  302.                         
  303.                 }

  304.         }
  305.                           
  306.            return key;                   //函数结束返回按键数值           
  307. }

  308. /****************************ds1302写数据******************************/
  309. void write_date(uchar date)
  310. {
  311.         uchar i,k;                                          //定义变量
  312.         k=date;                                                  //数据赋给变量
  313.         rest=0;                    //置复位为0
  314.         sclk=0;
  315.         rest=1;                    //选中蕊片
  316. //        k=k>>1;
  317.         for(i=0;i<8;i++)           //循环8位数据
  318.         {
  319.                
  320.                 if(k&0x01)io=1;         //取出K低位给IO口
  321.                 sclk=0;                                  //拉低时钟
  322.                 sclk=1;                //拉高时钟数据给DS1302
  323.                
  324.                 k=k>>1;                //变量右移一位
  325.         }
  326.         rest=0;
  327.         sclk=0;
  328. }
  329.   
  330. /**************************ds1302地址写入数据****************************/
  331. void write_ad_dat(uint addr,uchar date)
  332. {                                                                                
  333.         uchar i;                                                        //        定义变量
  334.     rest=0;                                                                //        复位片选
  335.         sclk=0;                                                                //        拉低时钟
  336.     rest=1;                                                                //        置位片选
  337.     for(i=0;i<8;i++)                                        //        8次循环
  338.         {
  339.                 io=addr&0x01;                                        // 把地址中低位给IO口
  340.                 sclk=1;                                                        //        拉高时钟使数据有效
  341.                 sclk=0;                                                  //        拉低时钟给下个高电平做准备
  342.                 addr>>=1;                                          //        地址数据右移一位
  343.         }
  344.         for(i=0;i<8;i++)                                 //        8次循环
  345.         {
  346.                 io=date&0x01;                                  //        把数据低位给IO口
  347.                 sclk=1;                                                  //        拉高时钟,使数据有效
  348.                 sclk=0;                                                  //        拉低时钟
  349.                 date>>=1;                                          //        数据右移一位
  350.         }                                                                  
  351.         rest=0;                                                         //        复位片选
  352. }

  353. /***************************读1302数据***********************************/
  354. uchar read_date()
  355. {
  356.         uchar i,k;                                        //定义变量
  357.         rest=1;                                                //片选为置位
  358.         sclk=1;                                                //拉高1302时钟
  359.         for(i=0;i<8;i++)                        //8位数据循环
  360.         {         
  361.                
  362.                 if(io)                                 //读IO口状态给变量K
  363.                 {
  364.                         k=k|0x80;                 //如果IO口为1,变量赋值为1
  365.                 }
  366.                 sclk=1;                              //拉高时钟                                       
  367.            delay(1);
  368.                 sclk=0;                                        //拉低时钟写入数据
  369.                 k=k>>1;                                        //变量数据右移一位
  370.         }
  371.         rest=0;                     //关片选
  372.         return k;                                        //8位数据结束返回变量数值
  373. }

  374. /********************************读地址数据********************************/
  375. uchar read_add_dat(uint addr)
  376. {        
  377.          uchar i,j;                                                //定义变量
  378.         rest=0;                                                        //复位片选
  379.         sclk=0;                                                        // 拉低时钟电平
  380.         rest=1;                                                        // 置位片选
  381.         for(i=0;i<8;i++)                                // 8位循环
  382.         {
  383.                 sclk=0;                                                // 拉低时钟
  384.                 io=addr&0x01;                                // 地址数据低位给IO口
  385.                 sclk=1;                                          //  拉高时钟,使数据有效
  386.                 addr>>=1;                                        // 地址数据右移一位
  387.         }
  388.         for(i=0;i<8;i++)                          //  8次循环
  389.         {
  390.                 j>>=1;                                          //  变量右移一位
  391.                 sclk=0;                                         //        拉低时钟
  392.                 if(io) j|=0x80;                         //        如果IO口读出高电平,给变量高位置1
  393.            sclk=1;                                         //        拉高电平给下次读数据做准备
  394.         }
  395.         rest=0;                                                 //        复位片选
  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. /*******************写数据******************************************/
  410. void wrdate(uchar date)
  411. {
  412.         ce=0;           //使能片选
  413.         rd=1;                        //读无效
  414.         cd=0;           //操作命令
  415.         wr=0;           //使能写
  416.         P2=date;                //数据送给总线
  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)                //循环
  428.         {
  429.            P2=0xff;        //P2口为已知的高电平
  430.                 rd=0;       //使能读
  431.                 a=P2;       //读总线状态
  432.                 nop();      //延时
  433.                 rd=1;       //拉高读
  434.                 if((a&0x03)==0x03)        //测试等于0000 0011         
  435.                 return;      //测试如果读写数据为不忙跳出循环
  436.         }
  437. }

  438. /*******************测试连续写忙************************************/
  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;              //读总线状态
  450.                 nop();             //延时
  451.                 rd=1;              //拉高读
  452.                 if((a&0x08)==0x08)        //测试等于00001000
  453.                 return;            //测试如果连续读为不忙跳出循环
  454.         }
  455. }

  456. /************************写无参数命令************************************/
  457. void no_parameter(uchar comm)
  458. {
  459.         check_sta01();              //测忙
  460.         wrcomm(comm);            //写命令
  461. }

  462. /************************写双字节参数命令*********************************/
  463. void double_parameter(uint a,uint b,uchar c)
  464. {
  465.         check_sta01();              //测忙
  466.         wrdate(a);               //写第一字节参数
  467.         check_sta01();              //测忙
  468.         wrdate(b);               //写第二节节参数
  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为文本区
  477.         {
  478.                 double_parameter(text_startaddr_l,text_startaddr_h,0x24);   //文本区低位和高位起始地址
  479.                 no_parameter(0xb0);                                         //连续写命令
  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);                                                                          //关连续写
  490.         }
  491.         if(state==1)                         //判断state是否为1
  492.         {
  493.                 double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);    //图开形区起始低,高位
  494.                 no_parameter(0xb0);                                                                                          //连续写命令
  495.                 for(i=30*64;i>0;i--)                                                                                  //循环
  496.                 {
  497.                         check_sta03();                                                                                          //测连续写忙
  498.                         wrdate(vlue);                                                                                          //写入vlue值
  499.                 }
  500.                 check_sta03();                                                                                                  //测忙
  501.                 wrcomm(0xb2);                                                                                                  // 关闭连续写
  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;                                                        //把结果低位赋给低变量
  512.         high=(temp>>8)&0x00ff;                                                //把结果高位给高变量
  513.         double_parameter(low,high,0x24);                        //写入文本起始位置
  514.         no_parameter(0xb0);                                                        //连续写命令
  515.         check_sta03();                                                                //测忙
  516.         wrdate(*addr);                                                                //写入字符地址指针
  517.         check_sta03();                                                                //测连续写忙
  518.         wrcomm(0xb2);                                                           //关闭连续写
  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;                     //取出低位数据
  527.         graphic_startaddr_h=(temp>>8)&0x00ff;
  528.         double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);//写入图形首地址
  529.         no_parameter(0xb0);                                                                        //连续写命令
  530.         for(m=240;m>0;m--)                                                                        //循环行数
  531.         {
  532.                 for(n=30;n<0;n--)                                                                //每字节8位,列数/8
  533.                 {
  534.                         check_sta03();                                                                //测忙
  535.                         wrdate(* p++);                                                                //写入图形指针,然后加1地址
  536.                 }
  537.         }
  538.     check_sta03();                                                                                 //测忙
  539.         wrcomm(0xb2);                                                                             //关闭连续写
  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;          //把字的坐标地址赋给变量
  548.         low=temp&0x00ff;                                  //取出坐标低位数值
  549.         high=(temp>>8)&0x00ff;                          //右移8位取出坐标高位数值
  550.         double_parameter(low,high,0x24);   //写入汉字坐标
  551.         no_parameter(0xb0);                                  //开连续写
  552.         check_sta03();                                          //测忙
  553.         wrdate(addr);                                          //写入汉字左上4分之1
  554.         check_sta03();                                          //测试忙
  555.         wrdate(addr+2);                                          //写入汉字右上4分之1
  556.         check_sta03();                                          //测忙
  557.         wrcomm(0xb2);                                      //关闭连续写
  558.         delay(1);
  559.         temp=30*2*(hang-1)+30+(lie-1)*2;          //重新计算汉字坐标也就是写下部份,地址加一行(8*8)
  560.         low=temp&0x00ff;                                  //取出低位数值给变量
  561.         high=(temp>>8)&0x00ff;                          //右移8位取出高位给变量
  562.         double_parameter(low,high,0x24);   //写入新起始地址(写汉字下部份)
  563.         no_parameter(0xb0);                                  //连续写命令
  564.         check_sta03();                                          //测忙
  565.         wrdate(addr+1);                                          //写入汉字左下4分之1
  566.         check_sta03();                                          //测忙
  567.         wrdate(addr+3);                                          //写入汉字右下4分之1
  568.         check_sta03();                                          //测忙
  569.         wrcomm(0xb2);                                      //关闭连续写
  570. }

  571. /******************************自定义汉字写入CGRAM***************************************/
  572. void cgram()
  573. {
  574.         uint m=0;                                                        //定义变量
  575.         double_parameter(0x07,0x00,0x22);        //设定最高的1K为CGRAM  寄存器偏移设定
  576.         double_parameter(0x00,0x3c,0x24);        //
  577.         no_parameter(0xb0);                                   //开连续写
  578.         for(m=0;m<896+32;m++)                                //循环
  579.         {
  580.                 check_sta03();                                   //测忙
  581.                 wrdate(cgtab[m]);                                //写入数据         
  582.         }
  583.         check_sta03();                                           //测忙
  584.         wrcomm(0xb2);                                                //关闭连续写
  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. /****************************中断函数*********************************/
  597. void t0time()interrupt 1
  598. {
  599.         TH0=(65536-5000)/256;                                         //重新赋值高位
  600.         TL0=(65536-5000)%256;                                         //重新赋值低位
  601.         t++;                                                                         //变量加
  602.         if(t==1000)                                                                 //变量计数到
  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;                                                                //拉低液晶屏复位脚
  654.         nop();                                                                //延时
  655.         nop();                                                                //延时
  656.         nop();                                                                //延时
  657.         rst=1;                                                                //拉高电平置位
  658.         text_size=graphic_size=30*64;                //文本和图形区宽度
  659.         text_startaddr=0x0000;                            //文本区首地址
  660.         text_startaddr_l=text_startaddr;          //文本首地址低位
  661.         text_startaddr_h=text_startaddr>>8;          //文本首地址高位

  662.         graphic_startaddr=text_startaddr+text_size;         //图形区首地址
  663.         graphic_startaddr_l=graphic_startaddr;                 //图形区首地址低位
  664.         graphic_startaddr_h=graphic_startaddr>>8;         //图形区首地址高位

  665.         double_parameter(text_startaddr_l,text_startaddr_h,0x40);        //写入文本首地址
  666.         double_parameter(30,0x00,0x41);                                                                //写入文本区长度(一行几个字节)
  667.         double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x42);          //写入图形区首地址
  668.         double_parameter(30,0x00,0x43);                                                                                //写入图形区长度(一行几个字节)
  669.                                                                                                                                  
  670.         no_parameter(0x80);                 //文本 或 图形
  671.         no_parameter(0x98);                 //图形开文本关
  672.         all_display(1,0xff);          //表屏全亮
  673.         delay(5000);                         //延时
  674.         no_parameter(0xa7);                 //显示8行光标
  675.         no_parameter(0x94);                 //文本开图形关
  676.     cgram();                                   //把字模写入显示屏自定义的CGRAM里
  677.           all_display(0,0x00);         //把文本区全显示白
  678.            
  679. }

  680. /***********123123************写入DS1302年,月,日,时分数据****************************/
  681. void write1302()
  682. {
  683.    
  684.         write_ad_dat(0x8e,0x00);                   //关闭写保护
  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. /****************************时间调节程序***********************************************/
  695. void time_tz()
  696. {
  697.     uint z;                                                                                        //        定义变量
  698.         uchar s,g;                                                                                // 变量十位,个位,高位,低位
  699.    while(flag)                                                                                //如果#按下表示要调节
  700.                                                            
  701.         {        
  702.             if(next==0)                                                                 //调节年十位标志
  703.                 {
  704.                     write_ad_dat(0x8e,0x00);                 //关闭写保护
  705.                 write_ad_dat(wds1302_sec,0x80);                //暂停1302
  706.                     buf[0]&=0x0f;                                                    //清空年十位,变成0000
  707.                     buf[0]|=key_scan()<<4;                                    //键盘返回值左移4位变高位或上数组高位
  708.                     if(yx)next=1;
  709.                       write_ad_dat(wds1302_year,buf[0]);                  //写年数据                                                         
  710.                     read1302display();                                                  //读出1302中数据
  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;                                                                                 //标志位有效(就是有按键按下)
  715.                  }                                                                                                 //清除按键有效标志位

  716.                 if(next==1)                                                                         //调节年个位标志
  717.                 {                                                                                                
  718.                         buf[0]&=0xf0;                                                                  //清空年个位,变成0000
  719.                     buf[0]|=key_scan();                                                  //键盘返回值或上数组
  720.                     if(yx)next=2;                                                                  //如果如果按键标志位为有效,使调标志到下一调节位
  721.                       write_ad_dat(wds1302_year,buf[0]);                      //写年数据                                                         
  722.                     read1302display();                                                                //读1302中数据供显示
  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;                                                                                        //清除键盘有效标志位
  727.                 }

  728.                 if(next==2)                                                                           //月十位调节标志
  729.                 {
  730.                     buf[1]&=0x0f;                                                                  //清空月十位,变成0000
  731.                     if((1>=key_scan())&yx)                                       //测试键盘输入数小于等于1和输入有效都为1
  732.                           {
  733.                                  buf[1]|=key<<4;                                                  //键盘返回值左移4位变高位或上数组高位
  734.                          next=3;                                                                  //使调节标志位到月个位有效
  735.                                 }
  736.                       write_ad_dat(wds1302_month,buf[1]);                   //写月                                                         
  737.                     read1302display();                                                                //读出1302中数据供显示
  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;                                                                                        //清除键盘输入数值有效位
  742.                  }

  743.                 if(next==3)                                                                                //月个位调节标志
  744.                 {
  745.                         buf[1]&=0xf0;                                                                  //清空月个位,变成0000
  746.                     if((2>=key_scan())&yx)                                                  //测试输入值小于等于2和输入有效
  747.                           {
  748.                            buf[1]|=key;                                                      //键盘返回值或上数组(给数组赋值)
  749.                        next=4;                                                                          //使调节标志位到小时调节
  750.                           }
  751.                       write_ad_dat(wds1302_month,buf[1]);                  //写月                                                         
  752.                     read1302display();                                                          //读1302数据
  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)                                                                           //日十位调节标志
  760.                 {
  761.                     buf[2]&=0x0f;                                                                  //清空日十位,变成0000
  762.                     if((3>=key_scan())&yx)                                       //如果输入值小于等于3和键盘输入地为1
  763.                           {
  764.                                  buf[2]|=key<<4;                                                  //键盘返回值左移4位变高位或上数组高位
  765.                          next=5;                                                                  //使调节标志位到日个位
  766.                                 }
  767.                       write_ad_dat(wds1302_date,buf[2]);                      //写日数据                                                         
  768.                     read1302display();                                                          //读出1302数据
  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)                                                                          //日个位调节标志
  776.                 {
  777.                         buf[2]&=0xf0;                                                                  //清空日个位,变成0000
  778.                     if((9>=key_scan())&yx)                                                //如果输入值小于等于9和输入有效都为1
  779.                           {
  780.                            buf[2]|=key;                                                    //键盘返回值或上数组
  781.                        next=6;                                                                        //使调节标志为时十位有效
  782.                                 if(buf[2]>0x31)next=4;                                        //如果输入的日数据大于31天,回到日十位重新输入
  783.                           }
  784.                       write_ad_dat(wds1302_date,buf[2]);                     //写日数据                                                         
  785.                     read1302display();                                                         //读出1302中数据
  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;                                                                                  //清除键盘输入有效标志
  790.                 }

  791.                 if(next==6)                                                                          //小时调节标志
  792.                 {
  793.                     buf[3]&=0x0f;                                                                  //清空时十位,变成0000
  794.                     if((2>=key_scan())&yx)                                       //如果输入的值小于等于2,和键盘输入有效
  795.                           {
  796.                                  buf[3]|=key<<4;                                                  //键盘返回值左移4位变高位或上数组高位
  797.                          next=7;                                                                  //使调节标志位以小时的个位
  798.                                 }
  799.                       write_ad_dat(wds1302_hr,buf[3]);                      //写小时数据                                                         
  800.                     read1302display();                                                          //读1302数据
  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)                                                                         //小时个位调节标志
  808.                 {
  809.                         buf[3]&=0xf0;                                                                 //清空时个位,变成0000
  810.                     if((9>=key_scan())&yx)                                                 //输入值和输入有效都为1
  811.                           {
  812.                            buf[3]|=key;                                                     //键盘返回值或上数组
  813.                        next=8;                                                                         //调节标志位到分十位
  814.                                 if(buf[3]>=0x24)next=6;                                         //如果输入的数值大于24,返回时十位重新输入
  815.                           }
  816.                       write_ad_dat(wds1302_hr,buf[3]);                      //写时数据                                                         
  817.                     read1302display();                                                          //读1302中数据
  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;                                                                                  //清除键盘输入有效标志位
  822.                 }

  823.                 if(next==8)                                                                           //分十位调节标志
  824.                 {
  825.                     buf[4]&=0x0f;                                                                  //清空分十位,变成0000
  826.                     if((5>=key_scan())&yx)                                       //输入值小于等于5和键盘输入都有效
  827.                           {
  828.                                  buf[4]|=key<<4;                                                  //键盘返回值左移4位变高位或上数组高位
  829.                          next=9;                                                                  //调节标志位到分个位
  830.                                 }
  831.                       write_ad_dat(wds1302_min,buf[4]);                      //写分数据                                                         
  832.                     read1302display();                                                          //读1302中数据
  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;                                                                                  //清除键盘输入有效标志位
  837.                  }

  838.                 if(next==9)                                                                          //分个位调节标志
  839.                 {
  840.                         buf[4]&=0xf0;                                                                  //清空分个位,变成0000
  841.                     if((9>=key_scan())&yx)                                                  //输入值小于等于9和输入标志都有效
  842.                           {
  843.                            buf[4]|=key;                                                     //键盘返回值或上数组
  844.                        next=10;                                                                 //调节标志位到秒十位
  845.                           }
  846.                       write_ad_dat(wds1302_min,buf[4]);                     //写分数据                                                         
  847.                     read1302display();                                                         //读1302中数据
  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;                                                                                        //清除键盘输入有效标志位
  852.                 }

  853.                 if(next==10)                                                                                 //秒十位调节标志
  854.                 {
  855.                     buf[5]&=0x0f;                                                                  //清空秒十位,变成0000
  856.                     if((5>=key_scan())&yx)                                       //输入值小于等于5和输入有效都为1
  857.                           {
  858.                                  buf[5]|=key<<4;                                                  //键盘返回值左移4位变高位或上数组高位
  859.                          next=11;                                                                  //调节标志位到秒个位
  860.                                 }
  861.                       write_ad_dat(wds1302_sec,buf[5]);                      //写秒数据                                                         
  862.                     read1302display();                                                          //读1302中数据
  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;                                                                                  //清除键盘输入有效标志位
  867.                  }

  868.                 if(next==11)                                                                          //秒个位调节标志
  869.                 {
  870.                         buf[5]&=0xf0;                                                                  //清空秒个位,变成0000
  871.                     if((9>=key_scan())&yx)                                                  //输入值小于等于9和输入有效都为1
  872.                           {
  873.                            buf[5]|=key;                                                      //键盘返回值或上数组
  874.                        next=0;                                                                          //使调节标志位到年十位,为下一次调节做准备
  875.                                 flag=0;                                                                          //清除调节模式,回到正常显示状态
  876.                                 write_ad_dat(ds1302_control,0x80);              //开1302写保护
  877.                           }
  878.                       write_ad_dat(wds1302_sec,buf[5]);                      //写分数据                                                         
  879.                     read1302display();                                                          //读出1302中数据
  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;                                                                                        //清除键盘输入有效标志
  884.                 }
  885.         }
  886. }

  887. /****************123123****读出1302数据并显示**************************************/
  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++)                                                                  //把原始数据给显示数组
  918.         {
  919.                 buf[i]=time_buf1[i];                                                  //常量数组数据赋给变量数组
  920.         }
  921.         write1302();                                                                          //写入年,月日时,时间数据
  922.         while(1)
  923.         {
  924.              key_scan();                                                                          //  键盘扫描
  925.                 time_tz();                                                                          //  时间调整
  926.                 read1302display();                                                          //读1302数据并显示                                 
  927.         }      
  928. }        
复制代码




lcd240×64液晶屏驱动.rar

52.03 KB, 下载次数: 37, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表