标题:
51单片机+LCD12864和Proteus仿真的模拟时钟程序设计
[打印本页]
作者:
futao
时间:
2019-5-9 17:20
标题:
51单片机+LCD12864和Proteus仿真的模拟时钟程序设计
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
模拟时钟.png
(126.98 KB, 下载次数: 28)
下载附件
2019-5-9 17:19 上传
#include <AT89X52.H>
#include<intrins.h>
#include<math.h>
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
#define DBPort P0
#define DISP_OFF 0x3e //关显示
#define DISP_ON 0x3f //开显示
#define DISP_Y 0xc0 //起始行
#define DISP_PAGE 0xb8 //起始页
#define DISP_X 0x40 //起始列
unsigned char code AsciiDot[] = // ASCII
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // -!-
0x00,0x0E,0x02,0x00,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // -"-
0x00,0x50,0xF8,0x56,0xF8,0x56,0x00,0x03,0x00,0x03,0x00,0x00, // -#-
0x00,0xD8,0xA4,0xA6,0x64,0x00,0x00,0x00,0x00,0x03,0x00,0x00, // -$-
0x00,0x24,0x2A,0xA4,0x50,0x90,0x00,0x00,0x00,0x00,0x01,0x00, // -%-
0x00,0xC0,0x30,0x48,0x88,0x40,0x00,0x00,0x01,0x01,0x00,0x01, // -&-
0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -'-
0x00,0x00,0x00,0xF8,0x06,0x00,0x00,0x00,0x00,0x01,0x06,0x00, // -(-
0x00,0x00,0x06,0xF8,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00, // -)-
0x00,0x04,0x34,0x0E,0x34,0x04,0x00,0x00,0x00,0x00,0x00,0x00, // -*-
0x20,0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00, // -+-
0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x06,0x03,0x00,0x00, // -,-
0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // ---
0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, // -.-
0x00,0x00,0x80,0x60,0x18,0x06,0x00,0x02,0x01,0x00,0x00,0x00, // -/-
0x00,0xFC,0x0A,0x32,0x42,0xFC,0x00,0x00,0x01,0x01,0x01,0x00, // -0-
0x00,0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -1-
0x00,0x04,0x82,0x42,0x22,0x9C,0x00,0x01,0x01,0x01,0x01,0x01, // -2-
0x00,0x84,0x02,0x12,0x12,0xEC,0x00,0x00,0x01,0x01,0x01,0x00, // -3-
0x00,0x60,0x58,0x44,0xFE,0x40,0x00,0x00,0x00,0x00,0x01,0x00, // -4-
0x00,0x9E,0x12,0x12,0x12,0xE2,0x00,0x00,0x01,0x01,0x01,0x00, // -5-
0x00,0xF8,0x14,0x12,0x12,0xE2,0x00,0x00,0x01,0x01,0x01,0x00, // -6-
0x00,0x06,0x02,0xC2,0x32,0x0E,0x00,0x00,0x00,0x01,0x00,0x00, // -7-
0x00,0xEC,0x12,0x12,0x12,0xEC,0x00,0x00,0x01,0x01,0x01,0x00, // -8-
0x00,0x1C,0x22,0x22,0xA2,0x7C,0x00,0x01,0x01,0x01,0x00,0x00, // -9-
0x00,0x00,0x98,0x98,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, // -:-
0x00,0x00,0x00,0x98,0x98,0x00,0x00,0x00,0x03,0x01,0x00,0x00, // -;-
0x20,0x50,0x50,0x88,0x04,0x04,0x00,0x00,0x00,0x00,0x01,0x01, // -<-
0x00,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, // -=-
0x04,0x04,0x88,0x50,0x50,0x20,0x01,0x01,0x00,0x00,0x00,0x00, // ->-
0x00,0x00,0x08,0x44,0x24,0x18,0x00,0x00,0x01,0x01,0x00,0x00, // -?-
0x00,0xFE,0x01,0x31,0x49,0x7E,0x00,0x01,0x02,0x02,0x02,0x01, // -@-
0xC0,0x78,0x46,0x78,0xC0,0x00,0x01,0x01,0x00,0x01,0x01,0x01, // -A-
0x02,0xFE,0x12,0x12,0x12,0xEC,0x01,0x01,0x01,0x01,0x01,0x00, // -B-
0x78,0x84,0x02,0x02,0x02,0x86,0x00,0x00,0x01,0x01,0x01,0x00, // -C-
0x02,0xFE,0x02,0x02,0x84,0x78,0x01,0x01,0x01,0x01,0x00,0x00, // -D-
0x02,0xFE,0x12,0x3A,0x02,0x86,0x01,0x01,0x01,0x01,0x01,0x01, // -LCDEN-
0x02,0xFE,0x12,0x3A,0x02,0x06,0x01,0x01,0x01,0x00,0x00,0x00, // -F-
0x78,0x84,0x02,0x02,0x22,0xE6,0x00,0x00,0x01,0x01,0x01,0x00, // -G-
0x02,0xFE,0x12,0x10,0x12,0xFE,0x01,0x01,0x01,0x00,0x01,0x01, // -H-
0x00,0x02,0xFE,0x02,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -I-
0x00,0x02,0xFE,0x02,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, // -J-
0x02,0xFE,0x12,0x28,0x46,0x82,0x01,0x01,0x01,0x00,0x01,0x01, // -K-
0x02,0xFE,0x02,0x00,0x00,0x80,0x01,0x01,0x01,0x01,0x01,0x01, // -L-
0x02,0xFE,0x04,0x18,0x04,0xFE,0x01,0x01,0x01,0x00,0x01,0x01, // -M-
0x02,0xFE,0x08,0x30,0x42,0xFE,0x01,0x01,0x01,0x00,0x00,0x01, // -N-
0x00,0xFC,0x02,0x02,0x02,0xFC,0x00,0x00,0x01,0x01,0x01,0x00, // -O-
0x02,0xFE,0x22,0x22,0x22,0x1C,0x01,0x01,0x01,0x00,0x00,0x00, // -P-
0x00,0xFC,0x02,0x02,0x02,0xFC,0x00,0x00,0x01,0x03,0x05,0x04, // -Q-
0x02,0xFE,0x12,0x32,0xD2,0x0C,0x01,0x01,0x01,0x00,0x01,0x01, // -R-
0x00,0x8C,0x12,0x22,0xC6,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -S-
0x06,0x02,0xFE,0x02,0x06,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -T-
0x02,0xFE,0x02,0x00,0x02,0xFE,0x00,0x00,0x01,0x01,0x01,0x00, // -U-
0x02,0x0E,0x72,0x80,0x72,0x0E,0x00,0x00,0x00,0x01,0x00,0x00, // -V-
0x02,0xFE,0x02,0xF0,0x02,0xFE,0x00,0x00,0x01,0x00,0x01,0x00, // -W-
0x02,0x86,0x48,0x30,0x48,0x86,0x01,0x01,0x00,0x00,0x00,0x01, // -X-
0x02,0x06,0x1A,0xE0,0x1A,0x06,0x00,0x00,0x01,0x01,0x01,0x00, // -Y-
0x86,0x42,0x32,0x0A,0x06,0x82,0x01,0x01,0x01,0x01,0x01,0x01, // -Z-
0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x00, // -[-
0x00,0x02,0x1C,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0x00, // -\-
0x00,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x04,0x07,0x00, // -]-
0x00,0x10,0x08,0x06,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00, // -^-
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08, // -_-
0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -`-
0x80,0x50,0x50,0xE0,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x00, // -a-
0x02,0xFE,0x10,0x10,0xE0,0x00,0x01,0x01,0x01,0x01,0x00,0x00, // -b-
0x00,0xE0,0x10,0x10,0x30,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -c-
0x00,0xE0,0x10,0x12,0xFE,0x00,0x00,0x00,0x01,0x01,0x00,0x01, // -d-
0x00,0xE0,0x50,0x50,0x60,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -LCDEN-
0x00,0x10,0xFC,0x12,0x02,0x06,0x00,0x01,0x01,0x01,0x00,0x00, // -f-
0xA0,0x50,0x50,0x30,0x10,0x00,0x03,0x05,0x05,0x05,0x02,0x00, // -g-
0x02,0xFE,0x20,0x10,0xF0,0x00,0x01,0x01,0x01,0x00,0x01,0x01, // -h-
0x00,0x10,0xF2,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -i-
0x00,0x10,0xF2,0x00,0x00,0x00,0x04,0x04,0x03,0x00,0x00,0x00, // -j-
0x02,0xFE,0x40,0xB0,0x10,0x00,0x01,0x01,0x00,0x01,0x01,0x00, // -k-
0x00,0x02,0xFE,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -l-
0x10,0xE0,0x10,0xE0,0x10,0xE0,0x01,0x01,0x00,0x01,0x00,0x01, // -m-
0x10,0xF0,0x20,0x10,0xF0,0x00,0x01,0x01,0x01,0x00,0x01,0x01, // -n-
0xE0,0x10,0x10,0x10,0xE0,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -o-
0x10,0xF0,0x10,0x10,0xE0,0x00,0x04,0x07,0x05,0x01,0x00,0x00, // -p-
0x00,0xE0,0x10,0x10,0xF0,0x00,0x00,0x00,0x01,0x05,0x07,0x04, // -q-
0x00,0x10,0xF0,0x20,0x10,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -r-
0x00,0x20,0x50,0xD0,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, // -s-
0x00,0x10,0xFC,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // -t-
0x10,0xF0,0x00,0x10,0xF0,0x00,0x00,0x00,0x01,0x01,0x00,0x01, // -u-
0x10,0x70,0x80,0x50,0x30,0x00,0x00,0x00,0x01,0x00,0x00,0x00, // -v-
0xF0,0x00,0xE0,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0x00, // -w-
0x10,0xB0,0x40,0xB0,0x10,0x00,0x01,0x01,0x00,0x01,0x01,0x00, // -x-
0x10,0x70,0x80,0xD0,0x30,0x10,0x00,0x04,0x03,0x00,0x00,0x00, // -y-
0x30,0x90,0x50,0x30,0x90,0x00,0x01,0x01,0x01,0x01,0x01,0x00, // -z-
0x00,0x00,0x40,0xBC,0x02,0x00,0x00,0x00,0x00,0x03,0x04,0x00, // -{-
0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, // -|-
0x00,0x00,0x02,0xBC,0x40,0x00,0x00,0x00,0x04,0x03,0x00,0x00, // -}-
0x00,0x40,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // -~-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --
};
typedef struct typFNT_GB12 // 汉字字模数据结构
{
unsigned char Index[2]; // 汉字内码索引
unsigned char Msk[24]; // 点阵码数据
};
struct typFNT_GB12 code GB_12[] = // 数据表
{
"模", 0xC4,0x34,0xFF,0x24,0x02,0x7A,0x5F,0xDA,0x6F,0x7A,0x02,0x00,
0x00,0x00,0x07,0x00,0x05,0x05,0x03,0x01,0x03,0x05,0x05,0x00,
"拟", 0x44,0x24,0xFF,0x14,0x00,0xFE,0x81,0x46,0x00,0xFF,0x00,0x00,
0x04,0x04,0x07,0x00,0x04,0x05,0x04,0x02,0x01,0x01,0x06,0x00,
"时", 0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,
0x03,0x01,0x01,0x03,0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,
"钟", 0x58,0x4F,0xFA,0x4A,0x42,0x7C,0x44,0x44,0xFF,0x44,0x7C,0x00,
0x00,0x00,0x07,0x02,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
"潘", 0x09,0xD2,0x40,0x29,0xDB,0x4D,0xFF,0x4D,0x5B,0xE9,0x48,0x00,
0x01,0x07,0x00,0x00,0x07,0x05,0x07,0x05,0x05,0x07,0x00,0x00,
"忠", 0x00,0x1E,0x12,0x92,0x52,0xBF,0x12,0x12,0x12,0x9E,0x00,0x00,
0x04,0x03,0x00,0x07,0x04,0x04,0x05,0x04,0x07,0x00,0x03,0x00,
"伟", 0x10,0x08,0xFF,0x22,0x2A,0x2A,0xFF,0x2A,0x2A,0x2A,0xE2,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x02,0x01,0x00,
"制", 0x18,0xD6,0x54,0xFF,0x54,0x56,0xD4,0x00,0xFC,0x00,0xFF,0x00,
0x00,0x03,0x00,0x07,0x00,0x02,0x03,0x00,0x04,0x04,0x07,0x00,
"作", 0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00,
};
/////////////////////////////////////////////////////////////////////////
// Bitmap点阵数据表 //
// 图片: D:\..\未标题-2.bmp,纵向取模下高位,数据排列:从左到右从上到下 //
// 图片尺寸: 120 * 16 //
/////////////////////////////////////////////////////////////////////////
unsigned char code nBitmapDot[] = // 数据表
{
0x44,0x24,0xFF,0x14,0x00,0xFE,0x81,0x46,0x00,0xFF,0x00,0x00,
0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,
0x58,0x4F,0xFA,0x4A,0x42,0x7C,0x44,0x44,0xFF,0x44,0x7C,0x00,
0x09,0xD2,0x40,0x29,0xDB,0x4D,0xFF,0x4D,0x5B,0xE9,0x48,0x00,
0x00,0x1E,0x12,0x92,0x52,0xBF,0x12,0x12,0x12,0x9E,0x00,0x00,
0x10,0x08,0xFF,0x22,0x2A,0x2A,0xFF,0x2A,0x2A,0x2A,0xE2,0x00,
0x18,0xD6,0x54,0xFF,0x54,0x56,0xD4,0x00,0xFC,0x00,0xFF,0x00,
0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,
0x0A,0x92,0x62,0x9E,0x02,0x18,0x87,0x74,0x84,0x14,0x0C,0x00,
0x08,0xF9,0x02,0x00,0xFE,0x42,0x41,0xFE,0x02,0x82,0xFE,0x00,
0x04,0x04,0x07,0x00,0x04,0x05,0x04,0x02,0x01,0x01,0x06,0x00,
0x03,0x01,0x01,0x03,0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,
0x00,0x00,0x07,0x02,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
0x01,0x07,0x00,0x00,0x07,0x05,0x07,0x05,0x05,0x07,0x00,0x00,
0x04,0x03,0x00,0x07,0x04,0x04,0x05,0x04,0x07,0x00,0x03,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x02,0x01,0x00,
0x00,0x03,0x00,0x07,0x00,0x02,0x03,0x00,0x04,0x04,0x07,0x00,
0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00,
0x02,0x01,0x00,0x04,0x05,0x02,0x01,0x00,0x01,0x02,0x04,0x00,
0x06,0x01,0x02,0x02,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x00
};
#define CLK_X 95//时钟中心点坐标
#define CLK_Y 31
//秒针结束点坐标,起点坐标(x0,y0)=(31,31);
unsigned char 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,
};
unsigned char 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);
unsigned char 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,
};
unsigned char 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);
unsigned char 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,
};
unsigned char 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,
};
unsigned char 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,
};
sbit LCDRW = P1^3;
sbit LCDEN = P1^4;
sbit LCDRS = P1^5;
sbit LCDCS1 = P1^7;
sbit LCDCS2 = P1^6;
//时间初始值
unsigned char Hour = 9;
unsigned char Min = 9;
unsigned char Sec = 30;
unsigned char xdata dispbuf[8][128];//1024Byte用于存放显示数据
bit refreshflag = 1;//显示刷新标志,每一秒送一次显示数据
unsigned char getState(void)
{
unsigned char temp;
DBPort = 0xFF;
LCDEN=0;
LCDRS=0;
LCDRW=1;
LCDEN=1;
_nop_();
LCDEN=0;
temp = DBPort;
return temp;
}
void WaiteBusy()
{
unsigned char temp;
while(1)
{
temp = getState();
temp &= 0x80;
if(temp == 0)
break;
}
}
void WriteCmd(unsigned char cmd) //lcd写命令
{
WaiteBusy();
LCDEN=0;
LCDRW = 0;
LCDRS = 0;
DBPort = cmd;
LCDEN = 1;
_nop_();
_nop_();
LCDEN = 0;
}
void WriteData(unsigned char wdata) //lcd写数据
{
WaiteBusy();
LCDRS = 1;
LCDRW = 0;
DBPort = wdata;
LCDEN = 1;
_nop_();
_nop_();
LCDEN = 0;
}
void LcdInit() //lcd初始化
{
LCDCS1 = 1;
LCDCS2 = 1;
WriteCmd(DISP_OFF);
WriteCmd(DISP_Y);
WriteCmd(DISP_ON);
}
/****************************************
函数功能:将显示缓冲区所有数据送到12864显示
****************************************/
void Show()
{
unsigned char 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
{
unsigned char 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(unsigned char x,unsigned char y,bit drawflag)
{
unsigned char 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(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
{
//使用Bresenham算法画直线
char dx,dy,x_increase,y_increase;
int error;
unsigned char x,y;
unsigned char 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;
}
}
}
}
/*****************************************************
函数功能:指定的位置按传入的数据画一条长度为len(len=<8)点的竖线
*****************************************************/
void DrawVerticalLine(unsigned char x,unsigned char y,unsigned char len,unsigned char d)
{
unsigned char i;
for(i=0;i<len;i++)
{
if(d&0x01)
DrawPixel(x,y+i,1);
d >>= 1;
}
}
/*********************************************
函数功能:指定的位置显示一个12x12汉字
x:0~127-12
y:0~63-12
*********************************************/
void Print12_12CHN(unsigned char x,unsigned char y,bit cpl,struct typFNT_GB12 a)
{
unsigned char i;
for(i=0;i<12;i++)
{
if(cpl)
DrawVerticalLine(x+i,y,8,~a.Msk[i]);
else
DrawVerticalLine(x+i,y,8,a.Msk[i]);
}
for(i=0;i<12;i++)
{
if(cpl)
DrawVerticalLine(x+i,y+8,4,~a.Msk[i+12]);
else
DrawVerticalLine(x+i,y+8,4,a.Msk[i+12]);
}
}
/*********************************************
函数功能:指定的位置显示一个12x6ASCII
x:0~127-6
y:0~63-12
*********************************************/
void Print12_6En(unsigned char x,unsigned char y,bit cpl,unsigned char asc)
{
unsigned char i,j;
for(j=0;j<2;j++)
{
for(i=0;i<6;i++)
{
if(cpl)
DrawVerticalLine(x+i,y+8*j,8-4*j,~AsciiDot[(asc-0x20)*12+i+6*j]);
else
DrawVerticalLine(x+i,y+8*j,8-4*j,AsciiDot[(asc-0x20)*12+i+6*j]);
}
}
}
/********************************************************************************
**函数功能描述:送显示数据到显存,显示12x12文字(中,英,标点,数字)
**输 入:ptr字符串首地址
**输 出:无
**说明:在显示字符串中遇到 "\n" 输出换行;反显两个"~"中间的包括的字符如:~反显~
*******************************************************************************/
void BufferPrint12(unsigned char x,unsigned char y,unsigned char *ptr)
{
unsigned char c1,c2,i,j;
bit cpl = 0;
for(i=0;ptr[i] != '\0';i++)
{
c1 = ptr[i];
c2 = ptr[i+1];
if(c1 == '\n')//换行符
{
x = 0;
y += 2;
continue;
}
if(c1 == '~')//反显
{
cpl = !cpl;
continue;
}
if(c1<128) //英文或标点
{
Print12_6En(6*x+4,6*y+2,cpl,c1);
x++;
}
else //中文
{
for(j=0;j<sizeof(GB_12)/sizeof(GB_12[0]);j++) //查找汉字
{
if(c1 == GB_12[j].Index[0] && c2 == GB_12[j].Index[1])
break;
}
Print12_12CHN(6*x+4,6*y+2,cpl,GB_12[j]);
x += 2;
i++; //汉字长度为2
}
}
}
void WriteClkBmp(unsigned char code *image) //送一幅64x64点阵图像到显存
{
unsigned char i,j;
for(j=0;j<8;j++)
{
for(i=64;i<128;i++)
dispbuf[j][i] = image[j*64+i-64];
}
}
void TimeDisp(unsigned char Hour,unsigned char Min,unsigned char Sec)
{
unsigned char hp;
hp = Hour*5+Min/12;
WriteClkBmp(clkbmp);
Line(CLK_X,31,secondpointerx[Sec],secondpointery[Sec]);//秒针
Line(CLK_X,31,minpointerx[Min],minpointery[Min]);//分针
Line(CLK_X,31,hourpointerx[hp],hourpointery[hp]);//时针
}
void TimerInit()
{
EA = 1;
ET0 = 1;
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;
}
void main()
{
TimerInit();
ClearScreen();
// BufferPrint12(0,0,"这是一个\n模拟时\n 显示实例\n proteus.\n 5d6d.com");
// BufferPrint12(0,0," 这是一\n模拟时钟\n显示程序");
while(1)
{
TimeDisp(Hour,Min,Sec);
if(refreshflag)
{
Show();
refreshflag = 0;
}
}
}
void Timer0() interrupt 1
{
unsigned char n;
TH0 = (65536-49990)/256;//调整初值可使时间更加精确
TL0 = (65536-49990)%256;
n++;
if(n == 40)//24Mhz
{
n = 0;
Sec++;
refreshflag = 1;
if(Sec == 60)
{
Sec = 0;
Min++;
if(Min == 60)
{
Min = 0;
Hour++;
if(Hour == 12)
Hour = 0;
}
}
}
}
复制代码
全部资料51hei下载地址:
基于51单片机和Proteus仿真的模拟时钟设计.zip
(86.8 KB, 下载次数: 57)
2019-5-9 17:19 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1