找回密码
 立即注册

QQ登录

只需一步,快速开始

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

将DS1302的时间在LCD1602上显示出来

[复制链接]
ID:331475 发表于 2018-6-11 22:02 | 显示全部楼层 |阅读模式
在仿真上可以显示并可调,但是在单片机板子上不能实现,用的是不b104 的板子,用了按键调时间,闹钟这是程序
是不是在lcd1602上需要用ascii码值,但是我不知道该怎样改驱动里面的数据转换呀
  1. #include<reg51.h>

  2. #include<lcd1602.c>

  3. #include<display.c>

  4. #include<ds1302.c>

  5. #include<key.c>

  6. void timer0_isr()interrupt 1

  7. {

  8.          TL0= (65536-2000)%256;                                                

  9.          TH0= (65536-2000)/256;                        

  10.          cp++;

  11.                                    

  12.          if(cp>=250)                                  //半秒的时间

  13.          {      

  14.                   cp=0;                                          

  15.                   cp1++;

  16.                   cp2++;              

  17.                   P0= 0xff;

  18.                                  

  19.          }               

  20.                           

  21.          if(cp1>= 2)

  22.          {      

  23.                   cp1= 0;

  24.                   flash= ~flash;

  25.                   if(key_flag> 8 || key_flag <= 0)

  26.                           {

  27.                                     display();

  28.                           }                        

  29.                   else

  30.                   display_key_scan();

  31.                   P0= 0xff;                  

  32.                   //FL1602_clear();

  33.          }

  34.          if(time[6]== hour && time[7] == min)                   //响闹钟的时间

  35.          {      

  36.                   buzzer= 0;

  37.                   if(cp3>= 5000)                                                                       //十秒钟后自动关闭

  38.                   {      

  39.                           cp3= 0;

  40.                           buzzer= 1;

  41.                           cp4++;   

  42.                   }

  43.                   if(cp4>= 3)                                                                     //30秒后自动开启

  44.                   {

  45.                           cp4= 0;

  46.                           buzzer= 0;

  47.                   }      

  48.          }

  49.          elsebuzzer = 1;

  50. }

  51. void timer0_init()

  52. {      

  53.          TMOD= 0x01;                                                                                                                                                                                       

  54.          TL0= (65536-2000)%256;

  55.          TH0= (65536-2000)/256;      

  56.          EA= 1;     

  57.          ET0= 1;   

  58.          TR0= 1;

  59. }

  60. void main(void)

  61. {

  62.          init_ds1302();

  63.          FL1602_init();

  64.          timer0_init();

  65.          FL1602_clear();

  66.          while(1)

  67.          {         

  68.                   buzzer= 0;

  69.                    key_scan();   

  70.               get_ds1302_time();

  71.          }

  72. }

  73. ///////////////////////////////////////////////////////////////

  74. 这是ds1302

  75. #include<reg51.h>

  76. /*********************************************************************************/

  77. //ds1302驱动

  78. //2011年5月

  79. /*********************************************************************************/

  80. #define uchar unsigned char  /*宏定义用uchar 代替unsignedchar*/

  81. #define uint unsigned int         /*宏定义用uint 代替 unsignedint*/


  82. sbit ret = P3^7;

  83. sbit scl = P3^6;

  84. sbit sd = P3^4;


  85. //uchar sec, min, hour, date, month, year,week;

  86. void ds1302_init(void)

  87. {

  88.          ret= 0;

  89.          scl= 0;

  90.          ret= 1;

  91. }

  92. /*********************************对DS1302写1字节函数*****************************/

  93. void write_ds1302_onebyte(uchar dat)         

  94. {

  95.          uchari;

  96.          for(i= 0;i < 8;i++)

  97.          {

  98.                   sd= dat & 0x01;

  99.                   scl= 0;

  100.                   scl= 1;

  101.                   dat= dat >> 1;

  102.          }

  103. }

  104. /*********************************从DS1302读一字节函数*****************************/

  105. uchar read_ds1302_onebyte(void)                 

  106. {

  107.          uchari,dat;

  108.          for(i= 0;i < 8;i++)

  109.          {

  110.                   scl= 1;

  111.                   dat= dat >> 1;

  112.                   scl= 0;

  113.                   if(sd)dat= dat | 0x80;

  114.          }

  115.          return(dat);     

  116. }

  117. /*****************************对DS1302的某一地址写一字节函数***********************/

  118. void write_ds1302_add_dat(uchar add,uchardat)

  119. {

  120.          ds1302_init();

  121.          write_ds1302_onebyte(add);

  122.          write_ds1302_onebyte(dat);

  123.          scl= 1;

  124.          ret= 0;

  125. }

  126. /*****************************从DS1302的某一地址读一字节函数***********************/

  127. uchar read_ds1302_add_dat(uchar add)                                 /*读1302数据*/

  128. {

  129.          uchardat_temp;

  130.          ds1302_init();

  131.          write_ds1302_onebyte(add);

  132.          dat_temp= read_ds1302_onebyte();

  133.          scl= 1;

  134.          ret= 0;

  135.          return(dat_temp);

  136. }

  137. /********************************8421BCD码到十进制转换*****************************/

  138. uchar BCD_DEC_conv(uchar x)

  139. {

  140.          uchardec;

  141.          dec=  0x0f & x;

  142.          x= x >> 4;

  143.          dec  = dec + x * 10;

  144.          return(dec);

  145. }

  146. /********************************十进制到8421BCD码转换*****************************/   

  147. uchar DEC_BCD_conv(uchar x)

  148. {

  149.          ucharbcd;

  150.          bcd=  x % 10;

  151.          x= x / 10;

  152.          x= x << 4;

  153.          bcd  = bcd | x ;

  154.          return(bcd);

  155. }

  156. /*******************从ds1302中获得时间函数函数**********************/

  157. void get_ds1302_time(void)                            //获取1302的时间数据(时、分、秒),存入time1数组中

  158. {

  159.          uchard;

  160.          d= read_ds1302_add_dat(0x81);          //读秒

  161.          sec= BCD_DEC_conv(d);                                  //得到秒

  162.          d= read_ds1302_add_dat(0x83);          //读分

  163.          min= BCD_DEC_conv(d);                      //得到分

  164.          d= read_ds1302_add_dat(0x85);          //读小时

  165.          hour= BCD_DEC_conv(d);                    //得到小时

  166.          d= read_ds1302_add_dat(0x8b);          //读周

  167.          week= BCD_DEC_conv(d);                            //得到周

  168.          d= read_ds1302_add_dat(0x87);          //读日

  169.          date= BCD_DEC_conv(d);                     //得到日

  170.      d = read_ds1302_add_dat(0x89);          //读月

  171.          month= BCD_DEC_conv(d);                          //得到月

  172.      d = read_ds1302_add_dat(0x8d);          //读年

  173.          year= BCD_DEC_conv(d);                     //得到年

  174. }

  175. /*******************DS1302初始化函数hanshu*********************/

  176. void init_ds1302(void)

  177. {

  178.          write_ds1302_add_dat(0x8e,0x00);                              //写允许

  179.          write_ds1302_add_dat(0x80,DEC_BCD_conv(19));     //写年

  180.          write_ds1302_add_dat(0x84,DEC_BCD_conv(4));       //写月

  181.          write_ds1302_add_dat(0x82,DEC_BCD_conv(23));     //写日

  182.          write_ds1302_add_dat(0x80,DEC_BCD_conv(3));       //写星期

  183.          write_ds1302_add_dat(0x84,DEC_BCD_conv(10));     //写时

  184.          write_ds1302_add_dat(0x82,DEC_BCD_conv(12));     //写分

  185.          write_ds1302_add_dat(0x80,DEC_BCD_conv(16));     //写秒

  186.         write_ds1302_add_dat(0x8e, 0x80);                                //写保护

  187. }

  188. //////////////////////////////////////////////////////////

  189. 显示函数

  190. #include<reg51.h>

  191. //#include"key.c"

  192. uchari,year,month,date,hour,week,min,sec,flash,cp1,key_flag,cp,cp2,cp3,cp4;

  193. char time[9];

  194. sbit buzzer = P3^2;

  195. void display(void)

  196. {

  197.          goto_row_column(1,4);//第一行

  198. //     display_string("20");//显示2

  199.          display_num(year);

  200.          display_string("/");

  201.          display_num(month);

  202.          display_string("/");

  203.          display_num(date);

  204.          goto_row_column(2,4);

  205.          display_num(hour);

  206.          if(flash)display_string(":"); else display_string(" ");

  207.          display_num(min);

  208.          if(flash)display_string(":"); else display_string(" ");

  209.          display_num(sec);

  210.    //       delay(50000);

  211. //     //     FL1602_clear();

  212. //              goto_row_column(1,4);

  213. //                     display_string("20"); //显示2

  214. //              display_num(year);

  215. //              display_string("/");                   //显示字母及符号的方式

  216. //              display_num(month);

  217. //              display_string("/");

  218. //              display_num(date);

  219. //              delay(50000);delay(50000);delay(50000);

  220. //              goto_row_column(2,4);

  221. //              display_num(hour);      

  222. //              if(flash== 1)    display_string("");  

  223. //              else        display_string(":");//冒号闪烁0x00if(flash== 0xff)  0x00 if(flash    == 0xff )

  224. //              display_num(min);           

  225. //              if(flash== 1 )display_string(" ");

  226. //              elsedisplay_string(":");//冒号闪烁

  227. //              display_num(sec);

  228. //              delay(50000);delay(50000);delay(50000);//delay(50000);   

  229. //                       

  230. //              i++;

  231. //              if(i> 100)i = 0;

  232. }


  233. void display_key_scan(void)                               //显示调整时的时间

  234. {

  235. if(key_flag > 6)

  236.           {

  237.                   goto_row_column(1,0);

  238.                    display_string("****ding nao****");

  239.                    goto_row_column(2,4);

  240.                    if(key_flag == 7)                               //调整时的小时

  241.                           {

  242.                                   if(flash)

  243.                                             display_num(time[6]);

  244.                                    else

  245.                                             display_string("  ");

  246.                       }

  247.                    else

  248.                           display_num(time[6]);

  249.                   if(flash==0x00)                                                                    //

  250.                           display_string(":");

  251.                   else

  252.                           display_string("");

  253.                    if(key_flag == 8)                     //

  254.                           {

  255.                                   if(flash)

  256.                                             display_num(time[7]);

  257.                                    else

  258.                                             display_string("  ");

  259.                       }

  260.                    else

  261.                           display_num(time[7]);

  262.                           display_string("  ");

  263.                   

  264.          }         

  265. else                                               //调整显示状态下的时分秒

  266.          {               

  267.                   goto_row_column(1,4);//第一行

  268.                   if(key_flag== 1)        //显示年的调整值并闪烁

  269.                           {

  270.                                    if(flash)

  271.                                             display_num(time[0]);

  272.                                    else

  273.                                             display_string("  ");

  274.                           }

  275.                   else

  276.                           display_num(time[0]);

  277.                           display_string("/");

  278.                   if(key_flag== 2)        //显示月的调整值并闪烁

  279.                           {

  280.                                    if(flash)

  281.                                             display_num(time[1]);

  282.                                    else

  283.                                             display_string("  ");

  284.                           }

  285.                   else

  286.                           display_num(time[1]);

  287.                           display_string("/");

  288.          

  289.                   if(key_flag== 3)        //显示日的调整值并闪烁

  290.                           {

  291.                                    if(flash)

  292.                                             display_num(time[2]);

  293.                                    else

  294.                                             display_string("  ");

  295.                           }

  296.                   else

  297.                           display_num(time[2]);

  298.                   goto_row_column(2,4);

  299.          

  300.                   if(key_flag== 4)        //显示时的调整值并闪烁

  301.                           {

  302.                                    if(flash)

  303.                                             display_num(time[3]);

  304.                                    else

  305.                                             display_string("  ");

  306.                           }

  307.                   else

  308.                           display_num(time[3]);

  309.          

  310.                   if(flash)      //冒号的显示并闪烁  == 0x00

  311.                           display_string(":");

  312.                   else

  313.                           display_string("");

  314.          

  315.                   if(key_flag== 5)        //显示分的调整值并闪烁

  316.                           {

  317.                                    if(flash)

  318.                                             display_num(time[4]);

  319.                                    else

  320.                                             display_string("  ");

  321.                           }

  322.                   else

  323.                           display_num(time[4]);

  324.          

  325.                   if(flash)       //冒号的显示并闪烁==0x00

  326.                           display_string(":");

  327.                   else

  328.                           display_string("");

  329.          

  330.                   if(key_flag== 6)        //显示秒的调整值并闪烁

  331.                           {

  332.                                    if(flash)

  333.                                             display_num(time[5]);

  334.                                    else

  335.                                             display_string("  ");

  336.                           }

  337.                    else

  338.                            display_num(time[5]);

  339.           }

  340. //     FL1602_clear();

  341. }

  342. //////////////////////////////////////////

  343. Lcd1602

  344. #include<reg51.h>                   //这两个驱动均是正确的

  345. #define uchar unsigned char

  346. #define uint  unsigned int

  347. uchar num[] = "0123456789";

  348. sbit RS = P1^7;

  349. sbit RW = P1^6;

  350. sbit E = P1^5;

  351. void delay(uint x)

  352. {

  353.          while(x--);      

  354. }

  355. void write_command(uchar command)                /*写指令函数*/

  356. {

  357.          RW= 0;

  358.          RS= 0;

  359.          P0= command;

  360.          E= 1;

  361.          delay(100);

  362.          E= 0;

  363.          RW= 1;

  364. }


  365. void write_dat(uchar dat)                                      /*写数据函数*/

  366. {

  367.          RW= 0;

  368.          RS= 1;

  369.          P0= dat;

  370.          E= 1;

  371.          delay(100);

  372.          E= 0;

  373.          RW= 1;

  374. }


  375. void display_string(char *p)                          /*字符串函数*/

  376. {

  377.          while(*p)

  378.          {

  379.                   write_dat(*p);

  380.                   p++;

  381.          }

  382. }

  383. void display_num(uchar x)               //向lcd1602写数字变量

  384. {

  385.          write_dat(num[x/ 10]);

  386.          write_dat(num[x% 10]);        

  387. }


  388. void goto_row_column(uchar row, ucharcolumn) /*行列控制函数*/

  389. {

  390.          if(row== 1)

  391.          {

  392.                   write_command(0x80+ column);

  393.                   delay(100);

  394.          }

  395.          elseif(row == 2)

  396.                   write_command(0xc0 + column);                    // 0xC0

  397. }


  398. void FL1602_init(void)                                             /*初始化函数*/

  399. {

  400.          write_command(0x38);                      /*设置两行,每行16个字符,每个字符5*7点阵,8位数据接口*/

  401.          write_command(0x0f);  

  402.          delay(100);

  403.          write_command(0x0c);                                       /*设置开显示*/

  404.          write_command(0x06);                                      /*设置当读或写一个字节后,地址指针加1,且光标加1*/

  405. }


  406. void FL1602_clear(void)                                          /*清屏函数*/

  407. {                                                                                                 /*设置清屏指令,单片机向1602的数据端口写入0x01后,1602自动将本身DDRAM的内容全部填入“空白”

  408.                                                                                                          的ASCII码20H,并将地址计数器AC的值设为0,同时光标归位,即将光标撤回液晶显示屏的左上方

  409.                                                                                                          ,此时显示器无显示。*/

  410.          write_command(0x01);

  411.          write_command(0x02);

  412.                                                      

  413. }

  414. //////////////////////////////////////////////////////////////

  415. 按键部分

  416. #include<reg51.h>

  417. unsigned char seven_seg[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  418. unsigned char  key_flag,i,j,year,month,date,hour,min,sec;        //用一变量记载13按键按下的次数

  419. code uchar key_scan_row[] ={0x7f,0xbf,0xdf,0xef};   

  420. code uchar key_value[] = {                                       

  421.                                                              0xee,0xed,0xeb,0xe7,

  422.                                                              0xde,0xdd,0xdb,0xd7,

  423.                                                              0xbe,0xbd,0xbb,0xb7,

  424.                                                              0x7e,0x7d,0x7b,0x77

  425.                                                       };

  426. char time[9] ;

  427. uchar key_mode;                               /*为了避免每次调整完一个数据后不再从ds1302中读取数据,即LCD1602上显示的数据位当前的调整值*/

  428. void key_scan(void)                                                           //让键盘行线输出扫描数据

  429. {                  

  430.                   P2= key_scan_row[ i];
  431. [ i]
  432.                   if(P2!= key_scan_row[ i])                                                                     //[ i]如果有按键按下,P2口不是原来的扫描数据;
  433. [ i]
  434.                   {                                                                                                                                   

  435.                                    delay(200);

  436.                                    for(j= 0;j < 16;j ++)                                                                       

  437.                                    {      

  438.                                              if(j == 13)                                                                      //切换键&& key_flag >= 1

  439.                                                      {                              

  440.                                                              if(P2== key_value[j] )

  441.                                                              {

  442.                                                                       delay(200);                        

  443.                                                                       key_flag++;

  444.                                                                       if(key_flag> 8)       key_flag = 0;

  445.                                                                       key_mode++;

  446.                                                                       if(key_mode== 1)

  447.                                                                       {

  448.                                                                                time[0]= year;

  449.                                                                                time[1]= month;

  450.                                                                                time[2]= date;

  451.                                                                                time[3]= hour;

  452.                                                                                time[4]= min;

  453.                                                                                time[5]= sec;

  454.                                                                       }

  455.                                                              }

  456.                                                      }

  457.                                             if(j== 14)

  458.                                             {

  459.                                                      if(P2== key_value[j] )                        //加键

  460.                                                      {

  461.                                                               delay(200);

  462.                                                               if(key_flag == 1) time[0] ++;if(time[0] >=100) time[0] = 0;         //年

  463.                                                               if(key_flag == 2) time[1] ++;if(time[1] >=13)  time[1] = 1;        //月

  464.                                                               if(key_flag == 3) time[2] ++;if(time[2] >=31)  time[2] = 1;        //日

  465.                                                               if(key_flag == 4) time[3] ++;if(time[3] >=24)  time[3] = 0;        //时

  466.                                                               if(key_flag == 5) time[4] ++;if(time[4] >=60)  time[4] = 0;        //分

  467.                                                               if(key_flag == 6) time[5] ++;if(time[5] >=60)  time[5] = 0;        //秒

  468.                                                               if(key_flag == 7) time[6] ++;if(time[5] >=24)  time[6] = 0;       //         定时

  469.                                                               if(key_flag == 8) time[7] ++;if(time[5] >=60)  time[7] = 0;       //         定分

  470.                                                      }                                                                                                                                                      

  471.                                             }

  472.                                             if(j== 15)

  473.                                             {

  474.                                                      if(P2== key_value[j] )                        //减键

  475.                                                      {

  476.                                                               delay(200);

  477.                                                               if(key_flag == 1) time[0] --;if(time[0] <0) time[0] = 99;       //年

  478.                                                               if(key_flag == 2) time[1] --;if(time[1] <1) time[1] = 12;       //月

  479.                                                               if(key_flag == 3) time[2] --;if(time[2] <1)  time[2] = 31;   //日

  480.                                                               if(key_flag == 4) time[3] --;if(time[3] <0)  time[3] = 23;   //时

  481.                                                               if(key_flag == 5) time[4] --;if(time[4] <0)  time[4] = 59;   //分

  482.                                                               if(key_flag == 6) time[5] --;if(time[5] <0)  time[5] = 59;   //秒

  483.                                                               if(key_flag == 7) time[6] --;if(time[5]<0)  time[7] = 23;   //   定时

  484.                                                               if(key_flag == 8) time[7] --;if(time[5]<0)  time[8] = 59;   //   定分

  485.                                                      }

  486.                                             }

  487.                                             if(j== 12)                                                              //退出键,退出模式

  488.                                             {

  489.                                                      if(P2== key_value[j] )

  490.                                                      {

  491.                                                              delay(200);

  492.                                                              key_flag= 0;

  493.                                                              key_mode= 0;

  494.                                                              write_ds1302_add_dat(0x8e,0x00);                                       //写允许

  495.                                                              write_ds1302_add_dat(0x8c,DEC_BCD_conv(time[0]));     //写年

  496.                                                              write_ds1302_add_dat(0x88,DEC_BCD_conv(time[1]));     //写月

  497.                                                              write_ds1302_add_dat(0x86,DEC_BCD_conv(time[2]));     //写日

  498. //                                                          write_ds1302_add_dat(0x8a,DEC_BCD_conv(time[3]));     //写周

  499.                                                              write_ds1302_add_dat(0x84,DEC_BCD_conv(time[3]));     //写时

  500.                                                              write_ds1302_add_dat(0x82,DEC_BCD_conv(time[4]));     //写分

  501.                                                              write_ds1302_add_dat(0x80,DEC_BCD_conv(time[5]));     //写秒

  502.                                                              write_ds1302_add_dat(0x8e,0x80);                                        //写保护


  503.                                                      }                        

  504.                                             }

  505.                                             if(j== 11)                                                                                        //直接调到定闹模式

  506.                                             {

  507.                                                      if(P2== key_value[j] )

  508.                                                      {

  509.                                                               delay(200);

  510.                                                               key_flag = 7;

  511.                                                               if(key_flag > 8 )key_flag = 0;

  512.                                                      }

  513.                                             }

  514.                                             if(j== 10)                                                                                 //关闭闹钟按键

  515.                                             {

  516.                                                      if(P2== key_value[j] )

  517.                                                      {

  518.                                                              delay(200);

  519.                                                              buzzer= 1;      

  520.                                                      }

  521.                                             }      

  522.                           }                                         

  523.                           while(P2!= key_scan_row[ i]);
  524. [ i]
  525.          }      

  526.                   i++;

  527.                   if(i>= 4)i = 0;         

  528. }   
复制代码

                                       
回复

使用道具 举报

ID:320306 发表于 2018-6-12 08:50 | 显示全部楼层
不会是1602没有调节对比度吧,哈哈!!!!
回复

使用道具 举报

ID:303383 发表于 2018-6-12 09:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:341045 发表于 2018-6-12 10:50 | 显示全部楼层
LCD显示就是写点和清点, 有字模的, 没有就自己生成, 比如 0 , 在你设定的区域那些点显, 那些点不显就显示0了. 先调通显示这块就容易了
回复

使用道具 举报

ID:304971 发表于 2018-6-12 11:46 | 显示全部楼层
写个asc码转10进制的函数就可以了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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