基于12864的指针式时钟设计与实现

基于12864的指针式时钟设计与实现

主要内容

  1. 在12864液晶屏模拟显示指针式时钟;
  2. 时间能够由按键调整;
  3. 创新:自由发挥,比如整点报时、闹铃。

系统硬件原理图

系统硬件原理图

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')

//秒针结束点坐标,起点坐标(x0,y0)=(31,31);
uchar code secondpointerx[]=//x1
{
//0-15秒
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,
//16-30秒
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,
//31-45秒
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,
//46-59秒
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[]=//y1
{
//0-15秒
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,
//16-30秒
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,
//31-45秒
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,
//46-59秒
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,

};

//分针结束点坐标,起点坐标(x0,y0)=(31,31);
uchar code minpointerx[]=//x1
{
//0-15分
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,
//16-30分
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,
//31-45分
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,
//46-59分
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[]=//y1
{
//0-15分
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,
//16-30分
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,
//31-45分
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,
//46-59分
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,
};

//时针结束点坐标,起点坐标(x0,y0)=(31,31);

uchar code hourpointerx[]=//x1
{
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[]=//y1
{
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[]={
/*--  文字: 年0 此字体下对应的点阵为:宽x高=16x16--*/
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,
/*--  文字: 月1; --*/
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,
/*--  文字: 日2; --*/
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,
/*--  文字: 时3;--*/
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,
/*--  文字: 分4; --*/
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,
/*--  文字: 秒5; --*/
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,
/*--  文字: 星6; --*/
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,
/*--  文字: 期7; --*/
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,
/*--  文字: 七8; --*/
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,
/*--  文字: 一9; --*/
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,
/*--  文字: 二 10; --*/
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,
/*--  文字: 三 11; --*/
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,
/*--  文字: 四 12; --*/
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,
/*--  文字: 五 13; --*/
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,
/*--  文字: 六 14; --*/
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,
/*--  文字: 闹 15; --*/
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,
/*--  文字: 钟16; --*/
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,
/*--  文字: 设17; --*/
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,
/*--  文字: 置18; --*/
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,
/*--  文字: 当19; --*/
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,
/*--  文字: 前20; --*/
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,
/*--  文字: 间21; --*/
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,
/*--  文字: 调22; --*/
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,
/*--  文字: 整23; --*/
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[]={
/*-- ID:0,字符:"0",ASCII编码:30,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0xf0,0xf8,0x08,0x88,0x48,0xf8,0xf0,0x00,0x0f,0x1f,0x12,0x11,0x10,0x1f,0x0f,0x00,

/*-- ID:1,字符:"1",ASCII编码:31,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x00,0x20,0x30,0xf8,0xf8,0x00,0x00,0x00,0x00,0x10,0x10,0x1f,0x1f,0x10,0x10,0x00,

/*-- ID:2,字符:"2",ASCII编码:32,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x10,0x18,0x08,0x88,0xc8,0x78,0x30,0x00,0x1c,0x1e,0x13,0x11,0x10,0x18,0x18,0x00,

/*-- ID:3,字符:"3",ASCII编码:33,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x10,0x18,0x88,0x88,0x88,0xf8,0x70,0x00,0x08,0x18,0x10,0x10,0x10,0x1f,0x0f,0x00,

/*-- ID:4,字符:"4",ASCII编码:34,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x80,0xc0,0x60,0x30,0xf8,0xf8,0x00,0x00,0x01,0x01,0x01,0x11,0x1f,0x1f,0x11,0x00,

/*-- ID:5,字符:"5",ASCII编码:35,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0xf8,0xf8,0x88,0x88,0x88,0x88,0x08,0x00,0x08,0x18,0x10,0x10,0x11,0x1f,0x0f,0x00,

/*-- ID:6,字符:"6",ASCII编码:36,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0xe0,0xf0,0x98,0x88,0x88,0x80,0x00,0x00,0x0f,0x1f,0x10,0x10,0x10,0x1f,0x0f,0x00,

/*-- ID:7,字符:"7",ASCII编码:37,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x18,0x18,0x08,0x08,0x88,0xf8,0x78,0x00,0x00,0x00,0x1e,0x1f,0x01,0x00,0x00,0x00,

/*-- ID:8,字符:"8",ASCII编码:38,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x70,0xf8,0x88,0x88,0x88,0xf8,0x70,0x00,0x0f,0x1f,0x10,0x10,0x10,0x1f,0x0f,0x00,

/*-- ID:9,字符:"9",ASCII编码:39,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
0x70,0xf8,0x88,0x88,0x88,0xf8,0xf0,0x00,0x00,0x10,0x10,0x10,0x18,0x0f,0x07,0x00,

/*-- ID:10,字符:":",ASCII编码:3A,对应字:宽x高=8x16,画布:宽W=8 高H=16,共16字节*/
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;//调时标志,为1时调时

uchar Hour,Min,Sec,Day,Mon,Year,Week;
uchar nHour,nMin,nSec;
uchar n,S1num;
uchar xdata dispbuf[8][128];//1024Byte用于存放显示数据

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)		//lcd写命令
{
	WaiteBusy();
	LCDEN=0;
	LCDRW = 0;
	LCDRS = 0;
	DBPort = cmd;
	LCDEN = 1;
	_nop_();
	_nop_();
	LCDEN = 0;
}

void WriteData(uchar wdata)	//lcd写数据
{
	WaiteBusy();
	LCDRS = 1;
	LCDRW = 0;
	DBPort = wdata;
	LCDEN = 1;
	_nop_();
	_nop_();
	LCDEN = 0;
}
/*设置页 0xb8是页的首地址*/ 
void SetLine(uchar page) 
{
	page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页 64/8=8,共8页 
  	WriteCmd(page); 
}
	
/*设定显示开始行,0xc0是行的首地址*/ 
void SetStartLine(uchar startline) 
{
	startline=0xc0|startline; //1100 0000 
	WriteCmd(startline); //设置从哪行开始:0--63,一般从0 行开 始显示
}

/*设定列地址--Y 0-63 ,0x40是列的首地址*/
void SetColumn(uchar column) 
{
	column=column &0x3f; //column最大值为64,越出 0=<column<=63 
	column= 0x40|column; //01xx xxxx 
	WriteCmd(column); 
}

/*开关显示,0x3f是开显示,0x3e是关显示*/ 
void SetOnOff(uchar onoff) 
{
	onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1 
	WriteCmd(onoff);
}


/*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ 
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; //选屏参数,page选页参数,column选列参数,number选第几汉 字输出 
	SelectScreen(ss);
	// column=column&0x3f; 
	// SetLine(page); //写上半页 
	// SetColumn(column); //控制列 
	for(i=0;i<16;i++) //控制16列的数据输出
	{
		dispbuf[page][column+i]=p[number*32+i]; //将汉字输出到显示缓冲区
		//WriteData(p[i+32*number]);
	} //i+32*number汉字的前16个数据输出 
	//SetLine(page+1); //写下半页 
	//SetColumn(column); //控制列 
	for(i=0;i<16;i++) //控制16列的数据输出
    {
		dispbuf[page+1][column+i]=p[number*32+i+16]; //将汉字输出到显示缓冲区
    	//WriteData(p[i+32*number+16]);
	}//i+32*number+16汉字的后16个数据 输出
}
//显示半角汉字和数字和字母 
void Displayen(uchar ss,uchar page,uchar column,uchar number,uchar* p) 
{
	uint i;//选屏参数,pagr选页参数,column选列参数,number选第几汉 字输出
	SelectScreen(ss); 
//   column=column&0x3f; 
//   SetLine(page); //写上半页 
//   SetColumn(column); 
	for(i=0;i<8;i++) 
  {
		dispbuf[page][column+i]=p[number*16+i]; //将汉字输出到显示缓冲区
    //WriteData(p[i+16*number]);
  } 
  SetLine(page+1); //写下半页 
	SetColumn(column);
	for(i=0;i<8;i++)
	{
		dispbuf[page+1][column+i]=p[number*16+i+8]; //将汉字输出到显示缓冲区
		//WriteData(p[i+16*number+8]);
	}
} 

 void LcdInit()				//lcd初始化
{
	LCDCS1 = 1;
	LCDCS2 = 1;
	WriteCmd(DISP_OFF);
	WriteCmd(DISP_Y);
	WriteCmd(DISP_ON);
}
/****************************************
函数功能:将显示缓冲区所有数据送到12864显示
****************************************/
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()//清空显存,0x00
{
	uchar i,j;
	for(j=0;j<8;j++)
	{
		for(i=0;i<128;i++)
			dispbuf[j][i] = 0x00;
	}		
}
void ClearScreen()		//清屏
{
	ClearBuff();
	Show();
}
/*********************************************
函数功能:drawflag = 1:在12864任意位置画点
		  drawflag = 0:在12864任意位置清除点

*********************************************/
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);		
}

/********************************************************************************
**函数功能描述:画直函数,采用非浮点型变量计算,显著提高了运算速度
**输        入:x0,y0,x1,y1:起始,结束点(坐标)

			***注意坐标不要越界***
			x:0-127
			y:0-63


**输        出:无
				坐标如图所示
----------------------------
|(0,0)				(127,0)|
|						   |
|						   |
|						   |
|						   |
|						   |
|						   |
|(0,63)			   (127,63)|
----------------------------

*******************************************************************************/

void Line(uchar x0,uchar y0,uchar x1,uchar y1)
{

//使用Bresenham算法画直线
	char dx,dy,x_increase,y_increase;
	int error;
	uchar x,y;
	uchar i;
	dx = x1-x0;
	dy = y1-y0;
	if(dx>=0)//判断x增长方向
		x_increase = 1;
	else
		x_increase = -1;
	if(dy>=0)//判断y增长方向
		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)		//送一幅64x64点阵图像到显存
{
	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)		//送一幅64x64点阵图像到显存
{
	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);//delay(5);
		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);//delay(5);
			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)//24Mhz 40
	{
		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;
				}	
			}
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
指针式时钟是一种基于STM32微控制器的电子时钟产品。STM32是STMicroelectronics公司推出的一款32位嵌入式微控制器,具有性能强大、低功耗等特点,因此被广泛应用于各种电子产品中。指针式时钟利用STM32微控制器的高性能和多种功能,能够实现精准的时间显示和多种实用功能。 首先,指针式时钟采用STM32的高性能时钟模块和定时器模块,能够实现对时间的精准计时和显示。通过这些模块的支持,指针式时钟能够准确显示当前的时间,并且可以自动校准时间,确保时间的准确性。同时,指针式时钟还可以实现多种时间格式的显示,包括12小时制和24小时制,并能够实现夏令时的自动切换。 其次,指针式时钟还可以通过STM32微控制器的通讯接口,比如UART、SPI、I2C等,实现与其他设备的连接和数据交换。这意味着指针式时钟可以实现与其他设备的互联互通,比如与温湿度传感器连接,实时显示当前的温湿度数据。另外,指针式时钟还可以通过通讯接口与电脑或手机进行连接,实现时间的同步和远程控制。 最后,指针式时钟还可以通过STM32微控制器的多种外设接口,比如GPIO、ADC、DAC等,实现其他实用功能。比如,通过GPIO接口可以连接LED灯,实现夜间的亮度调节功能;通过ADC接口可以连接光敏电阻,实现自动调节亮度功能。因此,指针式时钟不仅仅是一个简单的时间显示设备,还可以实现多种实用功能,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeutronShip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值