找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求帮忙 程序有错误不会改

[复制链接]
跳转到指定楼层
楼主


  1. #include<reg51.h>

  2. #include"lcd.h"


  3. void Lcd1602_Delay1ms(uint c);   //误差 0us
  4. {  
  5.     uchar a,b;
  6.         for (; c>0; c--)
  7.         {
  8.                  for (b=199;b>0;b--)
  9.                  {
  10.                           for(a=1;a>0;a--);
  11.                  }      
  12.         }
  13.             
  14. }

  15. #ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
  16. /*



  17.   */
  18. void LcdWriteCom(uchar com)          //写入命令
  19. {
  20.         LCD1602_E = 0;     //使能
  21.         LCD1602_RS = 0;           //选择发送命令
  22.         LCD1602_RW = 0;           //选择写入
  23.         
  24.         LCD1602_DATAPINS = com;     //放入命令
  25.         Lcd1602_Delay1ms(1);                //等待数据稳定

  26.         LCD1602_E = 1;                  //写入时序
  27.         Lcd1602_Delay1ms(5);          //保持时间
  28.         LCD1602_E = 0;
  29. }
  30. #else
  31. void LcdWriteCom(uchar com)          //写入命令
  32. {
  33.         LCD1602_E = 0;         //使能清零
  34.         LCD1602_RS = 0;         //选择写入命令
  35.         LCD1602_RW = 0;         //选择写入

  36.         LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  37.         Lcd1602_Delay1ms(1);

  38.         LCD1602_E = 1;         //写入时序
  39.         Lcd1602_Delay1ms(5);
  40.         LCD1602_E = 0;

  41. //        Lcd1602_Delay1ms(1);
  42.         LCD1602_DATAPINS = com << 4; //发送低四位
  43.         Lcd1602_Delay1ms(1);

  44.         LCD1602_E = 1;         //写入时序
  45.         Lcd1602_Delay1ms(5);
  46.         LCD1602_E = 0;
  47. }
  48. #endif
  49.                   
  50. #ifndef         LCD1602_4PINS                  
  51. void LcdWriteData(uchar dat)                        //写入数据
  52. {
  53.         LCD1602_E = 0;        //使能清零
  54.         LCD1602_RS = 1;        //选择输入数据
  55.         LCD1602_RW = 0;        //选择写入

  56.         LCD1602_DATAPINS = dat; //写入数据
  57.         Lcd1602_Delay1ms(1);

  58.         LCD1602_E = 1;   //写入时序
  59.         Lcd1602_Delay1ms(5);   //保持时间
  60.         LCD1602_E = 0;
  61. }
  62. #else
  63. void LcdWriteData(uchar dat)                        //写入数据
  64. {
  65.         LCD1602_E = 0;          //使能清零
  66.         LCD1602_RS = 1;          //选择写入数据
  67.         LCD1602_RW = 0;          //选择写入

  68.         LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
  69.         Lcd1602_Delay1ms(1);

  70.         LCD1602_E = 1;          //写入时序
  71.         Lcd1602_Delay1ms(5);
  72.         LCD1602_E = 0;

  73.         LCD1602_DATAPINS = dat << 4; //写入低四位
  74.         Lcd1602_Delay1ms(1);

  75.         LCD1602_E = 1;          //写入时序
  76.         Lcd1602_Delay1ms(5);
  77.         LCD1602_E = 0;
  78. }
  79. #endif
  80.                   
  81. #ifndef                LCD1602_4PINS
  82. void LcdInit()                                                  //LCD初始化子程序
  83. {
  84.          LcdWriteCom(0x38);  //开显示
  85.         LcdWriteCom(0x0c);  //开显示不显示光标
  86.         LcdWriteCom(0x06);  //写一个指针加1
  87.         LcdWriteCom(0x01);  //清屏
  88.         LcdWriteCom(0x80);  //设置数据指针起点
  89. }
  90. #else
  91. void LcdInit()                                                  //LCD初始化子程序
  92. {
  93.         LcdWriteCom(0x32);         //将8位总线转为4位总线
  94.         LcdWriteCom(0x28);         //在四位线下的初始化
  95.         LcdWriteCom(0x0c);  //开显示不显示光标
  96.         LcdWriteCom(0x06);  //写一个指针加1
  97.         LcdWriteCom(0x01);  //清屏
  98.         LcdWriteCom(0x80);  //设置数据指针起点
  99. }
  100. #endif

  101. #include"ds1302.h"

  102. uchar code READ_RTC_ADDR[3] = {0x81, 0x83, 0x85};
  103. uchar code WRITE_RTC_ADDR[3] = {0x80, 0x82, 0x84};

  104. uchar TIME[3][3] = {{0, 0, 0x12},{0},{0}};

  105. void Ds1302Write(uchar addr, uchar dat)
  106. {
  107.         uchar n;
  108.         RST = 0;
  109.         _nop_();

  110.         SCLK = 0;//先将SCLK置低电平。
  111.         _nop_();
  112.         RST = 1; //然后将RST(CE)置高电平。
  113.         _nop_();

  114.         for (n=0; n<8; n++)//开始传送八位地址命令
  115.         {
  116.                 DSIO = addr & 0x01;//数据从低位开始传送
  117.                 addr >>= 1;
  118.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  119.                 _nop_();
  120.                 SCLK = 0;
  121.                 _nop_();
  122.         }
  123.         for (n=0; n<8; n++)//写入8位数据
  124.         {
  125.                 DSIO = dat & 0x01;
  126.                 dat >>= 1;
  127.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  128.                 _nop_();
  129.                 SCLK = 0;
  130.                 _nop_();        
  131.         }        
  132.                  
  133.         RST = 0;//传送数据结束
  134.         _nop_();
  135. }

  136. uchar Ds1302Read(uchar addr)
  137. {
  138.         uchar n,dat,dat1;
  139.         RST = 0;
  140.         _nop_();

  141.         SCLK = 0;//先将SCLK置低电平。
  142.         _nop_();
  143.         RST = 1;//然后将RST(CE)置高电平。
  144.         _nop_();

  145.         for(n=0; n<8; n++)//开始传送八位地址命令
  146.         {
  147.                 DSIO = addr & 0x01;//数据从低位开始传送
  148.                 addr >>= 1;
  149.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  150.                 _nop_();
  151.                 SCLK = 0;//DS1302下降沿时,放置数据
  152.                 _nop_();
  153.         }
  154.         _nop_();
  155.         for(n=0; n<8; n++)//读取8位数据
  156.         {
  157.                 dat1 = DSIO;//从最低位开始接收
  158.                 dat = (dat>>1) | (dat1<<7);
  159.                 SCLK = 1;
  160.                 _nop_();
  161.                 SCLK = 0;//DS1302下降沿时,放置数据
  162.                 _nop_();
  163.         }

  164.         RST = 0;
  165.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  166.         SCLK = 1;
  167.         _nop_();
  168.         DSIO = 0;
  169.         _nop_();
  170.         DSIO = 1;
  171.         _nop_();
  172.         return dat;        
  173. }

  174. void Ds1302Init()
  175. {
  176.         uchar n;
  177.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  178.         for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年
  179.         {
  180.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[0][n]);        
  181.         }
  182.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  183. }

  184. void Ds1302ReadTime()
  185. {
  186.         uchar n;
  187.         for (n=0; n<3; n++)//读取7个字节的时钟信号:分秒时日月周年
  188.         {
  189.                 TIME[0][n] = Ds1302Read(READ_RTC_ADDR[n]);
  190.         }        
  191. }

  192. sbit key_mode = P2^0;
  193. sbit key_right = P2^1;
  194. sbit key_up = P2^2;
  195. sbit key_exit = P2^3;

  196. sbit key_light = P2^5;
  197. sbit key_check = P2^6;

  198. sbit led1 = P1^0;
  199. sbit led2 = P1^1;

  200. sbit PRT = P2^4;
  201. sbit check1 = P2^5;
  202. sbit check2 = P2^6;
  203. sbit check3 = P2^7;

  204. void Delay1ms(uint c);
  205. void LcdDisplay(uint i);
  206. void Timing();
  207. void Dec2BCD(uint i, uint j);

  208. unsigned int i = 0;
  209. unsigned int j = 0;
  210. unsigned int t = 0;
  211. unsigned int h = 0;
  212.         
  213. void main()
  214. {
  215.         led1 = 0;
  216.         led2 = 0;
  217.         PRT = 0;
  218.         LcdInit();
  219.         Timing();        
  220. }
  221. void Delay1ms(uint c)   //误差 0us
  222. {
  223.     uchar a,b;
  224.         for (; c>0; c--)
  225.         {
  226.                  for (b=199;b>0;b--)
  227.                  {
  228.                           for(a=1;a>0;a--);
  229.                  }      
  230.         }
  231. }

  232. void LcdDisplay(uint i)
  233. {
  234.         LcdWriteCom(0x80);
  235.         if(i == 0)
  236.         {
  237.                 LcdWriteData('T');
  238.         }
  239.         if(i == 1)
  240.         {
  241.                 LcdWriteData('A');
  242.         }
  243.         if(i == 2)
  244.         {
  245.                 LcdWriteData('B');
  246.         }
  247.         LcdWriteData(':');
  248.         LcdWriteData('0'+TIME[i][2]/16);                                //时
  249.         LcdWriteData('0'+(TIME[i][2]&0x0f));                                 
  250.         LcdWriteData('-');
  251.         LcdWriteData('0'+TIME[i][1]/16);                                //分
  252.         LcdWriteData('0'+(TIME[i][1]&0x0f));        
  253.         LcdWriteData('-');
  254.         LcdWriteData('0'+TIME[i][0]/16);                                //秒
  255.         LcdWriteData('0'+(TIME[i][0]&0x0f));

  256.         LcdWriteCom(0x80+0x40);
  257.         LcdWriteData('L');
  258.         LcdWriteData('E');
  259.         LcdWriteData('D');
  260.         LcdWriteData('1');
  261.         LcdWriteData(':');
  262.         if(led1 == 1)
  263.         {
  264.                 LcdWriteData('T');
  265.         }
  266.         else
  267.         {
  268.                 LcdWriteData('F');
  269.         }
  270.         LcdWriteData(' ');
  271.         LcdWriteData(' ');
  272.         LcdWriteData(' ');
  273.         LcdWriteData('L');
  274.         LcdWriteData('E');
  275.         LcdWriteData('D');
  276.         LcdWriteData('2');
  277.         LcdWriteData(':');
  278.         if(led2 == 1)
  279.         {
  280.                 LcdWriteData('T');
  281.         }
  282.         else
  283.         {
  284.                 LcdWriteData('F');
  285.         }
  286. }
  287. void Timing()
  288. {
  289.         P2 = 0xff;
  290. A:        while(1)
  291.         {
  292.                 if(key_mode == 0)
  293.                 {
  294.                         Delay1ms(50);
  295.                         if(key_mode ==0)
  296.                         {
  297.                                 i++;
  298.                                 if(i > 2)
  299.                                 {
  300.                                         i = 0;
  301.                                 }
  302.                         }
  303.                         j=0;
  304.                 }
  305.                 if(key_right == 0)
  306.                 {
  307.                         Delay1ms(50);
  308.                         if(key_right == 0)
  309.                         {
  310.                                 j++;
  311.                                 if(j > 2)
  312.                                 {
  313.                                         j = 0;
  314.                                 }
  315.                         }
  316.                 }
  317.                 if(key_up == 0)
  318.                 {
  319.                         Delay1ms(50);
  320.                         if(key_up == 0)
  321.                         {
  322.                                 TIME[i][j]++;
  323.                                 if(TIME[i][j] == 0x0a)
  324.                                 {
  325.                                         TIME[i][j] = 0x10;
  326.                                 }                                       
  327.                                 else if(TIME[i][j] == 0x1a)
  328.                                 {
  329.                                         TIME[i][j] = 0x20;
  330.                                 }               
  331.                                 else if(TIME[i][j] == 0x2a)
  332.                                 {
  333.                                         TIME[i][j] = 0x30;
  334.                                 }
  335.                                 else if(TIME[i][j] == 0x3a)
  336.                                 {
  337.                                         TIME[i][j] = 0x40;
  338.                                 }
  339.                                 else if(TIME[i][j] == 0x4a)
  340.                                 {
  341.                                         TIME[i][j] = 0x50;
  342.                                 }
  343.                                 else if(TIME[i][j] == 0x5a)
  344.                                 {
  345.                                         TIME[i][j] = 0x00;
  346.                                 }
  347.                                 else if(j == 2 && TIME[i][j] == 0x24)
  348.                                 {
  349.                                         TIME[i][j] = 0x00;
  350.                                 }
  351.                         }
  352.                 }
  353.                 LcdDisplay(i);
  354.                 if(key_exit == 0)
  355.                 {
  356.                         Delay1ms(50);
  357.                         if(key_exit == 0)
  358.                         {
  359.                                 break;
  360.                         }
  361.                 }
  362.         }
  363.         Ds1302Init();
  364.         while(1)
  365.         {               
  366.                 Ds1302ReadTime();
  367.                 if(TIME[0][2] >= TIME[1][2])
  368.                 {
  369.                         if(TIME[0][1] >= TIME[1][1])
  370.                         {
  371.                                 led1 = 1;
  372.                                 led2 = 1;
  373.                         }
  374.                 }
  375.                 if(TIME[0][2] >= TIME[2][2])
  376.                 {
  377.                         if(TIME[0][1]>=TIME[2][1])
  378.                         {
  379.                                 led1 = 0;
  380.                                 led2 = 0;
  381.                         }
  382.                 }
  383.                
  384.                 if(key_light == 0)
  385.                 {
  386.                
  387.                 if(PRT == 0)
  388.                 {
  389.                         led1 = 0;
  390.                         led2 = 0;
  391.                 }
  392.                 if(PRT == 1)
  393.                 {
  394.                         led1 = 1;
  395.                         led2 = 1;
  396.                 }
  397.                 }

  398.                 if(key_check == 0)
  399.                 {
  400.                 if(check1 == 1)
  401.                 {
  402.                         led1 = 1;
  403.                         led2 = 0;
  404.                 }
  405.                 if(check2 == 1)
  406.                 {
  407.                         led1 = 0;
  408.                         led2 = 1;
  409.                 }
  410.                 if(check3 == 1)
  411.                 {
  412.                         led1 == 0;
  413.                         led2 == 0;
  414.                 }
  415.                 }
  416.                
  417.                 LcdDisplay(0);        
  418.                 if(key_exit == 0)
  419.                 {
  420.                         Delay1ms(50);
  421.                         if(key_exit == 0)
  422.                         {
  423.                                 goto A;
  424.                         }
  425.                 }  
  426.         }

  427. }

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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