怎么才能使显示的时间信息不移动,代码是我从论坛里两个帖子复制的,二合一
该怎么办
- #include <stdio.h>
- #include <string.h>
- #include <DS1302.h>
- /* 接口定义
- CE(DS1302 pin5) -> Arduino D8
- IO(DS1302 pin6) -> Arduino D9
- SCLK(DS1302 pin7) -> Arduino D10
- */
- uint8_t CE_PIN = 8;
- uint8_t IO_PIN = 9;
- uint8_t SCLK_PIN = 10;
- //引脚使用Arduino上
- #define PIN_SCE 7
- #define PIN_RESET 6
- #define PIN_DC 5
- #define PIN_SDIN 4
- #define PIN_SCLK 3
- //**************************************
- //配置为LCD
- #define LCD_C LOW
- #define LCD_D HIGH
- #define LCD_CMD 0
- //****************************************
- //液晶的尺寸
- #define LCD_X 84
- #define LCD_Y 48
- //***************************************
- int scrollPosition = -10;
- static const byte ASCII[][5] =
- {
- {
- 0x00, 0x00, 0x00, 0x00, 0x00 } // 20
- ,{
- 0x00, 0x00, 0x5f, 0x00, 0x00 } // 21 !
- ,{
- 0x00, 0x07, 0x00, 0x07, 0x00 } // 22 "
- ,{
- 0x14, 0x7f, 0x14, 0x7f, 0x14 } // 23 #
- ,{
- 0x24, 0x2a, 0x7f, 0x2a, 0x12 } // 24 $$
- ,{
- 0x23, 0x13, 0x08, 0x64, 0x62 } // 25 %
- ,{
- 0x36, 0x49, 0x55, 0x22, 0x50 } // 26 &
- ,{
- 0x00, 0x05, 0x03, 0x00, 0x00 } // 27 '
- ,{
- 0x00, 0x1c, 0x22, 0x41, 0x00 } // 28 (
- ,{
- 0x00, 0x41, 0x22, 0x1c, 0x00 } // 29 )
- ,{
- 0x14, 0x08, 0x3e, 0x08, 0x14 } // 2a *
- ,{
- 0x08, 0x08, 0x3e, 0x08, 0x08 } // 2b +
- ,{
- 0x00, 0x50, 0x30, 0x00, 0x00 } // 2c ,
- ,{
- 0x08, 0x08, 0x08, 0x08, 0x08 } // 2d -
- ,{
- 0x00, 0x60, 0x60, 0x00, 0x00 } // 2e .
- ,{
- 0x20, 0x10, 0x08, 0x04, 0x02 } // 2f /
- ,{
- 0x3e, 0x51, 0x49, 0x45, 0x3e } // 30 0
- ,{
- 0x00, 0x42, 0x7f, 0x40, 0x00 } // 31 1
- ,{
- 0x42, 0x61, 0x51, 0x49, 0x46 } // 32 2
- ,{
- 0x21, 0x41, 0x45, 0x4b, 0x31 } // 33 3
- ,{
- 0x18, 0x14, 0x12, 0x7f, 0x10 } // 34 4
- ,{
- 0x27, 0x45, 0x45, 0x45, 0x39 } // 35 5
- ,{
- 0x3c, 0x4a, 0x49, 0x49, 0x30 } // 36 6
- ,{
- 0x01, 0x71, 0x09, 0x05, 0x03 } // 37 7
- ,{
- 0x36, 0x49, 0x49, 0x49, 0x36 } // 38 8
- ,{
- 0x06, 0x49, 0x49, 0x29, 0x1e } // 39 9
- ,{
- 0x00, 0x36, 0x36, 0x00, 0x00 } // 3a :
- ,{
- 0x00, 0x56, 0x36, 0x00, 0x00 } // 3b ;
- ,{
- 0x08, 0x14, 0x22, 0x41, 0x00 } // 3c <
- ,{
- 0x14, 0x14, 0x14, 0x14, 0x14 } // 3d =
- ,{
- 0x00, 0x41, 0x22, 0x14, 0x08 } // 3e >
- ,{
- 0x02, 0x01, 0x51, 0x09, 0x06 } // 3f ?
- ,{
- 0x32, 0x49, 0x79, 0x41, 0x3e } // 40 @
- ,{
- 0x7e, 0x11, 0x11, 0x11, 0x7e } // 41 A
- ,{
- 0x7f, 0x49, 0x49, 0x49, 0x36 } // 42 B
- ,{
- 0x3e, 0x41, 0x41, 0x41, 0x22 } // 43 C
- ,{
- 0x7f, 0x41, 0x41, 0x22, 0x1c } // 44 D
- ,{
- 0x7f, 0x49, 0x49, 0x49, 0x41 } // 45 E
- ,{
- 0x7f, 0x09, 0x09, 0x09, 0x01 } // 46 F
- ,{
- 0x3e, 0x41, 0x49, 0x49, 0x7a } // 47 G
- ,{
- 0x7f, 0x08, 0x08, 0x08, 0x7f } // 48 H
- ,{
- 0x00, 0x41, 0x7f, 0x41, 0x00 } // 49 I
- ,{
- 0x20, 0x40, 0x41, 0x3f, 0x01 } // 4a J
- ,{
- 0x7f, 0x08, 0x14, 0x22, 0x41 } // 4b K
- ,{
- 0x7f, 0x40, 0x40, 0x40, 0x40 } // 4c L
- ,{
- 0x7f, 0x02, 0x0c, 0x02, 0x7f } // 4d M
- ,{
- 0x7f, 0x04, 0x08, 0x10, 0x7f } // 4e N
- ,{
- 0x3e, 0x41, 0x41, 0x41, 0x3e } // 4f O
- ,{
- 0x7f, 0x09, 0x09, 0x09, 0x06 } // 50 P
- ,{
- 0x3e, 0x41, 0x51, 0x21, 0x5e } // 51 Q
- ,{
- 0x7f, 0x09, 0x19, 0x29, 0x46 } // 52 R
- ,{
- 0x46, 0x49, 0x49, 0x49, 0x31 } // 53 S
- ,{
- 0x01, 0x01, 0x7f, 0x01, 0x01 } // 54 T
- ,{
- 0x3f, 0x40, 0x40, 0x40, 0x3f } // 55 U
- ,{
- 0x1f, 0x20, 0x40, 0x20, 0x1f } // 56 V
- ,{
- 0x3f, 0x40, 0x38, 0x40, 0x3f } // 57 W
- ,{
- 0x63, 0x14, 0x08, 0x14, 0x63 } // 58 X
- ,{
- 0x07, 0x08, 0x70, 0x08, 0x07 } // 59 Y
- ,{
- 0x61, 0x51, 0x49, 0x45, 0x43 } // 5a Z
- ,{
- 0x00, 0x7f, 0x41, 0x41, 0x00 } // 5b [
- ,{
- 0x02, 0x04, 0x08, 0x10, 0x20 } // 5c ¥
- ,{
- 0x00, 0x41, 0x41, 0x7f, 0x00 } // 5d ]
- ,{
- 0x04, 0x02, 0x01, 0x02, 0x04 } // 5e ^
- ,{
- 0x40, 0x40, 0x40, 0x40, 0x40 } // 5f _
- ,{
- 0x00, 0x01, 0x02, 0x04, 0x00 } // 60 `
- ,{
- 0x20, 0x54, 0x54, 0x54, 0x78 } // 61 a
- ,{
- 0x7f, 0x48, 0x44, 0x44, 0x38 } // 62 b
- ,{
- 0x38, 0x44, 0x44, 0x44, 0x20 } // 63 c
- ,{
- 0x38, 0x44, 0x44, 0x48, 0x7f } // 64 d
- ,{
- 0x38, 0x54, 0x54, 0x54, 0x18 } // 65 e
- ,{
- 0x08, 0x7e, 0x09, 0x01, 0x02 } // 66 f
- ,{
- 0x0c, 0x52, 0x52, 0x52, 0x3e } // 67 g
- ,{
- 0x7f, 0x08, 0x04, 0x04, 0x78 } // 68 h
- ,{
- 0x00, 0x44, 0x7d, 0x40, 0x00 } // 69 i
- ,{
- 0x20, 0x40, 0x44, 0x3d, 0x00 } // 6a j
- ,{
- 0x7f, 0x10, 0x28, 0x44, 0x00 } // 6b k
- ,{
- 0x00, 0x41, 0x7f, 0x40, 0x00 } // 6c l
- ,{
- 0x7c, 0x04, 0x18, 0x04, 0x78 } // 6d m
- ,{
- 0x7c, 0x08, 0x04, 0x04, 0x78 } // 6e n
- ,{
- 0x38, 0x44, 0x44, 0x44, 0x38 } // 6f o
- ,{
- 0x7c, 0x14, 0x14, 0x14, 0x08 } // 70 p
- ,{
- 0x08, 0x14, 0x14, 0x18, 0x7c } // 71 q
- ,{
- 0x7c, 0x08, 0x04, 0x04, 0x08 } // 72 r
- ,{
- 0x48, 0x54, 0x54, 0x54, 0x20 } // 73 s
- ,{
- 0x04, 0x3f, 0x44, 0x40, 0x20 } // 74 t
- ,{
- 0x3c, 0x40, 0x40, 0x20, 0x7c } // 75 u
- ,{
- 0x1c, 0x20, 0x40, 0x20, 0x1c } // 76 v
- ,{
- 0x3c, 0x40, 0x30, 0x40, 0x3c } // 77 w
- ,{
- 0x44, 0x28, 0x10, 0x28, 0x44 } // 78 x
- ,{
- 0x0c, 0x50, 0x50, 0x50, 0x3c } // 79 y
- ,{
- 0x44, 0x64, 0x54, 0x4c, 0x44 } // 7a z
- ,{
- 0x00, 0x08, 0x36, 0x41, 0x00 } // 7b {
- ,{
- 0x00, 0x00, 0x7f, 0x00, 0x00 } // 7c |
- ,{
- 0x00, 0x41, 0x36, 0x08, 0x00 } // 7d }
- ,{
- 0x10, 0x08, 0x08, 0x10, 0x08 } // 7e ←
- ,{
- 0x00, 0x06, 0x09, 0x09, 0x06 } // 7f →
- };
- //*************************************************
- void LcdCharacter(char character)
- {
- LcdWrite(LCD_D, 0x00);
- for (int index = 0; index < 5; index++)
- {
- LcdWrite(LCD_D, ASCII[character - 0x20][index]);
- }
- LcdWrite(LCD_D, 0x00);
- }
- void LcdClear(void)
- {
- for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
- {
- LcdWrite(LCD_D, 0x00);
- }
- }
- void LcdInitialise(void)
- {
- pinMode(PIN_SCE, OUTPUT);
- pinMode(PIN_RESET, OUTPUT);
- pinMode(PIN_DC, OUTPUT);
- pinMode(PIN_SDIN, OUTPUT);
- pinMode(PIN_SCLK, OUTPUT);
- digitalWrite(PIN_RESET, LOW);
- digitalWrite(PIN_RESET, HIGH);
- LcdWrite(LCD_CMD, 0x21); //液晶扩展命令 LCD Extended Commands.
- LcdWrite(LCD_CMD, 0xBf); //设置LCD VOP(对比度) Set LCD Vop (Contrast). //B1
- LcdWrite(LCD_CMD, 0x04); //设置温度系数r = Set Temp coefficent. //0x04
- LcdWrite(LCD_CMD, 0x14); // LCD偏置模式1:48 LCD bias mode 1:48. //0x13
- LcdWrite(LCD_CMD, 0x0C); // 在正常模式下的LCD。统一修改为逆 LCD in normal mode. 0x0d for inverse
- LcdWrite(LCD_C, 0x20);
- LcdWrite(LCD_C, 0x0C);
- }
- void LcdString(char *characters)
- {
- while (*characters)
- {
- LcdCharacter(*characters++);
- }
- }
- void LcdWrite(byte dc, byte data)
- {
- digitalWrite(PIN_DC, dc);
- digitalWrite(PIN_SCE, LOW);
- shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
- digitalWrite(PIN_SCE, HIGH);
- }
- /**
- * gotoXY程序定位光标 gotoXY routine to position cursor
- * X - 范围:0~84 x - range: 0 to 84
- * Y - 范围:0~5 y - range: 0 to 5
- */
- void gotoXY(int x, int y)
- {
- LcdWrite( 0, 0x80 | x); // 列 Column.
- LcdWrite( 0, 0x40 | y); // 行 Row.
- }
- void drawBox(void)
- {
- int j;
- for(j = 0; j < 84; j++) // top
- {
- gotoXY(j, 0);
- LcdWrite(1, 0x01);
- }
- for(j = 0; j < 84; j++) //Bottom
- {
- gotoXY(j, 5);
- LcdWrite(1, 0x80);
- }
- for(j = 0; j < 6; j++) // Right
- {
- gotoXY(83, j);
- LcdWrite(1, 0xff);
- }
- for(j = 0; j < 6; j++) // Left
- {
- gotoXY(0, j);
- LcdWrite(1, 0xff);
- }
- }
- void Scroll(String message)
- {
- for (int i = scrollPosition; i < scrollPosition + 11; i++)
- {
- if ((i >= message.length()) || (i < 0))
- {
- LcdCharacter(' ');
- }
- else
- {
- LcdCharacter(message.charAt(i));
- }
- }
- scrollPosition++;
- if ((scrollPosition >= message.length()) && (scrollPosition > 0))
- {
- scrollPosition = -10;
- }
- }
- //********************************************************
- /* 日期变量缓存 */
- char buf[50];
- char buf1[50];
- char buf2[50];
- char day[10];
- /* 串口数据缓存 */
- String comdata = "";
- int numdata[7] ={
- 0}
- , j = 0, mark = 0;
- /* 创建 DS1302 对象 */
- DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
- void print_time()
- {
- /* 从 DS1302 获取当前时间 */
- Time t = rtc.time();
- /* 将星期从数字转换为名称 */
- memset(day, 0, sizeof(day));
- switch (t.day)
- {
- case 1:
- strcpy(day, "Sunday");
- break;
- case 2:
- strcpy(day, "Monday");
- break;
- case 3:
- strcpy(day, "Tuesday");
- break;
- case 4:
- strcpy(day, "Wednesday");
- break;
- case 5:
- strcpy(day, "Thursday");
- break;
- case 6:
- strcpy(day, "Friday");
- break;
- case 7:
- strcpy(day, "Saturday");
- break;
- }
- /* 将日期代码格式化凑成buf等待输出 */
- snprintf(buf2, sizeof(buf2), "%s", day);
- snprintf(buf, sizeof(buf), "%04d-%02d-%02d", t.yr, t.mon, t.date);
- snprintf(buf1, sizeof(buf1), "%02d:%02d:%02d", t.hr, t.min, t.sec);
- /* 输出日期到串口 */
- Serial.println(buf2);
- Serial.println(buf);
- Serial.println(buf1);
- gotoXY(7,1);
- Scroll(buf);
- gotoXY(3,2);
- Scroll(buf2);
- gotoXY(4,4);
- Scroll(buf1);
- }
- void setup()
- {
- Serial.begin(9600);
- rtc.write_protect(false);
- rtc.halt(false);
- LcdInitialise();
- LcdClear();
- drawBox();
- }
- void loop()
- {
- /* 当串口有数据的时候,将数据拼接到变量comdata */
- while (Serial.available() > 0)
- {
- comdata += char(Serial.read());
- delay(2);
- mark = 1;
- }
- /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
- if(mark == 1)
- {
- Serial.print("You inputed : ");
- Serial.println(comdata);
- for(int i = 0; i < comdata.length() ; i++)
- {
- if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
- {
- j++;
- }
- else
- {
- numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
- }
- }
- /* 将转换好的numdata凑成时间格式,写入DS1302 */
- Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
- rtc.time(t);
- mark = 0;
- j=0;
- /* 清空 comdata 变量,以便等待下一次输入 */
- comdata = String("");
- /* 清空 numdata */
- for(int i = 0; i < 7 ; i++) numdata[i]=0;
- }
- /* 打印当前时间 */
- print_time();
- delay(1000);
- }
复制代码 |