极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15006|回复: 6

我的小时钟

[复制链接]
发表于 2013-9-17 22:37:37 | 显示全部楼层 |阅读模式
怎么才能使显示的时间信息不移动,代码是我从论坛里两个帖子复制的,二合一
该怎么办

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <DS1302.h>

  4. /* 接口定义
  5. CE(DS1302 pin5) -> Arduino D8
  6. IO(DS1302 pin6) -> Arduino D9
  7. SCLK(DS1302 pin7) -> Arduino D10
  8. */
  9. uint8_t CE_PIN   = 8;
  10. uint8_t IO_PIN   = 9;
  11. uint8_t SCLK_PIN = 10;
  12. //引脚使用Arduino上
  13. #define PIN_SCE   7
  14. #define PIN_RESET 6
  15. #define PIN_DC    5
  16. #define PIN_SDIN  4
  17. #define PIN_SCLK  3
  18. //**************************************
  19. //配置为LCD
  20. #define LCD_C     LOW
  21. #define LCD_D     HIGH
  22. #define LCD_CMD   0
  23. //****************************************
  24. //液晶的尺寸
  25. #define LCD_X     84
  26. #define LCD_Y     48
  27. //***************************************
  28. int scrollPosition = -10;

  29. static const byte ASCII[][5] =
  30. {
  31.   {
  32.     0x00, 0x00, 0x00, 0x00, 0x00  } // 20
  33.   ,{
  34.     0x00, 0x00, 0x5f, 0x00, 0x00  } // 21 !
  35.   ,{
  36.     0x00, 0x07, 0x00, 0x07, 0x00  } // 22 "
  37.   ,{
  38.     0x14, 0x7f, 0x14, 0x7f, 0x14  } // 23 #
  39.   ,{
  40.     0x24, 0x2a, 0x7f, 0x2a, 0x12  } // 24 $$
  41.   ,{
  42.     0x23, 0x13, 0x08, 0x64, 0x62  } // 25 %
  43.   ,{
  44.     0x36, 0x49, 0x55, 0x22, 0x50  } // 26 &
  45.   ,{
  46.     0x00, 0x05, 0x03, 0x00, 0x00  } // 27 '
  47.   ,{
  48.     0x00, 0x1c, 0x22, 0x41, 0x00  } // 28 (
  49.   ,{
  50.     0x00, 0x41, 0x22, 0x1c, 0x00  } // 29 )
  51.   ,{
  52.     0x14, 0x08, 0x3e, 0x08, 0x14  } // 2a *
  53.   ,{
  54.     0x08, 0x08, 0x3e, 0x08, 0x08  } // 2b +
  55.   ,{
  56.     0x00, 0x50, 0x30, 0x00, 0x00  } // 2c ,
  57.   ,{
  58.     0x08, 0x08, 0x08, 0x08, 0x08  } // 2d -
  59.   ,{
  60.     0x00, 0x60, 0x60, 0x00, 0x00  } // 2e .
  61.   ,{
  62.     0x20, 0x10, 0x08, 0x04, 0x02  } // 2f /
  63.   ,{
  64.     0x3e, 0x51, 0x49, 0x45, 0x3e  } // 30 0
  65.   ,{
  66.     0x00, 0x42, 0x7f, 0x40, 0x00  } // 31 1
  67.   ,{
  68.     0x42, 0x61, 0x51, 0x49, 0x46  } // 32 2
  69.   ,{
  70.     0x21, 0x41, 0x45, 0x4b, 0x31  } // 33 3
  71.   ,{
  72.     0x18, 0x14, 0x12, 0x7f, 0x10  } // 34 4
  73.   ,{
  74.     0x27, 0x45, 0x45, 0x45, 0x39  } // 35 5
  75.   ,{
  76.     0x3c, 0x4a, 0x49, 0x49, 0x30  } // 36 6
  77.   ,{
  78.     0x01, 0x71, 0x09, 0x05, 0x03  } // 37 7
  79.   ,{
  80.     0x36, 0x49, 0x49, 0x49, 0x36  } // 38 8
  81.   ,{
  82.     0x06, 0x49, 0x49, 0x29, 0x1e  } // 39 9
  83.   ,{
  84.     0x00, 0x36, 0x36, 0x00, 0x00  } // 3a :
  85.   ,{
  86.     0x00, 0x56, 0x36, 0x00, 0x00  } // 3b ;
  87.   ,{
  88.     0x08, 0x14, 0x22, 0x41, 0x00  } // 3c <
  89.   ,{
  90.     0x14, 0x14, 0x14, 0x14, 0x14  } // 3d =
  91.   ,{
  92.     0x00, 0x41, 0x22, 0x14, 0x08  } // 3e >
  93.   ,{
  94.     0x02, 0x01, 0x51, 0x09, 0x06  } // 3f ?
  95.   ,{
  96.     0x32, 0x49, 0x79, 0x41, 0x3e  } // 40 @
  97.   ,{
  98.     0x7e, 0x11, 0x11, 0x11, 0x7e  } // 41 A
  99.   ,{
  100.     0x7f, 0x49, 0x49, 0x49, 0x36  } // 42 B
  101.   ,{
  102.     0x3e, 0x41, 0x41, 0x41, 0x22  } // 43 C
  103.   ,{
  104.     0x7f, 0x41, 0x41, 0x22, 0x1c  } // 44 D
  105.   ,{
  106.     0x7f, 0x49, 0x49, 0x49, 0x41  } // 45 E
  107.   ,{
  108.     0x7f, 0x09, 0x09, 0x09, 0x01  } // 46 F
  109.   ,{
  110.     0x3e, 0x41, 0x49, 0x49, 0x7a  } // 47 G
  111.   ,{
  112.     0x7f, 0x08, 0x08, 0x08, 0x7f  } // 48 H
  113.   ,{
  114.     0x00, 0x41, 0x7f, 0x41, 0x00  } // 49 I
  115.   ,{
  116.     0x20, 0x40, 0x41, 0x3f, 0x01  } // 4a J
  117.   ,{
  118.     0x7f, 0x08, 0x14, 0x22, 0x41  } // 4b K
  119.   ,{
  120.     0x7f, 0x40, 0x40, 0x40, 0x40  } // 4c L
  121.   ,{
  122.     0x7f, 0x02, 0x0c, 0x02, 0x7f  } // 4d M
  123.   ,{
  124.     0x7f, 0x04, 0x08, 0x10, 0x7f  } // 4e N
  125.   ,{
  126.     0x3e, 0x41, 0x41, 0x41, 0x3e  } // 4f O
  127.   ,{
  128.     0x7f, 0x09, 0x09, 0x09, 0x06  } // 50 P
  129.   ,{
  130.     0x3e, 0x41, 0x51, 0x21, 0x5e  } // 51 Q
  131.   ,{
  132.     0x7f, 0x09, 0x19, 0x29, 0x46  } // 52 R
  133.   ,{
  134.     0x46, 0x49, 0x49, 0x49, 0x31  } // 53 S
  135.   ,{
  136.     0x01, 0x01, 0x7f, 0x01, 0x01  } // 54 T
  137.   ,{
  138.     0x3f, 0x40, 0x40, 0x40, 0x3f  } // 55 U
  139.   ,{
  140.     0x1f, 0x20, 0x40, 0x20, 0x1f  } // 56 V
  141.   ,{
  142.     0x3f, 0x40, 0x38, 0x40, 0x3f  } // 57 W
  143.   ,{
  144.     0x63, 0x14, 0x08, 0x14, 0x63  } // 58 X
  145.   ,{
  146.     0x07, 0x08, 0x70, 0x08, 0x07  } // 59 Y
  147.   ,{
  148.     0x61, 0x51, 0x49, 0x45, 0x43  } // 5a Z
  149.   ,{
  150.     0x00, 0x7f, 0x41, 0x41, 0x00  } // 5b [
  151.   ,{
  152.     0x02, 0x04, 0x08, 0x10, 0x20  } // 5c &yen;
  153.   ,{
  154.     0x00, 0x41, 0x41, 0x7f, 0x00  } // 5d ]
  155.   ,{
  156.     0x04, 0x02, 0x01, 0x02, 0x04  } // 5e ^
  157.   ,{
  158.     0x40, 0x40, 0x40, 0x40, 0x40  } // 5f _
  159.   ,{
  160.     0x00, 0x01, 0x02, 0x04, 0x00  } // 60 `
  161.   ,{
  162.     0x20, 0x54, 0x54, 0x54, 0x78  } // 61 a
  163.   ,{
  164.     0x7f, 0x48, 0x44, 0x44, 0x38  } // 62 b
  165.   ,{
  166.     0x38, 0x44, 0x44, 0x44, 0x20  } // 63 c
  167.   ,{
  168.     0x38, 0x44, 0x44, 0x48, 0x7f  } // 64 d
  169.   ,{
  170.     0x38, 0x54, 0x54, 0x54, 0x18  } // 65 e
  171.   ,{
  172.     0x08, 0x7e, 0x09, 0x01, 0x02  } // 66 f
  173.   ,{
  174.     0x0c, 0x52, 0x52, 0x52, 0x3e  } // 67 g
  175.   ,{
  176.     0x7f, 0x08, 0x04, 0x04, 0x78  } // 68 h
  177.   ,{
  178.     0x00, 0x44, 0x7d, 0x40, 0x00  } // 69 i
  179.   ,{
  180.     0x20, 0x40, 0x44, 0x3d, 0x00  } // 6a j
  181.   ,{
  182.     0x7f, 0x10, 0x28, 0x44, 0x00  } // 6b k
  183.   ,{
  184.     0x00, 0x41, 0x7f, 0x40, 0x00  } // 6c l
  185.   ,{
  186.     0x7c, 0x04, 0x18, 0x04, 0x78  } // 6d m
  187.   ,{
  188.     0x7c, 0x08, 0x04, 0x04, 0x78  } // 6e n
  189.   ,{
  190.     0x38, 0x44, 0x44, 0x44, 0x38  } // 6f o
  191.   ,{
  192.     0x7c, 0x14, 0x14, 0x14, 0x08  } // 70 p
  193.   ,{
  194.     0x08, 0x14, 0x14, 0x18, 0x7c  } // 71 q
  195.   ,{
  196.     0x7c, 0x08, 0x04, 0x04, 0x08  } // 72 r
  197.   ,{
  198.     0x48, 0x54, 0x54, 0x54, 0x20  } // 73 s
  199.   ,{
  200.     0x04, 0x3f, 0x44, 0x40, 0x20  } // 74 t
  201.   ,{
  202.     0x3c, 0x40, 0x40, 0x20, 0x7c  } // 75 u
  203.   ,{
  204.     0x1c, 0x20, 0x40, 0x20, 0x1c  } // 76 v
  205.   ,{
  206.     0x3c, 0x40, 0x30, 0x40, 0x3c  } // 77 w
  207.   ,{
  208.     0x44, 0x28, 0x10, 0x28, 0x44  } // 78 x
  209.   ,{
  210.     0x0c, 0x50, 0x50, 0x50, 0x3c  } // 79 y
  211.   ,{
  212.     0x44, 0x64, 0x54, 0x4c, 0x44  } // 7a z
  213.   ,{
  214.     0x00, 0x08, 0x36, 0x41, 0x00  } // 7b {
  215.   ,{
  216.     0x00, 0x00, 0x7f, 0x00, 0x00  } // 7c |
  217.   ,{
  218.     0x00, 0x41, 0x36, 0x08, 0x00  } // 7d }
  219.   ,{
  220.     0x10, 0x08, 0x08, 0x10, 0x08  } // 7e ←
  221.   ,{
  222.     0x00, 0x06, 0x09, 0x09, 0x06  } // 7f →
  223. };
  224. //*************************************************
  225. void LcdCharacter(char character)
  226. {
  227.   LcdWrite(LCD_D, 0x00);
  228.   for (int index = 0; index < 5; index++)
  229.   {
  230.     LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  231.   }
  232.   LcdWrite(LCD_D, 0x00);
  233. }


  234. void LcdClear(void)
  235. {
  236.   for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
  237.   {
  238.     LcdWrite(LCD_D, 0x00);
  239.   }
  240. }

  241. void LcdInitialise(void)
  242. {
  243.   pinMode(PIN_SCE,   OUTPUT);
  244.   pinMode(PIN_RESET, OUTPUT);
  245.   pinMode(PIN_DC,    OUTPUT);
  246.   pinMode(PIN_SDIN,  OUTPUT);
  247.   pinMode(PIN_SCLK,  OUTPUT);

  248.   digitalWrite(PIN_RESET, LOW);
  249.   digitalWrite(PIN_RESET, HIGH);
  250.   LcdWrite(LCD_CMD, 0x21);  //液晶扩展命令               LCD Extended Commands.
  251.   LcdWrite(LCD_CMD, 0xBf);  //设置LCD VOP(对比度)      Set LCD Vop (Contrast). //B1
  252.   LcdWrite(LCD_CMD, 0x04);  //设置温度系数r =            Set Temp coefficent. //0x04
  253.   LcdWrite(LCD_CMD, 0x14);  // LCD偏置模式1:48           LCD bias mode 1:48. //0x13
  254.   LcdWrite(LCD_CMD, 0x0C);  // 在正常模式下的LCD。统一修改为逆      LCD in normal mode. 0x0d for inverse
  255.   LcdWrite(LCD_C, 0x20);
  256.   LcdWrite(LCD_C, 0x0C);
  257. }


  258. void LcdString(char *characters)
  259. {
  260.   while (*characters)
  261.   {
  262.     LcdCharacter(*characters++);
  263.   }
  264. }



  265. void LcdWrite(byte dc, byte data)
  266. {
  267.   digitalWrite(PIN_DC, dc);
  268.   digitalWrite(PIN_SCE, LOW);
  269.   shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  270.   digitalWrite(PIN_SCE, HIGH);
  271. }
  272. /**
  273. * gotoXY程序定位光标        gotoXY routine to position cursor
  274. * X - 范围:0~84           x - range: 0 to 84
  275. * Y - 范围:0~5            y - range: 0 to 5
  276. */

  277. void gotoXY(int x, int y)
  278. {
  279.   LcdWrite( 0, 0x80 | x);  // 列     Column.
  280.   LcdWrite( 0, 0x40 | y);  // 行     Row.
  281. }


  282. void drawBox(void)
  283. {
  284.   int j;
  285.   for(j = 0; j < 84; j++) // top
  286.   {
  287.     gotoXY(j, 0);
  288.     LcdWrite(1, 0x01);
  289.   }
  290.   for(j = 0; j < 84; j++) //Bottom
  291.   {
  292.     gotoXY(j, 5);
  293.     LcdWrite(1, 0x80);
  294.   }
  295.   for(j = 0; j < 6; j++) // Right
  296.   {   
  297.     gotoXY(83, j);
  298.     LcdWrite(1, 0xff);
  299.   }
  300.   for(j = 0; j < 6; j++) // Left
  301.   {
  302.     gotoXY(0, j);
  303.     LcdWrite(1, 0xff);
  304.   }
  305. }


  306. void Scroll(String message)
  307. {
  308.   for (int i = scrollPosition; i < scrollPosition + 11; i++)
  309.   {
  310.     if ((i >= message.length()) || (i < 0))
  311.     {
  312.       LcdCharacter(' ');
  313.     }
  314.     else
  315.     {
  316.       LcdCharacter(message.charAt(i));
  317.     }
  318.   }
  319.   scrollPosition++;
  320.   if ((scrollPosition >= message.length()) && (scrollPosition > 0))
  321.   {
  322.     scrollPosition = -10;
  323.   }
  324. }
  325. //********************************************************


  326. /* 日期变量缓存 */
  327. char buf[50];
  328. char buf1[50];
  329. char buf2[50];
  330. char day[10];
  331. /* 串口数据缓存 */
  332. String comdata = "";
  333. int numdata[7] ={
  334.   0}
  335. , j = 0, mark = 0;
  336. /* 创建 DS1302 对象 */
  337. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  338. void print_time()
  339. {
  340.   /* 从 DS1302 获取当前时间 */
  341.   Time t = rtc.time();
  342.   /* 将星期从数字转换为名称 */
  343.   memset(day, 0, sizeof(day));
  344.   switch (t.day)
  345.   {
  346.   case 1:
  347.     strcpy(day, "Sunday");
  348.     break;
  349.   case 2:
  350.     strcpy(day, "Monday");
  351.     break;
  352.   case 3:
  353.     strcpy(day, "Tuesday");
  354.     break;
  355.   case 4:
  356.     strcpy(day, "Wednesday");
  357.     break;
  358.   case 5:
  359.     strcpy(day, "Thursday");
  360.     break;
  361.   case 6:
  362.     strcpy(day, "Friday");
  363.     break;
  364.   case 7:
  365.     strcpy(day, "Saturday");
  366.     break;
  367.   }
  368.   /* 将日期代码格式化凑成buf等待输出 */
  369.   snprintf(buf2, sizeof(buf2), "%s", day);
  370.   snprintf(buf, sizeof(buf), "%04d-%02d-%02d", t.yr, t.mon, t.date);
  371.   snprintf(buf1, sizeof(buf1), "%02d:%02d:%02d", t.hr, t.min, t.sec);
  372.   /* 输出日期到串口 */
  373.   Serial.println(buf2);
  374.   Serial.println(buf);
  375.   Serial.println(buf1);
  376.   gotoXY(7,1);
  377.   Scroll(buf);
  378.   gotoXY(3,2);
  379.   Scroll(buf2);
  380.   gotoXY(4,4);
  381.   Scroll(buf1);
  382. }


  383. void setup()
  384. {
  385.   Serial.begin(9600);
  386.   rtc.write_protect(false);
  387.   rtc.halt(false);
  388.   LcdInitialise();
  389.   LcdClear();
  390.   drawBox();
  391. }

  392. void loop()
  393. {

  394.   /* 当串口有数据的时候,将数据拼接到变量comdata */
  395.   while (Serial.available() > 0)
  396.   {
  397.     comdata += char(Serial.read());
  398.     delay(2);
  399.     mark = 1;
  400.   }
  401.   /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  402.   if(mark == 1)
  403.   {
  404.     Serial.print("You inputed : ");
  405.     Serial.println(comdata);
  406.     for(int i = 0; i < comdata.length() ; i++)
  407.     {
  408.       if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  409.       {
  410.         j++;
  411.       }
  412.       else
  413.       {
  414.         numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  415.       }
  416.     }
  417.     /* 将转换好的numdata凑成时间格式,写入DS1302 */
  418.     Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  419.     rtc.time(t);
  420.     mark = 0;
  421.     j=0;
  422.     /* 清空 comdata 变量,以便等待下一次输入 */
  423.     comdata = String("");
  424.     /* 清空 numdata */
  425.     for(int i = 0; i < 7 ; i++) numdata[i]=0;
  426.   }

  427.   /* 打印当前时间 */
  428.   print_time();
  429.   delay(1000);
  430. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-9-18 19:36:39 | 显示全部楼层
挺好的东东
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 08:47:47 | 显示全部楼层
为啥屏幕上的字一直在动啊
回复 支持 反对

使用道具 举报

发表于 2013-9-22 23:02:15 | 显示全部楼层
看到了int scrollPosition = -10;
试着调整这里数值?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-23 11:12:47 | 显示全部楼层
哦,我试试,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-23 14:15:29 | 显示全部楼层
弘毅 发表于 2013-9-22 23:02
看到了int scrollPosition = -10;
试着调整这里数值?

改变这个数值会改变字符出现的位置,字还在从右往左走
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-23 14:32:11 | 显示全部楼层
可以把335行的“scrollPosition++;”改成“scrollPosition;”,字就不动了;再把“int scrollPosition = -10;
”的-10改大点,字就在屏幕中间了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 13:50 , Processed in 0.037783 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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