主要内容
- 在12864液晶屏模拟显示指针式时钟;
- 时间能够由按键调整;
- 创新:自由发挥,比如整点报时、闹铃。
系统硬件原理图
keil代码
#include <reg52.h>
#include<stdio.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
#define DBPort P0
#define CLK_X 95
#define CLK_Y 31
#define DISP_OFF 0x3e
#define DISP_ON 0x3f
#define DISP_Y 0xc0
#define DISP_PAGE 0xb8
#define DISP_X 0x40
#define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
+ (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))
#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \
: __DATE__ [2] == 'b' ? 2 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \
: __DATE__ [2] == 'y' ? 5 \
: __DATE__ [2] == 'l' ? 7 \
: __DATE__ [2] == 'g' ? 8 \
: __DATE__ [2] == 'p' ? 9 \
: __DATE__ [2] == 't' ? 10 \
: __DATE__ [2] == 'v' ? 11 : 12)
#define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
+ (__DATE__ [5] - '0'))
#define HOUR ((__TIME__[0] - '0') * 10 + __TIME__[1] - '0')
#define MIN ((__TIME__[3] - '0') * 10 + __TIME__[4] - '0')
#define SEC ((__TIME__[6] - '0') * 10 + __TIME__[7] - '0')
uchar code secondpointerx[]=
{
CLK_X+ 0,CLK_X+ 2,CLK_X+ 4,CLK_X+ 7,CLK_X+ 9,CLK_X+11,CLK_X+13,CLK_X+14,CLK_X+16,CLK_X+18,
CLK_X+19,CLK_X+20,CLK_X+21,CLK_X+21,CLK_X+21,CLK_X+22,
CLK_X+22,CLK_X+21,CLK_X+21,CLK_X+20,CLK_X+19,CLK_X+18,CLK_X+16,CLK_X+14,CLK_X+13,CLK_X+11,
CLK_X+ 9,CLK_X+ 7,CLK_X+ 4,CLK_X+ 2,CLK_X+ 0,
CLK_X- 2,CLK_X- 4,CLK_X- 7,CLK_X- 9,CLK_X-11,CLK_X-13,CLK_X-14,CLK_X-16,CLK_X-18,CLK_X-19,
CLK_X-20,CLK_X-21,CLK_X-21,CLK_X-21,CLK_X-22,
CLK_X-22,CLK_X-21,CLK_X-21,CLK_X-20,CLK_X-19,CLK_X-18,CLK_X-16,CLK_X-14,CLK_X-13,CLK_X-11,
CLK_X- 9,CLK_X- 7,CLK_X- 4,CLK_X- 2,
};
uchar code secondpointery[]=
{
CLK_Y-22,CLK_Y-22,CLK_Y-21,CLK_Y-21,CLK_Y-20,CLK_Y-19,CLK_Y-18,CLK_Y-16,CLK_Y-14,CLK_Y-13,
CLK_Y-11,CLK_Y- 9,CLK_Y- 7,CLK_Y- 4,CLK_Y- 2,CLK_Y- 0,
CLK_Y+ 2,CLK_Y+ 4,CLK_Y+ 7,CLK_Y+ 9,CLK_Y+11,CLK_Y+13,CLK_Y+14,CLK_Y+16,CLK_Y+18,CLK_Y+19,
CLK_Y+20,CLK_Y+21,CLK_Y+21,CLK_Y+22,CLK_Y+22,
CLK_Y+22,CLK_Y+21,CLK_Y+21,CLK_Y+20,CLK_Y+19,CLK_Y+18,CLK_Y+16,CLK_Y+14,CLK_Y+13,CLK_Y+11,
CLK_Y+ 9,CLK_Y+ 7,CLK_Y+ 4,CLK_Y+ 2,CLK_Y+ 0,
CLK_Y- 2,CLK_Y- 4,CLK_Y- 7,CLK_Y- 9,CLK_Y-11,CLK_Y-13,CLK_Y-14,CLK_Y-16,CLK_Y-18,CLK_Y-19,
CLK_Y-20,CLK_Y-21,CLK_Y-21,CLK_Y-22,
};
uchar code minpointerx[]=
{
CLK_X+ 0,CLK_X+ 2,CLK_X+ 4,CLK_X+ 6,CLK_X+ 8,CLK_X+ 9,CLK_X+11,CLK_X+12,CLK_X+14,CLK_X+15,
CLK_X+16,CLK_X+17,CLK_X+18,CLK_X+19,CLK_X+20,CLK_X+20,
CLK_X+20,CLK_X+19,CLK_X+18,CLK_X+17,CLK_X+16,CLK_X+15,CLK_X+14,CLK_X+12,CLK_X+11,CLK_X+ 9,
CLK_X+ 8,CLK_X+ 6,CLK_X+ 4,CLK_X+ 2,CLK_X+ 0,
CLK_X- 2,CLK_X- 4,CLK_X- 6,CLK_X- 8,CLK_X- 9,CLK_X-11,CLK_X-12,CLK_X-14,CLK_X-15,CLK_X-16,
CLK_X-17,CLK_X-18,CLK_X-19,CLK_X-20,CLK_X-20,
CLK_X-20,CLK_X-19,CLK_X-18,CLK_X-17,CLK_X-16,CLK_X-15,CLK_X-14,CLK_X-12,CLK_X-11,CLK_X- 9,
CLK_X- 8,CLK_X- 6,CLK_X- 4,CLK_X- 2,
};
uchar code minpointery[]=
{
CLK_Y-20,CLK_Y-20,CLK_Y-19,CLK_Y-18,CLK_Y-17,CLK_Y-16,CLK_Y-15,CLK_Y-14,CLK_Y-12,CLK_Y-11,
CLK_Y- 9,CLK_Y- 8,CLK_Y- 6,CLK_Y- 4,CLK_Y- 2,CLK_Y- 0,
CLK_Y+ 2,CLK_Y+ 4,CLK_Y+ 6,CLK_Y+ 8,CLK_Y+ 9,CLK_Y+11,CLK_Y+12,CLK_Y+14,CLK_Y+15,CLK_Y+16,
CLK_Y+17,CLK_Y+18,CLK_Y+19,CLK_Y+20,CLK_Y+20,
CLK_Y+20,CLK_Y+19,CLK_Y+18,CLK_Y+17,CLK_Y+16,CLK_Y+15,CLK_Y+14,CLK_Y+12,CLK_Y+11,CLK_Y+ 9,
CLK_Y+ 8,CLK_Y+ 6,CLK_Y+ 4,CLK_Y+ 2,CLK_Y+ 0,
CLK_Y- 2,CLK_Y- 4,CLK_Y- 6,CLK_Y- 8,CLK_Y- 9,CLK_Y-11,CLK_Y-12,CLK_Y-14,CLK_Y-15,CLK_Y-16,
CLK_Y-17,CLK_Y-18,CLK_Y-19,CLK_Y-20,
};
uchar code hourpointerx[]=
{
CLK_X+ 0,CLK_X+ 1,CLK_X+ 3,CLK_X+ 5,CLK_X+ 6,CLK_X+ 8,CLK_X+ 9,CLK_X+11,CLK_X+12,CLK_X+13,
CLK_X+14,CLK_X+14,CLK_X+15,CLK_X+16,CLK_X+16,CLK_X+16,
CLK_X+16,CLK_X+16,CLK_X+15,CLK_X+14,CLK_X+14,CLK_X+13,CLK_X+12,CLK_X+11,CLK_X+ 9,CLK_X+ 8,
CLK_X+ 6,CLK_X+ 5,CLK_X+ 3,CLK_X+ 1,CLK_X+ 0,
CLK_X- 1,CLK_X- 3,CLK_X- 5,CLK_X- 6,CLK_X- 8,CLK_X- 9,CLK_X-11,CLK_X-12,CLK_X-13,CLK_X-14,
CLK_X-14,CLK_X-15,CLK_X-16,CLK_X-16,CLK_X-16,
CLK_X-16,CLK_X-16,CLK_X-15,CLK_X-14,CLK_X-14,CLK_X-13,CLK_X-12,CLK_X-11,CLK_X- 9,CLK_X- 8,
CLK_X- 6,CLK_X- 5,CLK_X- 3,CLK_X- 1,
};
uchar code hourpointery[]=
{
CLK_Y-16,CLK_Y-16,CLK_Y-16,CLK_Y-15,CLK_Y-14,CLK_Y-14,CLK_Y-13,CLK_Y-12,CLK_Y-11,CLK_Y- 9,
CLK_Y- 8,CLK_Y- 6,CLK_Y- 5,CLK_Y- 3,CLK_Y- 1,CLK_Y- 0,
CLK_Y+1,CLK_Y+ 3,CLK_Y+ 5,CLK_Y+ 6,CLK_Y+ 8,CLK_Y+ 9,CLK_Y+11,CLK_Y+12,CLK_Y+13,CLK_Y+14,
CLK_Y+14,CLK_Y+15,CLK_Y+16,CLK_Y+16,CLK_Y+16,
CLK_Y+16,CLK_Y+16,CLK_Y+15,CLK_Y+14,CLK_Y+14,CLK_Y+13,CLK_Y+12,CLK_Y+11,CLK_Y+ 9,
CLK_Y+ 8,CLK_Y+ 6,CLK_Y+ 5,CLK_Y+ 3,CLK_Y+ 1,CLK_Y+ 0,
CLK_Y-1,CLK_Y- 3,CLK_Y- 5,CLK_Y- 6,CLK_Y- 8,CLK_Y- 9,CLK_Y-11,CLK_Y-12,CLK_Y-13,CLK_Y-14,
CLK_Y-14,CLK_Y-15,CLK_Y-16,CLK_Y-16,
};
uchar code clkbmp[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x60,0x20,0x30,
0x38,0xC8,0x0C,0x04,0x04,0x06,0x02,0x02,0x02,0x03,0x01,0x01,0x21,0xF1,0x01,0x07,
0x21,0x91,0x51,0x21,0x01,0x03,0x02,0x02,0x02,0x06,0x04,0x04,0x0C,0xC8,0x38,0x30,
0x20,0x60,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,
0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x03,0x06,0x1C,0x30,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0xE0,0x3C,0x07,0x01,0x01,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x02,0x01,0x01,0x07,0x3C,0xE0,0x00,0x00,
0xFE,0x83,0x80,0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,
0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x40,0x00,0x80,0x83,0xFE,0x00,
0x3F,0xE0,0x00,0x00,0x00,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,
0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00,0x00,0xE0,0x3F,0x00,
0x00,0x03,0x1E,0x70,0xC0,0xC0,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x20,0xC0,0xC0,0x70,0x1E,0x03,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x1C,0x30,0x60,0xC0,0x80,0x80,0x00,0x00,0x00,
0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,
0x00,0x00,0x80,0x80,0xC0,0x60,0x30,0x1C,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x06,
0x0E,0x09,0x18,0x10,0x10,0x30,0x20,0x20,0x20,0x60,0x40,0x40,0x40,0x40,0x43,0x75,
0x45,0x42,0x40,0x40,0x40,0x60,0x20,0x20,0x20,0x30,0x10,0x10,0x18,0x09,0x0E,0x06,
0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
uchar code hz[]={
0x00,0x20,0x18,0xc7,0x44,0x44,0x44,0x44,0xfc,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x00,0x00,0xfe,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xfe,0x00,0x00,0x00,
0x80,0x40,0x30,0x0f,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7f,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xfe,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xff,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xff,0x00,0x00,0x00,0x00,
0x00,0xfc,0x84,0x84,0x84,0xfc,0x00,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x00,
0x00,0x3f,0x10,0x10,0x10,0x3f,0x00,0x00,0x01,0x06,0x40,0x80,0x7f,0x00,0x00,0x00,
0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8c,0x10,0x20,0x40,0x80,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3f,0x00,0x00,0x00,0x00,0x00,
0x24,0x24,0xa4,0xfe,0x23,0x22,0x00,0xc0,0x38,0x00,0xff,0x00,0x08,0x10,0x60,0x00,
0x08,0x06,0x01,0xff,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0c,0x03,0x00,0x00,
0x00,0x00,0x00,0xbe,0x2a,0x2a,0x2a,0xea,0x2a,0x2a,0x2a,0x3e,0x00,0x00,0x00,0x00,
0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7f,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,
0x00,0x04,0xff,0x24,0x24,0x24,0xff,0x04,0x00,0xfe,0x22,0x22,0x22,0xfe,0x00,0x00,
0x88,0x48,0x2f,0x09,0x09,0x19,0xaf,0x48,0x30,0x0f,0x02,0x42,0x82,0x7f,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x40,0xff,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0xfc,0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0xfc,0x00,0x00,
0x00,0x7f,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7f,0x00,0x00,
0x00,0x02,0x42,0x42,0x42,0xc2,0x7e,0x42,0x42,0x42,0x42,0xc2,0x02,0x02,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7f,0x40,0x40,0x40,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0c,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,
0x00,0xf8,0x01,0x22,0x20,0x22,0x2a,0xf2,0x22,0x22,0x22,0x22,0x02,0xfe,0x00,0x00,
0x00,0xff,0x00,0x00,0x1f,0x01,0x01,0x7f,0x09,0x11,0x0f,0x40,0x80,0x7f,0x00,0x00,
0x20,0x10,0x2c,0xe7,0x24,0x24,0x00,0xf0,0x10,0x10,0xff,0x10,0x10,0xf0,0x00,0x00,
0x01,0x01,0x01,0x7f,0x21,0x11,0x00,0x07,0x02,0x02,0xff,0x02,0x02,0x07,0x00,0x00,
0x40,0x40,0x42,0xcc,0x00,0x40,0xa0,0x9e,0x82,0x82,0x82,0x9e,0xa0,0x20,0x20,0x00,
0x00,0x00,0x00,0x3f,0x90,0x88,0x40,0x43,0x2c,0x10,0x28,0x46,0x41,0x80,0x80,0x00,
0x00,0x17,0x15,0xd5,0x55,0x57,0x55,0x7d,0x55,0x57,0x55,0xd5,0x15,0x17,0x00,0x00,
0x40,0x40,0x40,0x7f,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7f,0x40,0x40,0x40,0x00,
0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7f,0x40,0x40,0x50,0x48,0xc6,0x00,0x00,0x00,
0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xff,0x00,0x00,0x00,
0x08,0x08,0xe8,0x29,0x2e,0x28,0xe8,0x08,0x08,0xc8,0x0c,0x0b,0xe8,0x08,0x08,0x00,
0x00,0x00,0xff,0x09,0x49,0x89,0x7f,0x00,0x00,0x0f,0x40,0x80,0x7f,0x00,0x00,0x00,
0x00,0xf8,0x01,0x06,0x00,0xf0,0x12,0x12,0x12,0xf2,0x02,0x02,0x02,0xfe,0x00,0x00,
0x00,0xff,0x00,0x00,0x00,0x1f,0x11,0x11,0x11,0x1f,0x00,0x40,0x80,0x7f,0x00,0x00,
0x40,0x42,0xcc,0x00,0x00,0xfe,0x82,0x92,0x92,0xfe,0x92,0x92,0x82,0xfe,0x00,0x00,
0x00,0x00,0x3f,0x10,0x88,0x7f,0x00,0x1e,0x12,0x12,0x12,0x5e,0x80,0x7f,0x00,0x00,
0x04,0x74,0xd4,0x54,0xff,0x54,0xd4,0x74,0x14,0x08,0x77,0x84,0x44,0x3c,0x04,0x00,
0x82,0x89,0x88,0xe8,0x8b,0x88,0x88,0xf9,0xa8,0xaa,0xa9,0xa8,0xa9,0x8a,0x82,0x00
};
uchar code str[]={
0xf0,0xf8,0x08,0x88,0x48,0xf8,0xf0,0x00,0x0f,0x1f,0x12,0x11,0x10,0x1f,0x0f,0x00,
0x00,0x20,0x30,0xf8,0xf8,0x00,0x00,0x00,0x00,0x10,0x10,0x1f,0x1f,0x10,0x10,0x00,
0x10,0x18,0x08,0x88,0xc8,0x78,0x30,0x00,0x1c,0x1e,0x13,0x11,0x10,0x18,0x18,0x00,
0x10,0x18,0x88,0x88,0x88,0xf8,0x70,0x00,0x08,0x18,0x10,0x10,0x10,0x1f,0x0f,0x00,
0x80,0xc0,0x60,0x30,0xf8,0xf8,0x00,0x00,0x01,0x01,0x01,0x11,0x1f,0x1f,0x11,0x00,
0xf8,0xf8,0x88,0x88,0x88,0x88,0x08,0x00,0x08,0x18,0x10,0x10,0x11,0x1f,0x0f,0x00,
0xe0,0xf0,0x98,0x88,0x88,0x80,0x00,0x00,0x0f,0x1f,0x10,0x10,0x10,0x1f,0x0f,0x00,
0x18,0x18,0x08,0x08,0x88,0xf8,0x78,0x00,0x00,0x00,0x1e,0x1f,0x01,0x00,0x00,0x00,
0x70,0xf8,0x88,0x88,0x88,0xf8,0x70,0x00,0x0f,0x1f,0x10,0x10,0x10,0x1f,0x0f,0x00,
0x70,0xf8,0x88,0x88,0x88,0xf8,0xf0,0x00,0x00,0x10,0x10,0x10,0x18,0x0f,0x07,0x00,
0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00
};
sbit LCDRW = P1^3;
sbit LCDEN = P1^4;
sbit LCDRS = P1^5;
sbit LCDCS1 = P1^7;
sbit LCDCS2 = P1^6;
sbit beep=P3^5;
sbit key=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
bit keyflag=0;
uchar Hour,Min,Sec,Day,Mon,Year,Week;
uchar nHour,nMin,nSec;
uchar n,S1num;
uchar xdata dispbuf[8][128];
bit refreshflag = 1;
bit hourflag=0;
void delay_ms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<255;j++);
}
uchar GetWeek(uchar day,uchar mon,uchar year)
{
uchar week;
uchar temp;
if(mon==1||mon==2)
{
year--;
mon+=12;
}
week=day+2*mon+3*(mon+1)/5+year+year/4-year/100+year/400;
temp=year%4;
if(temp==0)
{
week--;
}
temp=year%100;
if(temp==0)
{
week++;
}
temp=year%400;
if(temp==0)
{
week--;
}
week%=7;
return week;
}
void SetTime()
{
hourflag=HOUR/12;
Hour = HOUR%12;
Min = MIN;
Sec = SEC;
Day = DAY;
Mon = MONTH;
Year = YEAR;
Week = GetWeek(DAY,MONTH,YEAR);
}
uchar getState(void)
{
uchar temp;
DBPort = 0xFF;
LCDEN=0;
LCDRS=0;
LCDRW=1;
LCDEN=1;
_nop_();
LCDEN=0;
temp = DBPort;
return temp;
}
void WaiteBusy()
{
uchar temp;
while(1)
{
temp = getState();
temp &= 0x80;
if(temp == 0)
break;
}
}
void WriteCmd(uchar cmd)
{
WaiteBusy();
LCDEN=0;
LCDRW = 0;
LCDRS = 0;
DBPort = cmd;
LCDEN = 1;
_nop_();
_nop_();
LCDEN = 0;
}
void WriteData(uchar wdata)
{
WaiteBusy();
LCDRS = 1;
LCDRW = 0;
DBPort = wdata;
LCDEN = 1;
_nop_();
_nop_();
LCDEN = 0;
}
void SetLine(uchar page)
{
page=0xb8|page;
WriteCmd(page);
}
void SetStartLine(uchar startline)
{
startline=0xc0|startline;
WriteCmd(startline);
}
void SetColumn(uchar column)
{
column=column &0x3f;
column= 0x40|column;
WriteCmd(column);
}
void SetOnOff(uchar onoff)
{
onoff=0x3e|onoff;
WriteCmd(onoff);
}
void SelectScreen(uchar screen)
{
switch(screen)
{
case 0: LCDCS1=1;
LCDCS2=1; break;
case 1: LCDCS1=1;
LCDCS2=0; break;
case 2: LCDCS1=0;
LCDCS2=1; break;
}
}
void Display(uchar ss,uchar page,uchar column,uchar number,uchar *p)
{
int i;
SelectScreen(ss);
for(i=0;i<16;i++)
{
dispbuf[page][column+i]=p[number*32+i];
}
for(i=0;i<16;i++)
{
dispbuf[page+1][column+i]=p[number*32+i+16];
}
}
void Displayen(uchar ss,uchar page,uchar column,uchar number,uchar* p)
{
uint i;
SelectScreen(ss);
for(i=0;i<8;i++)
{
dispbuf[page][column+i]=p[number*16+i];
}
SetLine(page+1);
SetColumn(column);
for(i=0;i<8;i++)
{
dispbuf[page+1][column+i]=p[number*16+i+8];
}
}
void LcdInit()
{
LCDCS1 = 1;
LCDCS2 = 1;
WriteCmd(DISP_OFF);
WriteCmd(DISP_Y);
WriteCmd(DISP_ON);
}
void Show()
{
uchar i,j;
LcdInit();
for(j=0;j<8;j++)
{
LCDCS1=1;
LCDCS2=0;
WriteCmd(DISP_PAGE+j);
WriteCmd(DISP_X);
for(i=0;i<64;i++)
WriteData(dispbuf[j][i]);
LCDCS1=0;
LCDCS2=1;
WriteCmd(DISP_PAGE+j);
WriteCmd(DISP_X);
for(i=64;i<128;i++)
WriteData(dispbuf[j][i]);
}
}
void ClearBuff()
{
uchar i,j;
for(j=0;j<8;j++)
{
for(i=0;i<128;i++)
dispbuf[j][i] = 0x00;
}
}
void ClearScreen()
{
ClearBuff();
Show();
}
void DrawPixel(uchar x,uchar y,bit drawflag)
{
uchar a,b;
a = y/0x08;
b = y&0x07;
if(drawflag)
dispbuf[a][x] |= BIT(b);
else
dispbuf[a][x] &= ~BIT(b);
}
void Line(uchar x0,uchar y0,uchar x1,uchar y1)
{
char dx,dy,x_increase,y_increase;
int error;
uchar x,y;
uchar i;
dx = x1-x0;
dy = y1-y0;
if(dx>=0)
x_increase = 1;
else
x_increase = -1;
if(dy>=0)
y_increase = 1;
else
y_increase = -1;
x = x0;
y = y0;
dx = cabs(dx);
dy = cabs(dy);
if(dx > dy)
{
error = -dx;
for(i=0;i<dx+1;i++)
{
DrawPixel(x,y,1);
x += x_increase;
error += 2*dy;
if(error >= 0)
{
y += y_increase;
error -= 2*dx;
}
}
}
else
{
error = -dy;
for(i=0;i<dy+1;i++)
{
DrawPixel(x,y,1);
y += y_increase;
error += 2*dx;
if(error >= 0)
{
x += x_increase;
error -= 2*dy;
}
}
}
}
void WriteClkBmp(uchar code *image)
{
uchar i,j;
for(j=0;j<8;j++)
{
for(i=64;i<128;i++)
dispbuf[j][i] = image[j*64+i-64];
}
}
void WriteTimeBmp(void)
{
uchar i,j;
for(j=0;j<8;j++)
{
for(i=0;i<64;i++)
dispbuf[j][i] = 0x00;
}
Displayen(1,0,0,YEAR/1000,str);
Displayen(1,0,8,YEAR/100%10,str);
Displayen(1,0,16,YEAR/10%10,str);
Displayen(1,0,24,YEAR%10,str);
Display(1,0,32,0,hz);
Displayen(1,2,0,Mon/10,str);
Displayen(1,2,8,Mon%10,str);
Display(1,2,16,1,hz);
Displayen(1,2,32,Day/10%10,str);
Displayen(1,2,40,Day%10,str);
Display(1,2,48,2,hz);
Displayen(1,4,0,(Hour+12*hourflag)/10,str);
Displayen(1,4,8,(Hour+12*hourflag)%10,str);
Displayen(1,4,16,10,str);
Displayen(1,4,24,Min/10,str);
Displayen(1,4,32,Min%10,str);
Displayen(1,4,40,10,str);
Displayen(1,4,48,Sec/10,str);
Displayen(1,4,56,Sec%10,str);
Display(1,6,0,6,hz);
Display(1,6,16,7,hz);
Display(1,6,32,8+Week,hz);
}
void keyscan()
{
uchar i,j;
if(key==0)
{
beep=0;
beep=1;
delay_ms(100);
beep=0;
if(key==0);
{
for(j=0;j<8;j++)
{
for(i=0;i<64;i++)
dispbuf[j][i] = 0x00;
}
keyflag=1;
S1num++;
while(!key);
switch(S1num)
{
case 1:
Display(1,0,0,19,hz);
Display(1,0,16,20,hz);
Display(1,0,32,3,hz);
Display(1,0,48,21,hz);
Display(1,2,16,22,hz);
Display(1,2,32,23,hz);
Displayen(1,4,0,(Hour+12*hourflag)/10,str);
Displayen(1,4,8,(Hour+12*hourflag)%10,str);
Displayen(1,4,16,10,str);
Displayen(1,4,24,Min/10,str);
Displayen(1,4,32,Min%10,str);
Displayen(1,4,40,10,str);
Displayen(1,4,48,Sec/10,str);
Displayen(1,4,56,Sec%10,str);
break;
case 2:
Display(1,0,0,3,hz);
Display(1,0,16,21,hz);
Display(1,0,32,22,hz);
Display(1,0,48,23,hz);
Display(1,2,0,3,hz);
Displayen(1,2,16,10,str);
Displayen(1,2,24,(Hour+12*hourflag)/10,str);
Displayen(1,2,32,(Hour+12*hourflag)%10,str);
break;
case 3:
Display(1,0,0,3,hz);
Display(1,0,16,21,hz);
Display(1,0,32,22,hz);
Display(1,0,48,23,hz);
Display(1,4,0,4,hz);
Displayen(1,4,16,10,str);
Displayen(1,4,24,Min/10,str);
Displayen(1,4,32,Min%10,str);
break;
case 4:
Display(1,0,0,3,hz);
Display(1,0,16,21,hz);
Display(1,0,32,22,hz);
Display(1,0,48,23,hz);
Display(1,6,0,5,hz);
Displayen(1,6,16,10,str);
Displayen(1,6,24,Sec/10,str);
Displayen(1,6,32,Sec%10,str);
break;
case 5:
Display(1,0,0,15,hz);
Display(1,0,16,16,hz);
Display(1,0,32,17,hz);
Display(1,0,48,18,hz);
Display(1,2,0,3,hz);
Displayen(1,2,16,10,str);
Displayen(1,2,24,nHour/10,str);
Displayen(1,2,32,nHour%10,str);
Display(1,4,0,4,hz);
Displayen(1,4,16,10,str);
Displayen(1,4,24,nMin/10,str);
Displayen(1,4,32,nMin%10,str);
Display(1,6,0,5,hz);
Displayen(1,6,16,10,str);
Displayen(1,6,24,nSec/10,str);
Displayen(1,6,32,nSec%10,str);
break;
case 6:
Display(1,0,0,15,hz);
Display(1,0,16,16,hz);
Display(1,0,32,17,hz);
Display(1,0,48,18,hz);
Display(1,2,0,3,hz);
Displayen(1,2,16,10,str);
Displayen(1,2,24,nHour/10,str);
Displayen(1,2,32,nHour%10,str);
break;
case 7:
Display(1,0,0,15,hz);
Display(1,0,16,16,hz);
Display(1,0,32,17,hz);
Display(1,0,48,18,hz);
Display(1,4,0,4,hz);
Displayen(1,4,16,10,str);
Displayen(1,4,24,nMin/10,str);
Displayen(1,4,32,nMin%10,str);
break;
case 8:
Display(1,0,0,15,hz);
Display(1,0,16,16,hz);
Display(1,0,32,17,hz);
Display(1,0,48,18,hz);
Display(1,6,0,5,hz);
Displayen(1,6,16,10,str);
Displayen(1,6,24,nSec/10,str);
Displayen(1,6,32,nSec%10,str);
break;
case 9:
S1num=0;
keyflag=0;
break;
}
}
}
if(S1num>1)
{
if(K1==0)
{
beep=0;
beep=1;
delay_ms(100);
beep=0;
while(!K1);
switch(S1num)
{
case 2:
Hour++;
if(Hour == 12)
{
Hour = 0;
if(hourflag)
hourflag = 0;
else
hourflag = 1;
}
Displayen(1,2,24,(Hour+12*hourflag)/10,str);
Displayen(1,2,32,(Hour+12*hourflag)%10,str);
break;
case 3:
Min++;
if(Min == 60)
Min = 0;
Displayen(1,4,24,Min/10,str);
Displayen(1,4,32,Min%10,str);
break;
case 4:
Sec++;
if(Sec == 60)
Sec = 0;
Displayen(1,6,24,Sec/10,str);
Displayen(1,6,32,Sec%10,str);
break;
case 6:
nHour++;
if(nHour==24)
nHour=0;
Displayen(1,2,24,nHour/10,str);
Displayen(1,2,32,nHour%10,str);
break;
case 7:
nMin++;
if(nMin==60)
nMin=0;
Displayen(1,4,24,nMin/10,str);
Displayen(1,4,32,nMin%10,str);
break;
case 8:
nSec++;
if(nSec==60)
nSec=0;
Displayen(1,6,24,nSec/10,str);
Displayen(1,6,32,nSec%10,str);
break;
}
}
if(K2==0)
{
beep=0;
beep=1;
delay_ms(100);
beep=0;
while(!K2);
switch(S1num)
{
case 2:
Hour--;
if(Hour == -1)
{
Hour = 11;
if(hourflag)
hourflag = 0;
else
hourflag = 1;
}
Displayen(1,2,24,Hour/10,str);
Displayen(1,2,32,Hour%10,str);
break;
case 3:
Min--;
if(Min == -1)
Min = 59;
Displayen(1,4,24,Min/10,str);
Displayen(1,4,32,Min%10,str);
break;
case 4:
Sec--;
if(Sec == -1)
Sec = 59;
Displayen(1,6,24,Sec/10,str);
Displayen(1,6,32,Sec%10,str);
break;
case 6:
nHour--;
if(nHour==-1)
nHour=23;
Displayen(1,2,24,nHour/10,str);
Displayen(1,2,32,nHour%10,str);
break;
case 7:
nMin--;
if(nMin==-1)
nMin=59;
Displayen(1,4,24,nMin/10,str);
Displayen(1,4,32,nMin%10,str);
break;
case 8:
nSec--;
if(nSec==-1)
nSec=59;
Displayen(1,6,24,nSec/10,str);
Displayen(1,6,32,nSec%10,str);
break;
}
}
}
if(!keyflag)
{
WriteTimeBmp();
}
}
void naozhong()
{
if(nHour==(Hour+12*hourflag)&&nMin==Min&&nSec==Sec||Min==0&&Sec==0)
{
beep=0;
beep=1;
delay_ms(5000);
beep=0;
Sec+=5;
if(Sec>=60)
{
Hour=Hour+(Min+1)/60;
if(Hour==12)
{
Hour==0;
if(hourflag)hourflag=0;
else hourflag=1;
}
Min=(Min+1)%60;
Sec=Sec%60;
}
}
}
void TimeDisp(uchar hour,uchar min,uchar sec)
{
uchar hp;
hp = hour*5+min/12;
WriteClkBmp(clkbmp);
Line(CLK_X,CLK_Y,secondpointerx[sec],secondpointery[sec]);
Line(CLK_X,CLK_Y,minpointerx[min],minpointery[min]);
Line(CLK_X,CLK_Y,hourpointerx[hp],hourpointery[hp]);
}
void TimerInit()
{
beep = 0;
SetTime();
EA = 1;
ET0 = 1;
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;
}
void main()
{
TimerInit();
ClearScreen();
while(1)
{
keyscan();
naozhong();
TimeDisp(Hour,Min,Sec);
if(refreshflag)
{
Show();
refreshflag = 0;
}
}
}
void Timer0() interrupt 1
{
TH0 = (65536-49990)/256;
TL0 = (65536-49990)%256;
n++;
if(n == 30)
{
n = 0;
Sec++;
refreshflag = 1;
if(Sec == 60)
{
Sec = 0;
Min++;
if(Min == 60)
{
Min = 0;
Hour++;
if(Hour == 12)
{
Hour = 0;
if(hourflag)
hourflag = 0;
else
hourflag = 1;
}
}
}
}
}