找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2866|回复: 4
收起左侧

DS1302时钟芯片接12864液晶显示花屏。。求助!!!

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:213766 发表于 2017-7-7 10:51 | 显示全部楼层 |阅读模式

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^0;
  5. sbit lcden=P1^2;
  6. sbit rw=P2^1;
  7. sbit s4=P3^3;
  8. sbit s5=P3^2;
  9. sbit s6=P3^1;
  10. sbit LCD_PSB=P2^6;
  11. sbit dsce=P1^3;
  12. sbit dsio=P2^3;
  13. sbit dssc=P1^7;
  14. sbit ACC_7=ACC^7;
  15. char miao,shi,fen,year,month,day,week,amiao,afen,ashi;
  16. uchar code table[]=" 20  -  -      ";
  17. uchar code table1[]="      :  :  ";
  18. void write_ds(uchar,uchar);
  19. uchar read_ds(uchar);
  20. uchar s1num;
  21. void set_time();
  22. void cls_buzz(void)
  23. {
  24.         P2 = (P2&0x1f|0xA0);
  25.         P0 = 0x00;
  26.         P2 = 0x1f;
  27.        
  28.         P2 = (P2&0x1f|0x80);
  29.         P0 = 0xff;
  30.         P2 = 0x1f;
  31.        
  32.         P2 = (P2&0x1f|0xc0);
  33.         P0 = 0x00;
  34.         P2 = 0x1f;
  35.         
  36.         P2 = (P2&0x1f|0xe0);
  37.         P0 = 0xff;
  38.         P2 = 0x1f;
  39. }

  40. void delay(uint z)
  41. {
  42.         uint x,y;
  43.         for(x=z;x>0;x--)
  44.                 for(y=110;y>0;y--);
  45. }

  46. void write_com(uchar com)
  47. {
  48.         rs=0;
  49.         rw=0;
  50.         lcden=0;
  51.         P0=com;
  52.         delay(5);
  53.         lcden=1;
  54.         delay(5);
  55.         lcden=0;       
  56. }
  57. void write_date(uchar date)
  58. {
  59.         rs=1;
  60.         rw=0;
  61.         lcden=0;
  62.         P0=date;
  63.         delay(5);
  64.         lcden=1;
  65.         delay(5);
  66.         lcden=0;       
  67. }
  68. void lcd_pos(uchar x,uchar y)
  69. {
  70.         uchar postion;
  71.         if(x==0)
  72.                 x=0x80;
  73.         else if(x==1)
  74.                 x=0x90;
  75.         else if(x==2)
  76.                 x=0x88;
  77.         else if(x==3)
  78.                 x=0x98;
  79.         postion=x+y;
  80.         write_com(postion);
  81. }
  82. void init()
  83. {
  84.         uchar num;
  85.         s1num=0;
  86.         week=1;
  87.         lcden=0;
  88.         LCD_PSB = 1;         
  89.   write_com(0x30);     
  90.   delay(5);
  91.   write_com(0x0C);      
  92.   delay(5);
  93.   write_com(0x01);      
  94.   delay(5);
  95.         lcd_pos(0,0);
  96.         for(num=0;num<15;num++)
  97.                 {
  98.                         write_date(table[num]);
  99.                         delay(5);
  100.                 }
  101.         lcd_pos(1,0);
  102.         for(num=0;num<11;num++)
  103.                 {
  104.                         write_date(table1[num]);
  105.                         delay(5);
  106.                 }
  107. }
  108. void write_sfm(uchar add,char date)
  109. {//4Îaê±£¬7Îa·Ö£¬10ÎaÃë
  110.         char shi,ge;
  111.         shi=date/10;
  112.         ge=date%10;
  113.         lcd_pos(1,add);
  114.         write_date(0x30+shi);
  115.         write_date(0x30+ge);
  116. }
  117. void write_nyr(uchar add,char date)
  118. {//3ÎaÄ꣬6Îa·Ö£¬9ÎaÃë
  119.         char shi,ge;
  120.         shi=date/10;
  121.         ge=date%10;
  122.         lcd_pos(0,add);
  123.         write_date(0x30+shi);
  124.         write_date(0x30+ge);
  125. }
  126. void write_week(char we)
  127. {
  128.         lcd_pos(0,8);
  129.         switch(we)
  130.         {
  131.                 case 1:        write_date('M');delay(5);
  132.                                 write_date('O');delay(5);
  133.                                 write_date('N');
  134.                                 break;
  135.                 case 2:        write_date('T');delay(5);
  136.                                 write_date('U');delay(5);
  137.                                 write_date('E');
  138.                                 break;
  139.                 case 3:        write_date('W');delay(5);
  140.                                 write_date('E');delay(5);
  141.                                 write_date('D');
  142.                                 break;
  143.                 case 4:        write_date('T');delay(5);
  144.                                 write_date('H');delay(5);
  145.                                 write_date('U');
  146.                                 break;
  147.                 case 5:        write_date('F');delay(5);
  148.                                 write_date('R');delay(5);
  149.                                 write_date('I');
  150.                                 break;
  151.                 case 6:        write_date('S');delay(5);
  152.                                 write_date('A');delay(5);
  153.                                 write_date('T');
  154.                                 break;
  155.                 case 7:        write_date('S');delay(5);
  156.                                 write_date('U');delay(5);
  157.                                 write_date('N');
  158.                                 break;
  159.         }
  160. }
  161. void keyscan()
  162. {
  163.         if(s4==0)
  164.         {
  165.                 delay(5);
  166.                 if(s4==0)
  167.                 {       
  168.                         s1num++;
  169.                         while(!s4);
  170.                         switch(s1num)
  171.                         {
  172.                                 case 1: lcd_pos(1,10);
  173.                                             write_com(0x0f);
  174.                                                 break;
  175.                                 case 2: lcd_pos(1,7);
  176.                                                 break;
  177.                                 case 3: lcd_pos(1,4);
  178.                                                 break;
  179.                                 case 4: lcd_pos(0,12);
  180.                                                 break;
  181.                                 case 5: lcd_pos(0,9);
  182.                                                 break;
  183.                                 case 6: lcd_pos(0,6);
  184.                                                 break;
  185.                                 case 7: lcd_pos(0,3);
  186.                                                 break;
  187.                                 case 8: s1num=0;
  188.                                                 write_com(0x0c);
  189.                                                 write_ds(80,miao);
  190.                                                 write_ds(82,fen);
  191.                                                 write_ds(84,shi);
  192.                                                 write_ds(0x8a,week);
  193.                                                 write_ds(86,day);
  194.                                                 write_ds(88,month);
  195.                                                 write_ds(0x8c,year);
  196.                                                 break;
  197.                         }       
  198.                 }
  199.         }
  200.         if(s1num!=0)
  201.         {
  202.                 if(s5==0)
  203.                 {
  204.                         delay(1);
  205.                         if(s5==0)
  206.                         {
  207.                                 while(!s5);
  208.                                 switch(s1num)
  209.                                 {
  210.                                         case 1:        miao++;
  211.                                                         if(miao==60)
  212.                                                                 miao=0;
  213.                                                         write_sfm(10,miao);
  214.                                                         lcd_pos(1,10);
  215.                                                         break;
  216.                                         case 2:        fen++;
  217.                                                         if(fen==60)
  218.                                                                 fen=0;
  219.                                                         write_sfm(7,fen);
  220.                                                         lcd_pos(1,7);
  221.                                                         break;
  222.                                         case 3:        shi++;
  223.                                                         if(shi==24)
  224.                                                                 shi=0;
  225.                                                         write_sfm(4,shi);
  226.                                                         lcd_pos(1,4);
  227.                                                         break;
  228.                                         case 4:        week++;
  229.                                                         if(week==8)
  230.                                                                 week=1;
  231.                                                         write_week(week);
  232.                                                         lcd_pos(0,12);
  233.                                                         break;
  234.                                         case 5:        day++;
  235.                                                         if(day==32)
  236.                                                                 day=1;
  237.                                                         write_nyr(9,day);
  238.                                                         lcd_pos(0,9);
  239.                                                         break;
  240.                                         case 6:        month++;
  241.                                                         if(month==13)
  242.                                                                 month=1;
  243.                                                         write_nyr(6,month);
  244.                                                         lcd_pos(0,6);
  245.                                                         break;
  246.                                         case 7:        year++;
  247.                                                         if(year==100)
  248.                                                                 year=0;
  249.                                                         write_nyr(3,year);
  250.                                                         lcd_pos(0,3);
  251.                                                         break;
  252.                                 }
  253.                         }
  254.                 }
  255.                 if(s6==0)
  256.                 {
  257.                         delay(1);
  258.                         if(s6==0)
  259.                         {
  260.                                 while(!s6);
  261.                                 switch(s1num)
  262.                                 {
  263.                                         case 1:        miao--;
  264.                                                         if(miao==-1)
  265.                                                                 miao=59;
  266.                                                         write_sfm(10,miao);
  267.                                                         lcd_pos(1,10);
  268.                                                         break;
  269.                                         case 2:        fen--;
  270.                                                         if(fen==-1)
  271.                                                                 fen=59;
  272.                                                         write_sfm(7,fen);
  273.                                                         lcd_pos(1,7);
  274.                                                         break;
  275.                                         case 3:        shi--;
  276.                                                         if(shi==-1)
  277.                                                                 shi=23;
  278.                                                         write_sfm(4,shi);
  279.                                                         lcd_pos(1,4);
  280.                                                         break;
  281.                                         case 4:        week--;
  282.                                                         if(week==0)
  283.                                                                 week=7;
  284.                                                         write_week(week);
  285.                                                         lcd_pos(0,12);
  286.                                                         break;
  287.                                         case 5:        day--;
  288.                                                         if(day==0)
  289.                                                                 day=31;
  290.                                                         write_nyr(9,day);
  291.                                                         lcd_pos(0,9);
  292.                                                         break;
  293.                                         case 6:        month--;
  294.                                                         if(month==0)
  295.                                                                 month=12;
  296.                                                         write_nyr(6,month);
  297.                                                         lcd_pos(0,6);
  298.                                                         break;
  299.                                         case 7:        year--;
  300.                                                         if(year==-1)
  301.                                                                 year=99;
  302.                                                         write_nyr(3,year);
  303.                                                         lcd_pos(0,3);
  304.                                                         break;
  305.                                 }
  306.                         }
  307.                 }
  308.         }
  309. }

  310. void write_ds(uchar addr,uchar dat)
  311. {
  312.         uchar i,temp;
  313.         dsce=0;
  314.         dssc=0;
  315.         dsce=1;
  316.         for(i=8;i>0;i--)
  317.         {
  318.                 dssc=0;
  319.                 temp=addr;
  320.                 dsio=(bit)(temp&0x01);
  321.                 addr>>=1;
  322.                 dssc=1;
  323.         }
  324.         for(i=8;i>0;i--)
  325.         {
  326.                 dssc=0;
  327.                 temp=dat;
  328.                 dsio=(bit)(temp&0x01);
  329.                 dat>>=1;
  330.                 dssc=1;
  331.         }
  332.         dsce=0;
  333. }

  334. uchar read_ds(uchar addr)
  335. {
  336.         uchar i,temp,dat1,dat2;
  337.         dsce=0;
  338.         dssc=0;
  339.         dsce=1;
  340.         for(i=8;i>0;i--)
  341.         {
  342.                 dssc=0;
  343.                 temp=addr;
  344.                 dsio=(bit)(temp&0x01);
  345.                 addr>>=1;
  346.                 dssc=1;
  347.         }
  348.         for(i=8;i>0;i--)
  349.         {
  350.                 ACC_7=dsio;
  351.                 dssc=1;
  352.                 ACC>>=1;
  353.                 dssc=0;
  354.         }
  355.         dsce=0;
  356.         dat1=ACC;
  357.         dat2=dat1/16;
  358.         dat1=dat1%16;
  359.         dat1=dat1+dat2*10;
  360.         return dat1;
  361. }

  362. void main()
  363. {
  364.         init();
  365.         cls_buzz();
  366.         while(1)
  367.                 {
  368.                         keyscan();
  369.                         year=read_ds(0x8d);
  370.                         month=read_ds(0x89);       
  371.                         day=read_ds(0x87);
  372.                         week=read_ds(0x8b);
  373.                         shi=read_ds(0x85);
  374.                         fen=read_ds(0x83);
  375.                         miao=read_ds(0x81);       
  376.                         write_sfm(10,miao);
  377.                         write_sfm(7,fen);
  378.                         write_sfm(4,shi);
  379.                         write_week(week);
  380.                         write_nyr(3,year);
  381.                         write_nyr(6,month);
  382.                         write_nyr(9,day);
  383.                 }
  384. }



复制代码
代码如上,很多内容不需要看的,我觉得问题应该出在时钟芯片上,但是我没怎么搞懂它的读写,读写函数write_ds和read_ds是直接在网上抄的。有人能帮我改一下吗?不胜感激。
回复

使用道具 举报

ID:103316 发表于 2017-7-7 20:10 | 显示全部楼层
之前写的STC15F2K60S2单片机,1302和12864的程序,12864不是用并口,是用的串口

1302调试.rar

44.08 KB, 下载次数: 14

回复

使用道具 举报

ID:213766 发表于 2017-7-7 16:11 | 显示全部楼层
dragon19790000 发表于 2017-7-7 13:30
先上传电路图,先查找硬件错误!帮你做个仿真

硬件没有错误,应该是ds1302时序的问题,但是我找不出来。。
之前做过定时器时钟,是可以正常运行的
回复

使用道具 举报

ID:112693 发表于 2017-7-7 13:30 | 显示全部楼层
先上传电路图,先查找硬件错误!帮你做个仿真
回复

使用道具 举报

ID:82765 发表于 2017-7-7 13:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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