找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2828|回复: 6
收起左侧

12864液晶显示+电子时钟单片机实验箱怎么连线?

[复制链接]
ID:432270 发表于 2018-11-24 16:25 | 显示全部楼层 |阅读模式
这是学校要做的单片机实验,基于51单片机用12864液晶显示时分秒。
求大佬教教怎么连线,如果可以的话有给代码最好,是用keil软件和实验箱一起实现的。(个人感觉这个实验箱是做不出来的,但还是不死心的问问)
IMG20181124160330.jpg
IMG20181124160348.jpg
IMG20181124161110.jpg
回复

使用道具 举报

ID:96682 发表于 2018-11-24 23:31 | 显示全部楼层
要是这货有配套的程序还好点,否则得有这货原理图才好搞滴
回复

使用道具 举报

ID:155507 发表于 2018-11-25 07:36 | 显示全部楼层
LCD12864(ST7920)线路图


  1. // 51单片机的12864液晶时钟完整程序
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit E=P2^5;
  7. sbit RW=P2^6;
  8. sbit f=P1^5;
  9. sbit RS=P2^7;

  10. #define lcd_bus P0
  11. #define lcd_clear_display 0x1
  12. #define lcd_funtion_base 0x30
  13. #define lcd_set_ddram_address 0x80

  14. sbit T_CLK = P3^7; /*实时时钟时钟线引脚 */
  15. sbit T_IO = P3^2; /*实时时钟数据线引脚 */
  16. sbit T_RST = P2^4; /*实时时钟复位线引脚 */
  17. sbit ACC0=ACC^0;
  18. sbit ACC7=ACC^7;
  19. sbit k1= P3^3;        //设置
  20. sbit k2= P3^4;        //加
  21. sbit k3= P1^6;        //减
  22. sbit k4= P3^5;        //闹钟
  23. sbit k5= P1^7;        //        退出

  24. bit w=0;
  25. bit b=0;
  26. bit flag2;

  27. uchar flag,flag1,e,k1num,a;
  28. char miao,fen,shi,yue,ri,nian,ns,nf,sec;

  29. /**************液晶驱动程序****************************/

  30. void delay(int time1)
  31. {
  32.   int i, j;

  33.   for(i=time1;i>0;i--)
  34.     for(j=110;j>0;j--);
  35. }

  36. void lcd_check_busy(void) //判断LCD忙程序
  37. {
  38.   uchar signalbuff;

  39.   RS=0;
  40.   RW=1; //读状态
  41.   do{
  42.     lcd_bus=0xff; //端口电平全部拉高
  43.     E=1; //开始读取LCD内部状态
  44.     signalbuff=lcd_bus;
  45.     E=0;
  46.   } //停止读取
  47.   while(signalbuff&0x80); //判断P2_7是否为0(液晶内部是否忙),如果为0,则跳出循环
  48. }

  49. void WRI(char instru) //液晶写指令
  50. {
  51.   lcd_check_busy();
  52.   RS = 0 ; //显示指令
  53.   RW = 0 ; //写
  54.   lcd_bus = instru;
  55.   E = 1 ;
  56.   E = 0 ;
  57. }

  58. void WRD(char lcddata)        //液晶写数据
  59. {
  60.   lcd_check_busy();
  61.   RS = 1 ; //显示数据
  62.   RW = 0 ; //写
  63.   lcd_bus = lcddata;
  64.   E = 1 ; //下降沿触发
  65.   E = 0 ;
  66. }

  67. void lcd_set_xy(uchar x,uchar y)
  68. {
  69.   uchar address;
  70.   switch(y)
  71.   {
  72.   case 0:
  73.     address = 0x80 + x;
  74.     break;

  75.   case 1:
  76.     address = 0x90 + x;
  77.     break;

  78.   case 2:
  79.     address = 0x88 + x;
  80.     break;

  81.   case 3:
  82.     address = 0x98 + x;
  83.     break;

  84.   default:address = 0x80 + x;
  85.   }
  86.   WRI(lcd_set_ddram_address|address);
  87. }

  88. void init_lcd()
  89. {
  90.   WRI(0x30); //基本指令集
  91.   WRI(0x0c); //显示打开,光标关,反白显示关
  92.   WRI(0x06); //DDRAM的地址计数器(AC)加1
  93.   WRI(0x01); //清除屏幕显示,将DDRAM的地址计数器归零
  94.   delay(100); //等待初始化结束
  95. }

  96. void lcd_write_string(uchar x,uchar y,uchar *s)
  97. {

  98.   WRI(lcd_funtion_base);
  99.   lcd_set_xy(x,y);
  100.   while (*s!='\0')
  101.   {
  102.     WRD(*s);
  103.     s++;
  104.   }
  105. }

  106. void write_time(uchar x,uchar y,uchar time)
  107. {

  108.   uchar shi,ge;
  109.   shi=time/10;
  110.   ge=time%10;
  111.   WRI(lcd_funtion_base);//
  112.   lcd_set_xy(x,y);
  113.   WRD(0x30+shi);
  114.   WRD(0x30+ge);
  115. }

  116. /******************DS1302驱动程序***********************************/

  117. void v_WTInputByte(uchar ucDa)
  118. {

  119.   uchar i;
  120.   ACC= ucDa;

  121.   for(i=8; i>0; i--)
  122.   {
  123.     T_IO = ACC0; //*相当于汇编中的 RRC
  124.     T_CLK = 1;
  125.     T_CLK = 0;
  126.     ACC =ACC>> 1;
  127.   }
  128. }

  129. uchar uc_RTOutputByte(void)
  130. {

  131.   uchar i;

  132.   for(i=8; i>0; i--)
  133.   {
  134.     ACC = ACC>>1; //*相当于汇                编中的 RRC
  135.     ACC7 = T_IO;
  136.     T_CLK = 1;
  137.     T_CLK = 0;
  138.   }
  139.   return(ACC);
  140. }

  141. void v_W1302(uchar ucAddr, uchar ucDa)
  142. {

  143.   T_RST = 0;
  144.   T_CLK = 0;
  145.   T_RST = 1;
  146.   v_WTInputByte(ucAddr); /* 地址,命令 */
  147.   v_WTInputByte(ucDa); /* 写1Byte数据*/
  148.   T_CLK = 1;
  149.   T_RST =0;
  150. }

  151. uchar uc_R1302(uchar ucAddr)
  152. {
  153.   uchar ucDa;

  154.   T_RST = 0;
  155.   T_CLK = 0;
  156.   T_RST = 1;
  157.   v_WTInputByte(ucAddr); /* 地址,命令 */
  158.   ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  159.   T_CLK = 1;
  160.   T_RST =0;
  161.   return(ucDa);
  162. }

  163. /********************************************************/

  164. void days()
  165. {

  166.   if ( yue== 0x01 && ri== 0x01 ){ lcd_write_string(4,3,"元旦节"); }
  167.   if ( yue== 0x02 && ri== 0x14 ){ lcd_write_string(4,3,"情人节"); }
  168.   if ( yue== 0x03 && ri== 0x08 ){ lcd_write_string(4,3,"妇女节"); }
  169.   if ( yue== 0x03 && ri== 0x12 ){ lcd_write_string(4,3,"植树节"); }
  170.   if ( yue== 0x04 && ri== 0x01 ){ lcd_write_string(4,3,"愚人节"); }
  171.   if ( yue== 0x04 && ri== 0x08 ){ lcd_write_string(4,3,"复活节"); }
  172.   if ( yue== 0x05 && ri== 0x01 ){ lcd_write_string(4,3,"劳动节"); }
  173.   if ( yue== 0x05 && ri== 0x04 ){ lcd_write_string(4,3,"青年节"); }
  174.   if ( yue== 0x06 && ri== 0x01 ){ lcd_write_string(4,3,"儿童节"); }
  175.   if ( yue== 0x08 && ri== 0x01 ){ lcd_write_string(4,3,"建军节"); }
  176.   if ( yue== 0x09 && ri== 0x10 ){ lcd_write_string(4,3,"教师节"); }
  177.   if ( yue== 0x10 && ri== 0x01 ){ lcd_write_string(4,3,"国庆节"); }
  178.   if ( yue== 0x12 && ri== 0x24 ){ lcd_write_string(4,3,"平安夜"); }
  179.   if ( yue== 0x12 && ri== 0x25 ){ lcd_write_string(4,3,"圣诞节"); }
  180. }

  181. /************************************************************/

  182. void base_disp()
  183. {

  184.   WRI(0x01);//清屏
  185.   lcd_write_string(3,0,"20");
  186.   lcd_write_string(5,0,"年");
  187.   lcd_write_string(1,1,"月");
  188.   lcd_write_string(3,1,"日");
  189.   lcd_write_string(5,1,"星期");
  190.   lcd_write_string(1,2,"时");
  191.   lcd_write_string(3,2,"分");
  192.   lcd_write_string(5,2,"秒");
  193. }

  194. void disp()
  195. {

  196.   lcd_write_string(3,1,"欢迎");
  197.   lcd_write_string(1.5,2,"欢迎");
  198.   lcd_write_string(5.5,2,"欢迎");
  199.   lcd_write_string(3,3,"欢迎");
  200.   delay(1000);
  201.   base_disp();
  202. }

  203. /********************DS1302初始化*************************************/

  204. void init_ds1302()        //
  205. {

  206.   uchar flag ;

  207.   flag=uc_R1302(0x81); //        在秒寄存器读数 ,ch=
  208.   if (flag&0x80) //
  209.   {
  210.     v_W1302(0x8e,0x00);        //
  211.     v_W1302(0x80,0x45);        //0秒
  212.     v_W1302(0x82,0x29);        //35分钟
  213.     v_W1302(0x84,0x16);        // 16时
  214.     v_W1302(0x86,0x01);        //
  215.     v_W1302(0x88,0x01);        //
  216.     v_W1302(0x8a,0x01);        //
  217.     v_W1302(0x8c,0x16);        //        16年
  218.     v_W1302(0x8e,0x80);//
  219.   }
  220. }

  221. /********************获取时间并显示************************************/

  222. void get_time()
  223. {
  224.   miao=((uc_R1302(0x81))/16)*10+(uc_R1302(0x81))%16;
  225.   fen=((uc_R1302(0x83))/16)*10+(uc_R1302(0x83))%16;
  226.   shi=((uc_R1302(0x85))/16)*10+(uc_R1302(0x85))%16;
  227.   yue=((uc_R1302(0x89))/16)*10+(uc_R1302(0x89))%16;
  228.   ri=((uc_R1302(0x87))/16)*10+(uc_R1302(0x87))%16;
  229.   nian=((uc_R1302(0x8d))/16)*10+(uc_R1302(0x8d))%16;
  230.   days();
  231.   //        get_temp();
  232.   write_time(4,0,nian);
  233.   write_time(0,1,yue);
  234.   write_time(2,1,ri);
  235.   write_time(0,2,shi);
  236.   write_time(2,2,fen);
  237.   write_time(4,2,miao);
  238.   a=(uc_R1302(0x8b))%16;//星期

  239.   if(a==7){lcd_write_string(7,1,"日");}
  240.   if(a==6){lcd_write_string(7,1,"六");}
  241.   if(a==5){lcd_write_string(7,1,"五");}
  242.   if(a==4){lcd_write_string(7,1,"四");}
  243.   if(a==3){WRI(0x97);WRD(0xc8);WRD(0xfd);}
  244.   if(a==2){lcd_write_string(7,1,"二");}
  245.   if(a==1){lcd_write_string(7,1,"一");}
  246.   if(fen==0&&miao==0){f=0;delay(300);f=1;delay(300);} // 整点报时 响两下
  247.   if(fen==30&&miao==0){f=0;delay(100);f=1;delay(100);}        //半点报时        响一下
  248.   if(shi==ns&&fen==nf)//闹钟
  249.   { if(flag2==0)
  250.     {f=0;delay(200);f=1;delay(200);}
  251.   }
  252. }

  253. /************************农历转**************************************/

  254. code uchar year_code[597]={

  255.   0x04,0xAe,0x53, //1901 0
  256.   0x0A,0x57,0x48, //1902 3
  257.   0x55,0x26,0xBd, //1903 6
  258.   0x0d,0x26,0x50, //1904 9
  259.   0x0d,0x95,0x44, //1905 12
  260.   0x46,0xAA,0xB9, //1906 15
  261.   0x05,0x6A,0x4d, //1907 18
  262.   0x09,0xAd,0x42, //1908 21
  263.   0x24,0xAe,0xB6, //1909
  264.   0x04,0xAe,0x4A, //1910
  265.   0x6A,0x4d,0xBe, //1911
  266.   0x0A,0x4d,0x52, //1912
  267.   0x0d,0x25,0x46, //1913
  268.   0x5d,0x52,0xBA, //1914
  269.   0x0B,0x54,0x4e, //1915
  270.   0x0d,0x6A,0x43, //1916
  271.   0x29,0x6d,0x37, //1917
  272.   0x09,0x5B,0x4B, //1918
  273.   0x74,0x9B,0xC1, //1919
  274.   0x04,0x97,0x54, //1920
  275.   0x0A,0x4B,0x48, //1921
  276.   0x5B,0x25,0xBC, //1922
  277.   0x06,0xA5,0x50, //1923
  278.   0x06,0xd4,0x45, //1924
  279.   0x4A,0xdA,0xB8, //1925
  280.   0x02,0xB6,0x4d, //1926
  281.   0x09,0x57,0x42, //1927
  282.   0x24,0x97,0xB7, //1928
  283.   0x04,0x97,0x4A, //1929
  284.   0x66,0x4B,0x3e, //1930
  285.   0x0d,0x4A,0x51, //1931
  286.   0x0e,0xA5,0x46, //1932
  287.   0x56,0xd4,0xBA, //1933
  288.   0x05,0xAd,0x4e, //1934
  289.   0x02,0xB6,0x44, //1935
  290.   0x39,0x37,0x38, //1936
  291.   0x09,0x2e,0x4B, //1937
  292.   0x7C,0x96,0xBf, //1938
  293.   0x0C,0x95,0x53, //1939
  294.   0x0d,0x4A,0x48, //1940
  295.   0x6d,0xA5,0x3B, //1941
  296.   0x0B,0x55,0x4f, //1942
  297.   0x05,0x6A,0x45, //1943
  298.   0x4A,0xAd,0xB9, //1944
  299.   0x02,0x5d,0x4d, //1945
  300.   0x09,0x2d,0x42, //1946
  301.   0x2C,0x95,0xB6, //1947
  302.   0x0A,0x95,0x4A, //1948
  303.   0x7B,0x4A,0xBd, //1949
  304.   0x06,0xCA,0x51, //1950
  305.   0x0B,0x55,0x46, //1951
  306.   0x55,0x5A,0xBB, //1952
  307.   0x04,0xdA,0x4e, //1953
  308.   0x0A,0x5B,0x43, //1954
  309.   0x35,0x2B,0xB8, //1955
  310.   0x05,0x2B,0x4C, //1956
  311.   0x8A,0x95,0x3f, //1957
  312.   0x0e,0x95,0x52, //1958
  313.   0x06,0xAA,0x48, //1959
  314.   0x7A,0xd5,0x3C, //1960
  315.   0x0A,0xB5,0x4f, //1961
  316.   0x04,0xB6,0x45, //1962
  317.   0x4A,0x57,0x39, //1963
  318.   0x0A,0x57,0x4d, //1964
  319.   0x05,0x26,0x42, //1965
  320.   0x3e,0x93,0x35, //1966
  321.   0x0d,0x95,0x49, //1967
  322.   0x75,0xAA,0xBe, //1968
  323.   0x05,0x6A,0x51, //1969
  324.   0x09,0x6d,0x46, //1970
  325.   0x54,0xAe,0xBB, //1971
  326.   0x04,0xAd,0x4f, //1972
  327.   0x0A,0x4d,0x43, //1973
  328.   0x4d,0x26,0xB7, //1974
  329.   0x0d,0x25,0x4B, //1975
  330.   0x8d,0x52,0xBf, //1976
  331.   0x0B,0x54,0x52, //1977
  332.   0x0B,0x6A,0x47, //1978
  333.   0x69,0x6d,0x3C, //1979
  334.   0x09,0x5B,0x50, //1980
  335.   0x04,0x9B,0x45, //1981
  336.   0x4A,0x4B,0xB9, //1982
  337.   0x0A,0x4B,0x4d, //1983
  338.   0xAB,0x25,0xC2, //1984
  339.   0x06,0xA5,0x54, //1985
  340.   0x06,0xd4,0x49, //1986
  341.   0x6A,0xdA,0x3d, //1987
  342.   0x0A,0xB6,0x51, //1988
  343.   0x09,0x37,0x46, //1989
  344.   0x54,0x97,0xBB, //1990
  345.   0x04,0x97,0x4f, //1991
  346.   0x06,0x4B,0x44, //1992
  347.   0x36,0xA5,0x37, //1993
  348.   0x0e,0xA5,0x4A, //1994
  349.   0x86,0xB2,0xBf, //1995
  350.   0x05,0xAC,0x53, //1996
  351.   0x0A,0xB6,0x47, //1997
  352.   0x59,0x36,0xBC, //1998
  353.   0x09,0x2e,0x50, //1999 294
  354.   0x0C,0x96,0x45, //2000 297
  355.   0x4d,0x4A,0xB8, //2001
  356.   0x0d,0x4A,0x4C, //2002
  357.   0x0d,0xA5,0x41, //2003
  358.   0x25,0xAA,0xB6, //2004
  359.   0x05,0x6A,0x49, //2005
  360.   0x7A,0xAd,0xBd, //2006
  361.   0x02,0x5d,0x52, //2007
  362.   0x09,0x2d,0x47, //2008
  363.   0x5C,0x95,0xBA, //2009
  364.   0x0A,0x95,0x4e, //2010
  365.   0x0B,0x4A,0x43, //2011
  366.   0x4B,0x55,0x37, //2012
  367.   0x0A,0xd5,0x4A, //2013
  368.   0x95,0x5A,0xBf, //2014
  369.   0x04,0xBA,0x53, //2015
  370.   0x0A,0x5B,0x48, //2016
  371.   0x65,0x2B,0xBC, //2017
  372.   0x05,0x2B,0x50, //2018
  373.   0x0A,0x93,0x45, //2019
  374.   0x47,0x4A,0xB9, //2020
  375.   0x06,0xAA,0x4C, //2021
  376.   0x0A,0xd5,0x41, //2022
  377.   0x24,0xdA,0xB6, //2023
  378.   0x04,0xB6,0x4A, //2024
  379.   0x69,0x57,0x3d, //2025
  380.   0x0A,0x4e,0x51, //2026
  381.   0x0d,0x26,0x46, //2027
  382.   0x5e,0x93,0x3A, //2028
  383.   0x0d,0x53,0x4d, //2029
  384.   0x05,0xAA,0x43, //2030
  385.   0x36,0xB5,0x37, //2031
  386.   0x09,0x6d,0x4B, //2032
  387.   0xB4,0xAe,0xBf, //2033
  388.   0x04,0xAd,0x53, //2034
  389.   0x0A,0x4d,0x48, //2035
  390.   0x6d,0x25,0xBC, //2036
  391.   0x0d,0x25,0x4f, //2037
  392.   0x0d,0x52,0x44, //2038
  393.   0x5d,0xAA,0x38, //2039
  394.   0x0B,0x5A,0x4C, //2040
  395.   0x05,0x6d,0x41, //2041
  396.   0x24,0xAd,0xB6, //2042
  397.   0x04,0x9B,0x4A, //2043
  398.   0x7A,0x4B,0xBe, //2044
  399.   0x0A,0x4B,0x51, //2045
  400.   0x0A,0xA5,0x46, //2046
  401.   0x5B,0x52,0xBA, //2047
  402.   0x06,0xd2,0x4e, //2048
  403.   0x0A,0xdA,0x42, //2049
  404.   0x35,0x5B,0x37, //2050
  405.   0x09,0x37,0x4B, //2051
  406.   0x84,0x97,0xC1, //2052
  407.   0x04,0x97,0x53, //2053
  408.   0x06,0x4B,0x48, //2054
  409.   0x66,0xA5,0x3C, //2055
  410.   0x0e,0xA5,0x4f, //2056
  411.   0x06,0xB2,0x44, //2057
  412.   0x4A,0xB6,0x38, //2058
  413.   0x0A,0xAe,0x4C, //2059
  414.   0x09,0x2e,0x42, //2060
  415.   0x3C,0x97,0x35, //2061
  416.   0x0C,0x96,0x49, //2062
  417.   0x7d,0x4A,0xBd, //2063
  418.   0x0d,0x4A,0x51, //2064
  419.   0x0d,0xA5,0x45, //2065
  420.   0x55,0xAA,0xBA, //2066
  421.   0x05,0x6A,0x4e, //2067
  422.   0x0A,0x6d,0x43, //2068
  423.   0x45,0x2e,0xB7, //2069
  424.   0x05,0x2d,0x4B, //2070
  425.   0x8A,0x95,0xBf, //2071
  426.   0x0A,0x95,0x53, //2072
  427.   0x0B,0x4A,0x47, //2073
  428.   0x6B,0x55,0x3B, //2074
  429.   0x0A,0xd5,0x4f, //2075
  430.   0x05,0x5A,0x45, //2076
  431.   0x4A,0x5d,0x38, //2077
  432.   0x0A,0x5B,0x4C, //2078
  433.   0x05,0x2B,0x42, //2079
  434.   0x3A,0x93,0xB6, //2080
  435.   0x06,0x93,0x49, //2081
  436.   0x77,0x29,0xBd, //2082
  437.   0x06,0xAA,0x51, //2083
  438.   0x0A,0xd5,0x46, //2084
  439.   0x54,0xdA,0xBA, //2085
  440.   0x04,0xB6,0x4e, //2086
  441.   0x0A,0x57,0x43, //2087
  442.   0x45,0x27,0x38, //2088
  443.   0x0d,0x26,0x4A, //2089
  444.   0x8e,0x93,0x3e, //2090
  445.   0x0d,0x52,0x52, //2091
  446.   0x0d,0xAA,0x47, //2092
  447.   0x66,0xB5,0x3B, //2093
  448.   0x05,0x6d,0x4f, //2094
  449.   0x04,0xAe,0x45, //2095
  450.   0x4A,0x4e,0xB9, //2096
  451.   0x0A,0x4d,0x4C, //2097
  452.   0x0d,0x15,0x41, //2098
  453.   0x2d,0x92,0xB5, //2099
  454. };

  455. ///月份数据表

  456. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  457. code uint day_code2[3]={0x111,0x130,0x14e};

  458. /*

  459. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)

  460. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)

  461. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);

  462. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世

  463. 纪,c_sun=1为19世纪

  464. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据

  465. */

  466. bit c_moon;
  467. data uchar year_moon,month_moon,day_moon,week;

  468. /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/

  469. bit get_moon_day(uchar month_p,uint table_addr)
  470. {

  471.   uchar temp;

  472.   switch (month_p){

  473.   case 1:{temp=year_code[table_addr]&0x08;

  474.       if (temp==0)return(0);else return(1);}

  475.   case 2:{temp=year_code[table_addr]&0x04;

  476.       if (temp==0)return(0);else return(1);}

  477.   case 3:{temp=year_code[table_addr]&0x02;

  478.       if (temp==0)return(0);else return(1);}

  479.   case 4:{temp=year_code[table_addr]&0x01;

  480.       if (temp==0)return(0);else return(1);}

  481.   case 5:{temp=year_code[table_addr+1]&0x80;

  482.       if (temp==0) return(0);else return(1);}

  483.   case 6:{temp=year_code[table_addr+1]&0x40;

  484.       if (temp==0)return(0);else return(1);}

  485.   case 7:{temp=year_code[table_addr+1]&0x20;

  486.       if (temp==0)return(0);else return(1);}

  487.   case 8:{temp=year_code[table_addr+1]&0x10;

  488.       if (temp==0)return(0);else return(1);}

  489.   case 9:{temp=year_code[table_addr+1]&0x08;

  490.       if (temp==0)return(0);else return(1);}

  491.   case 10:{temp=year_code[table_addr+1]&0x04;

  492.       if (temp==0)return(0);else return(1);}

  493.   case 11:{temp=year_code[table_addr+1]&0x02;

  494.       if (temp==0)return(0);else return(1);}

  495.   case 12:{temp=year_code[table_addr+1]&0x01;

  496.       if (temp==0)return(0);else return(1);}

  497.   case 13:{temp=year_code[table_addr+2]&0x80;

  498.       if (temp==0)return(0);else return(1);}

  499.   }
  500. }

  501. /*

  502. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)

  503. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)

  504. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);

  505. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世

  506. 纪,c_sun=1为19世纪

  507. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据

  508. */

  509. void Conversion(bit c,uchar year,uchar month,uchar day)
  510. { //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据

  511.   uchar temp1,temp2,temp3,month_p;
  512.   uint temp4,table_addr;
  513.   bit flag2,flag_y;

  514.   temp1=year/16; //BCD->hex 先把数据转换为十六进制
  515.   temp2=year%16;
  516.   year=temp1*10+temp2;
  517.   temp1=month/16;
  518.   temp2=month%16;
  519.   month=temp1*10+temp2;
  520.   temp1=day/16;
  521.   temp2=day%16;
  522.   day=temp1*10+temp2;

  523.   //定位数据表地址

  524.   if(c==0){
  525.     table_addr=(year+0x64-1)*0x3;
  526.   }
  527.   else {
  528.     table_addr=(year-1)*0x3;
  529.   }

  530.   //定        位数据表地址完成
  531.   //取当年春节所在的公历月份

  532.   temp1=year_code[table_addr+2]&0x60;
  533.   temp1= _cror_ (temp1,5);

  534.   //取当年春节所在的公历月份完成
  535.   //取当年春节所在的公历日

  536.   temp2=year_code[table_addr+2]&0x1f;

  537.   //取当年春节所在的公历日完成
  538.   // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月

  539.   if(temp1==0x1){
  540.     temp3=temp2-1;
  541.   }
  542.   else{
  543.     temp3=temp2+0x1f-1;
  544.   }

  545.   // 计算当年春年离当年元旦的天数完成
  546.   //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  547.   //day_code1[9],day_code2[3]
  548.   //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  549.   //在九月后,天数大于0xff,用表day_code2[3]
  550.   //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  551.   //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1

  552.   if (month<10){
  553.     temp4=day_code1[month-1]+day-1;
  554.   }
  555.   else{
  556.     temp4=day_code2[month-10]+day-1;
  557.   }

  558.   if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1
  559.     temp4+=1;
  560.   }

  561.   //计算公历日离当年元旦的天数完成
  562.   //判断公历日在春节前还是春节后

  563.   if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算
  564.     temp4-=temp3;
  565.     month=0x1;
  566.     month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  567.     flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
  568.     flag_y=0;
  569.     if(flag2==0)temp1=0x1d; //小月29天
  570.     else temp1=0x1e; //大小30天

  571.     temp2=year_code[table_addr]&0xf0;
  572.     temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月

  573.     while(temp4>=temp1){
  574.       temp4-=temp1;
  575.       month_p+=1;
  576.       if(month==temp2){
  577.         flag_y=~flag_y;
  578.         if(flag_y==0)month+=1;
  579.       }
  580.       else month+=1;

  581.       flag2=get_moon_day(month_p,table_addr);

  582.       if(flag2==0)temp1=0x1d;
  583.       else temp1=0x1e;
  584.     }
  585.     day=temp4+1;
  586.   }
  587.   else{ //公历日在春节前使用下面代码进行运算
  588.     temp3-=temp4;

  589.     if (year==0x0){year=0x63;c=1;}
  590.     else year-=1;

  591.     table_addr-=0x3;
  592.     month=0xc;
  593.     temp2=year_code[table_addr]&0xf0;
  594.     temp2=_cror_(temp2,4);

  595.     if (temp2==0)month_p=0xc;
  596.     else month_p=0xd; //

  597.     /* month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,
  598.     无闰月指向12
  599.     */

  600.     flag_y=0;
  601.     flag2=get_moon_day(month_p,table_addr);

  602.     if(flag2==0)temp1=0x1d;
  603.     else temp1=0x1e;

  604.     while(temp3>temp1){
  605.       temp3-=temp1;
  606.       month_p-=1;
  607.       if(flag_y==0)month-=1;
  608.       if(month==temp2)flag_y=~flag_y;
  609.       flag2=get_moon_day(month_p,table_addr);
  610.       if(flag2==0)temp1=0x1d;
  611.       else temp1=0x1e;
  612.     }
  613.     day=temp1-temp3+1;
  614.   }

  615.   c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
  616.   temp1=year/10;
  617.   temp1=_crol_(temp1,4);
  618.   temp2=year%10;
  619.   year_moon=temp1|temp2;
  620.   temp1=month/10;
  621.   temp1=_crol_(temp1,4);
  622.   temp2=month%10;
  623.   month_moon=temp1|temp2;
  624.   temp1=day/10;
  625.   temp1=_crol_(temp1,4);
  626.   temp2=day%10;
  627.   day_moon=temp1|temp2;
  628. }

  629. void change_nl()
  630. {

  631.   uchar year,month,day;

  632.   WRI(0x01);
  633.   lcd_write_string(0,0,"农历:");
  634.   Conversion(0,nian/10*16+nian%10,yue/10*16+yue%10,ri/10*16+ri%10);
  635.   year=year_moon/16*10+year_moon%16;
  636.   month=month_moon/16*10+month_moon%16;
  637.   day=day_moon/16*10+day_moon%16;
  638.   write_time(1,1,year);
  639.   lcd_write_string(2,1,"年");
  640.   write_time(3,1,month);
  641.   lcd_write_string(4,1,"月");
  642.   write_time(5,1,day);
  643.   lcd_write_string(6,1,"日");
  644.   //shengxiao();
  645. }

  646. /****************生肖显示**************************************/

  647. /*void shengxiao (void)
  648. {uchar yy1,yy2;
  649. yy1=(year_moon/16)*10+year_moon%16;
  650. yy2=yy1%12;
  651. switch(yy2)
  652. {

  653. case 0: lcd_write_string(6,0,"龙");
  654. break;

  655. case 1: lcd_write_string(6,0,"蛇");
  656. break;

  657. case 2: lcd_write_string(6,0,"马");
  658. break;

  659. case 3: lcd_write_string(6,0,"羊");
  660. break;

  661. case 4: lcd_write_string(6,0,"猴");
  662. break;

  663. case 5:lcd_write_string(6,0,"鸡");
  664. break;

  665. case 6:lcd_write_string(6,0,"狗");
  666. break;

  667. case 7: lcd_write_string(6,0,"猪");
  668. break;

  669. case 8: lcd_write_string(6,0,"鼠");
  670. break;

  671. case 9:lcd_write_string(6,0,"牛");
  672. break;

  673. case 10: lcd_write_string(6,0,"虎");
  674. break;

  675. case 11: lcd_write_string(6,0,"兔");
  676. break;
  677. }

  678. }*/

  679. /**********************键盘扫描**************************************/

  680. void keyscan()
  681. {

  682.   if (k1==0&&w==0) //设置键
  683.   {
  684.     delay(5);//消抖;
  685.     if (k1==0)
  686.     {
  687.       b=1;//        使能加键
  688.       flag1=1; //关闭get-time
  689.       k1num++;
  690.       while (!k1);//松手检测;
  691.       if (k1num==1)
  692.       {
  693.         lcd_write_string(4,3,"调整秒钟");
  694.         lcd_set_xy(4,2);//把光标回到秒位
  695.         WRI(0x0f);//显示光标并闪烁
  696.       }

  697.       if (k1num==2)
  698.       {
  699.         lcd_write_string(4,3,"调整分钟");
  700.         lcd_set_xy(2,2); //
  701.       }

  702.       if (k1num==3)
  703.       {
  704.         lcd_write_string(4,3,"调整小时");
  705.         lcd_set_xy(0,2);
  706.       }

  707.       if (k1num==4)
  708.       {
  709.         lcd_write_string(4,3,"调整星期");
  710.         lcd_set_xy(7,1);
  711.       }

  712.       if (k1num==5)
  713.       {
  714.         lcd_write_string(4,3,"调整日期");
  715.         lcd_set_xy(2,1);
  716.       }

  717.       if (k1num==6)
  718.       {
  719.         lcd_write_string(4,3,"调整月份");
  720.         lcd_set_xy(0,1);
  721.       }

  722.       if (k1num==7)
  723.       {
  724.         lcd_write_string(4,3,"调整年份");
  725.         lcd_set_xy(4,0);
  726.       }

  727.       if (k1num==8)
  728.       {
  729.         k1num=0;
  730.       }
  731.     }
  732.   }

  733.   /************************************************************************/

  734.   if (k1!=0)//第一个键松手
  735.   {
  736.     if (k2==0&&b==1) //第二个键按下 加键
  737.     {
  738.       delay(5);
  739.       if (k2==0)
  740.       {
  741.         while (!k2);
  742.         if (k1num==1)
  743.         {
  744.           miao++;
  745.           if (miao==60)
  746.           {miao=0;}
  747.           write_time(4,2,miao);
  748.           lcd_set_xy(4,2);
  749.         }
  750.         if (k1num==2)
  751.         {
  752.           fen++;
  753.           if (fen==60)
  754.           fen=0;
  755.           write_time(2,2,fen);
  756.           lcd_set_xy(2,2);
  757.         }

  758.         if (k1num==3)
  759.         {
  760.           shi++;
  761.           if (shi==25)
  762.           shi=0;
  763.           write_time(0,2,shi);
  764.           lcd_set_xy(0,2);
  765.         }

  766.         if (k1num==4)        //星期
  767.         {
  768.           a++;
  769.           if(a==8)a=1;
  770.           if(a==7){lcd_write_string(7,1,"日");}
  771.           if(a==6){lcd_write_string(7,1,"六");}
  772.           if(a==5){lcd_write_string(7,1,"五");}
  773.           if(a==4){lcd_write_string(7,1,"四");}
  774.           if(a==3){WRI(0x97);WRD(0xc8);WRD(0xfd);}        //
  775.           if(a==2){lcd_write_string(7,1,"二");}
  776.           if(a==1){lcd_write_string(7,1,"一");}
  777.           lcd_set_xy(7,1);
  778.         }

  779.         if (k1num==5)
  780.         {
  781.           ri++;
  782.           if (ri==32)
  783.           ri=1;
  784.           write_time(2,1,ri);
  785.           lcd_set_xy(2,1);
  786.         }

  787.         if (k1num==6)
  788.         {
  789.           yue++;
  790.           if (yue==13)
  791.           yue=1;
  792.           write_time(0,1,yue);
  793.           lcd_set_xy(0,1);
  794.         }

  795.         if (k1num==7)
  796.         {
  797.           nian++;
  798.           if (nian==99)
  799.           nian=0;
  800.           write_time(4,0,nian);
  801.           lcd_set_xy(4,0);
  802.         }
  803.       }
  804.     }

  805.     /***********************************************************************/

  806.     if(k3==0)//第三键 减键
  807.     {
  808.       delay(5);
  809.       if(k3==0)
  810.       {
  811.         while(!k3);
  812.         if (k1num==1)
  813.         {
  814.           miao--;
  815.           if(miao==-1)
  816.           miao=59;
  817.           write_time(4,2,miao);
  818.           lcd_set_xy(4,2);
  819.         }

  820.         if (k1num==2)
  821.         {
  822.           fen--;
  823.           if(fen==-1)
  824.           fen=59;
  825.           write_time(2,2,fen);
  826.           lcd_set_xy(2,2);
  827.         }

  828.         if (k1num==3)
  829.         {
  830.           shi--;
  831.           if(shi==-1)
  832.           shi=23;
  833.           write_time(0,2,shi);
  834.           lcd_set_xy(0,2);
  835.         }

  836.         if (k1num==4)        //星期
  837.         {
  838.           a--;
  839.           if(a==0)a=7;
  840.           if(a==7){lcd_write_string(7,1,"日");}
  841.           if(a==6){lcd_write_string(7,1,"六");}
  842.           if(a==5){lcd_write_string(7,1,"五");}
  843.           if(a==4){lcd_write_string(7,1,"四");}
  844.           if(a==3){WRI(0x97);WRD(0xc8);WRD(0xfd);}
  845.           if(a==2){lcd_write_string(7,1,"二");}
  846.           if(a==1){lcd_write_string(7,1,"一");}
  847.           lcd_set_xy(7,1);
  848.         }

  849.         if (k1num==5)
  850.         {
  851.           ri--;
  852.           if(ri==-1)
  853.           ri=31;
  854.           write_time(2,1,ri);
  855.           lcd_set_xy(2,1);
  856.         }

  857.         if (k1num==6)
  858.         {
  859.           yue--;
  860.           if(yue==-1)
  861.           yue=12;
  862.           write_time(0,1,yue);
  863.           lcd_set_xy(0,1);
  864.         }

  865.         if (k1num==7)
  866.         {
  867.           nian--;
  868.           if(nian==-1)
  869.           nian=99;
  870.           write_time(4,0,nian);
  871.           lcd_set_xy(4,0);
  872.         }
  873.       }
  874.     }
  875.   }

  876.   /************************************************************************/

  877.   if(k5==0)        //退出键
  878.   {
  879.     delay(5);
  880.     if(k5==0)
  881.     while(!k5);
  882.     base_disp();
  883.     WRI(0x0c);        //关光标
  884.     k1num=0; //
  885.     v_W1302(0x8e,0x00);        //
  886.     v_W1302(0x80,(miao/10)*16+miao%10);        //0秒
  887.     v_W1302(0x82,(fen/10)*16+fen%10);        //35分钟
  888.     v_W1302(0x84,(shi/10)*16+shi%10);        // 16时
  889.     v_W1302(0x86,(ri/10)*16+ri%10);        //        天数
  890.     v_W1302(0x88,(yue/10)*16+yue%10);        // 月份
  891.     v_W1302(0x8a,a);        //星期
  892.     v_W1302(0x8c,(nian/10)*16+nian%10);        //        09年
  893.     v_W1302(0x8e,0x80);//
  894.     flag1=0; //使能get-time
  895.     w=0; //
  896.     b=0; //nongli
  897.     flag2=~flag2;//        闹钟开
  898.   }

  899.   /*************************************************************************/

  900.   if(k4==0&&b==0)        //        进入闹钟模式
  901.   {
  902.     delay(5);
  903.     if(k4==0)
  904.     {
  905.       flag1=1; //关时间
  906.       flag2=1; //闹钟关
  907.       w=1;        //取消按键1功能
  908.       WRI(0x01); //
  909.       lcd_write_string(0,0,"闹钟:");
  910.       lcd_write_string(4,1,"时");
  911.       lcd_write_string(6,1,"分");
  912.       write_time(3,1,uc_R1302(0xc1));
  913.       write_time(5,1,uc_R1302(0xc3));
  914.       ns=uc_R1302(0xc1);
  915.       nf=uc_R1302(0xc3);

  916.       /***********************设置闹钟********************/

  917.       while(k5==1)
  918.       {
  919.         if(k1==0&&w==1)
  920.         {
  921.           delay(5);
  922.           if(k1==0)
  923.           {
  924.             k1num++;
  925.             while (!k1);//松手检测;
  926.             if (k1num==1)
  927.             {
  928.               lcd_write_string(3,2,"调整小时");
  929.               lcd_set_xy(3,1);//把光标回
  930.               WRI(0x0f);//显示光标并闪烁
  931.             }

  932.             if (k1num==2)
  933.             {
  934.               lcd_write_string(3,2,"调整分钟");
  935.               lcd_set_xy(5,1); //
  936.             }
  937.             if (k1num==3)
  938.             {
  939.               k1num=0;
  940.             }
  941.           }
  942.         }

  943.         /****************加********************/

  944.         if (k1!=0)//第一个键松手
  945.         {
  946.           if (k2==0) //第二个键按下 加键
  947.           {
  948.             delay(5);
  949.             if (k2==0)
  950.             {
  951.               while (!k2);
  952.               if (k1num==1)
  953.               {
  954.                 ns++;
  955.                 if (ns==24)
  956.                 {ns=0;}
  957.                 write_time(3,1,ns);
  958.                 lcd_set_xy(3,1);
  959.               }

  960.               if (k1num==2)
  961.               {
  962.                 nf++;
  963.                 if (nf==60)
  964.                 nf=0;
  965.                 write_time(5,1,nf);
  966.                 lcd_set_xy(5,1);
  967.               }
  968.             }
  969.           }

  970.           /****************减*********************/

  971.           if(k3==0)
  972.           {
  973.             delay(5);
  974.             if(k3==0)
  975.             {
  976.               while(!k3);
  977.               if (k1num==1)
  978.               {
  979.                 ns--;
  980.                 if(ns==-1)
  981.                 ns=23;
  982.                 write_time(3,1,ns);
  983.                 lcd_set_xy(3,1);
  984.               }

  985.               if (k1num==2)
  986.               {
  987.                 nf--;
  988.                 if(nf==-1)
  989.                 nf=59;
  990.                 write_time(5,1,nf);
  991.                 lcd_set_xy(5,1);
  992.               }

  993.             }

  994.           }

  995.         }
  996.         v_W1302(0x8e,0x00);

  997.         //        v_W1302(0xc0,(ns/10)*16+ns%10);

  998.         //        v_W1302(0xc2,(nf/10)*16+nf%10);

  999.         v_W1302(0xc0,ns);
  1000.         v_W1302(0xc2,nf);
  1001.         v_W1302(0x8e,0x80);
  1002.       }
  1003.     }
  1004.   }

  1005.   /*****************转农历*********************/

  1006.   if (k2==0&&b==0)
  1007.   {
  1008.     delay(5);
  1009.     if(k2==0)
  1010.     w=1; //
  1011.     flag1=1;//
  1012.     while(!k2);
  1013.     change_nl();
  1014.     while(k5==0);
  1015.   }
  1016. }

  1017. /************主函数*********************************/

  1018. void main(void)
  1019. {

  1020.   init_lcd();
  1021.   init_ds1302();

  1022.   disp();
  1023.   while(1)
  1024.   {
  1025.     if(flag1==0)
  1026.     {
  1027.       get_time();
  1028.     }
  1029.     keyscan();
  1030.   }
  1031. }



复制代码
回复

使用道具 举报

ID:432270 发表于 2018-11-25 10:04 来自手机 | 显示全部楼层
wc86110 发表于 2018-11-24 23:31
要是这货有配套的程序还好点,否则得有这货原理图才好搞滴

没有配套的程序,这是学校的设备,原理图也是没有的,12864液晶也是这个51箱特有的,苦哈哈啊。
回复

使用道具 举报

ID:432270 发表于 2018-11-25 10:08 来自手机 | 显示全部楼层
angmall 发表于 2018-11-25 07:36
LCD12864(ST7920)线路图

你那个RP1是什么芯片,我看不清。
回复

使用道具 举报

ID:155507 发表于 2018-11-25 11:26 | 显示全部楼层
那个RP1不是芯片,是上拉电阻包
回复

使用道具 举报

ID:432270 发表于 2018-11-26 15:46 来自手机 | 显示全部楼层
angmall 发表于 2018-11-25 11:26
那个RP1不是芯片,是上拉电阻包

好吧。看样子是实现不了了

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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