找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2791|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机+LCD12864和Proteus仿真的模拟时钟程序设计

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

  1. #include <AT89X52.H>
  2. #include<intrins.h>
  3. #include<math.h>


  4. #ifndef BIT
  5. #define BIT(x)                (1 << (x))
  6. #endif
  7. #define DBPort                P0
  8. #define DISP_OFF        0x3e                //关显示
  9. #define DISP_ON                0x3f                //开显示
  10. #define DISP_Y                0xc0                //起始行
  11. #define DISP_PAGE        0xb8                //起始页
  12. #define DISP_X                0x40                //起始列

  13. unsigned char code AsciiDot[] =              // ASCII
  14. {
  15.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -

  16.         0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // -!-

  17.         0x00,0x0E,0x02,0x00,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // -"-

  18.         0x00,0x50,0xF8,0x56,0xF8,0x56,0x00,0x03,0x00,0x03,0x00,0x00, // -#-

  19.         0x00,0xD8,0xA4,0xA6,0x64,0x00,0x00,0x00,0x00,0x03,0x00,0x00, // -$-

  20.         0x00,0x24,0x2A,0xA4,0x50,0x90,0x00,0x00,0x00,0x00,0x01,0x00, // -%-

  21.         0x00,0xC0,0x30,0x48,0x88,0x40,0x00,0x00,0x01,0x01,0x00,0x01, // -&-

  22.         0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -'-

  23.         0x00,0x00,0x00,0xF8,0x06,0x00,0x00,0x00,0x00,0x01,0x06,0x00, // -(-

  24.         0x00,0x00,0x06,0xF8,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00, // -)-

  25.         0x00,0x04,0x34,0x0E,0x34,0x04,0x00,0x00,0x00,0x00,0x00,0x00, // -*-

  26.         0x20,0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00, // -+-

  27.         0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x06,0x03,0x00,0x00, // -,-

  28.         0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // ---

  29.         0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, // -.-

  30.         0x00,0x00,0x80,0x60,0x18,0x06,0x00,0x02,0x01,0x00,0x00,0x00, // -/-

  31.     0x00,0xFC,0x0A,0x32,0x42,0xFC,0x00,0x00,0x01,0x01,0x01,0x00, // -0-

  32.         0x00,0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -1-

  33.         0x00,0x04,0x82,0x42,0x22,0x9C,0x00,0x01,0x01,0x01,0x01,0x01, // -2-

  34.         0x00,0x84,0x02,0x12,0x12,0xEC,0x00,0x00,0x01,0x01,0x01,0x00, // -3-

  35.         0x00,0x60,0x58,0x44,0xFE,0x40,0x00,0x00,0x00,0x00,0x01,0x00, // -4-

  36.         0x00,0x9E,0x12,0x12,0x12,0xE2,0x00,0x00,0x01,0x01,0x01,0x00, // -5-

  37.         0x00,0xF8,0x14,0x12,0x12,0xE2,0x00,0x00,0x01,0x01,0x01,0x00, // -6-

  38.         0x00,0x06,0x02,0xC2,0x32,0x0E,0x00,0x00,0x00,0x01,0x00,0x00, // -7-

  39.         0x00,0xEC,0x12,0x12,0x12,0xEC,0x00,0x00,0x01,0x01,0x01,0x00, // -8-

  40.         0x00,0x1C,0x22,0x22,0xA2,0x7C,0x00,0x01,0x01,0x01,0x00,0x00, // -9-

  41.         0x00,0x00,0x98,0x98,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, // -:-

  42.         0x00,0x00,0x00,0x98,0x98,0x00,0x00,0x00,0x03,0x01,0x00,0x00, // -;-

  43.         0x20,0x50,0x50,0x88,0x04,0x04,0x00,0x00,0x00,0x00,0x01,0x01, // -<-

  44.         0x00,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, // -=-

  45.         0x04,0x04,0x88,0x50,0x50,0x20,0x01,0x01,0x00,0x00,0x00,0x00, // ->-

  46.         0x00,0x00,0x08,0x44,0x24,0x18,0x00,0x00,0x01,0x01,0x00,0x00, // -?-

  47.         0x00,0xFE,0x01,0x31,0x49,0x7E,0x00,0x01,0x02,0x02,0x02,0x01, // -@-

  48.         0xC0,0x78,0x46,0x78,0xC0,0x00,0x01,0x01,0x00,0x01,0x01,0x01, // -A-

  49.         0x02,0xFE,0x12,0x12,0x12,0xEC,0x01,0x01,0x01,0x01,0x01,0x00, // -B-

  50.         0x78,0x84,0x02,0x02,0x02,0x86,0x00,0x00,0x01,0x01,0x01,0x00, // -C-

  51.         0x02,0xFE,0x02,0x02,0x84,0x78,0x01,0x01,0x01,0x01,0x00,0x00, // -D-

  52.         0x02,0xFE,0x12,0x3A,0x02,0x86,0x01,0x01,0x01,0x01,0x01,0x01, // -LCDEN-

  53.         0x02,0xFE,0x12,0x3A,0x02,0x06,0x01,0x01,0x01,0x00,0x00,0x00, // -F-

  54.         0x78,0x84,0x02,0x02,0x22,0xE6,0x00,0x00,0x01,0x01,0x01,0x00, // -G-

  55.         0x02,0xFE,0x12,0x10,0x12,0xFE,0x01,0x01,0x01,0x00,0x01,0x01, // -H-

  56.         0x00,0x02,0xFE,0x02,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -I-

  57.         0x00,0x02,0xFE,0x02,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, // -J-

  58.         0x02,0xFE,0x12,0x28,0x46,0x82,0x01,0x01,0x01,0x00,0x01,0x01, // -K-

  59.         0x02,0xFE,0x02,0x00,0x00,0x80,0x01,0x01,0x01,0x01,0x01,0x01, // -L-

  60.         0x02,0xFE,0x04,0x18,0x04,0xFE,0x01,0x01,0x01,0x00,0x01,0x01, // -M-

  61.         0x02,0xFE,0x08,0x30,0x42,0xFE,0x01,0x01,0x01,0x00,0x00,0x01, // -N-

  62.         0x00,0xFC,0x02,0x02,0x02,0xFC,0x00,0x00,0x01,0x01,0x01,0x00, // -O-

  63.         0x02,0xFE,0x22,0x22,0x22,0x1C,0x01,0x01,0x01,0x00,0x00,0x00, // -P-

  64.         0x00,0xFC,0x02,0x02,0x02,0xFC,0x00,0x00,0x01,0x03,0x05,0x04, // -Q-

  65.         0x02,0xFE,0x12,0x32,0xD2,0x0C,0x01,0x01,0x01,0x00,0x01,0x01, // -R-

  66.         0x00,0x8C,0x12,0x22,0xC6,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -S-

  67.         0x06,0x02,0xFE,0x02,0x06,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -T-

  68.         0x02,0xFE,0x02,0x00,0x02,0xFE,0x00,0x00,0x01,0x01,0x01,0x00, // -U-

  69.         0x02,0x0E,0x72,0x80,0x72,0x0E,0x00,0x00,0x00,0x01,0x00,0x00, // -V-

  70.         0x02,0xFE,0x02,0xF0,0x02,0xFE,0x00,0x00,0x01,0x00,0x01,0x00, // -W-

  71.         0x02,0x86,0x48,0x30,0x48,0x86,0x01,0x01,0x00,0x00,0x00,0x01, // -X-

  72.         0x02,0x06,0x1A,0xE0,0x1A,0x06,0x00,0x00,0x01,0x01,0x01,0x00, // -Y-

  73.         0x86,0x42,0x32,0x0A,0x06,0x82,0x01,0x01,0x01,0x01,0x01,0x01, // -Z-

  74.         0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x00, // -[-

  75.         0x00,0x02,0x1C,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0x00, // -\-

  76.         0x00,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x04,0x07,0x00, // -]-

  77.         0x00,0x10,0x08,0x06,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00, // -^-

  78.         0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08, // -_-

  79.         0x00,0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -`-

  80.         0x80,0x50,0x50,0xE0,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x00, // -a-

  81.         0x02,0xFE,0x10,0x10,0xE0,0x00,0x01,0x01,0x01,0x01,0x00,0x00, // -b-

  82.         0x00,0xE0,0x10,0x10,0x30,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -c-

  83.         0x00,0xE0,0x10,0x12,0xFE,0x00,0x00,0x00,0x01,0x01,0x00,0x01, // -d-

  84.         0x00,0xE0,0x50,0x50,0x60,0x00,0x00,0x00,0x01,0x01,0x01,0x00, // -LCDEN-

  85.         0x00,0x10,0xFC,0x12,0x02,0x06,0x00,0x01,0x01,0x01,0x00,0x00, // -f-

  86.         0xA0,0x50,0x50,0x30,0x10,0x00,0x03,0x05,0x05,0x05,0x02,0x00, // -g-

  87.         0x02,0xFE,0x20,0x10,0xF0,0x00,0x01,0x01,0x01,0x00,0x01,0x01, // -h-

  88.         0x00,0x10,0xF2,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -i-

  89.         0x00,0x10,0xF2,0x00,0x00,0x00,0x04,0x04,0x03,0x00,0x00,0x00, // -j-

  90.         0x02,0xFE,0x40,0xB0,0x10,0x00,0x01,0x01,0x00,0x01,0x01,0x00, // -k-

  91.         0x00,0x02,0xFE,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -l-

  92.         0x10,0xE0,0x10,0xE0,0x10,0xE0,0x01,0x01,0x00,0x01,0x00,0x01, // -m-

  93.         0x10,0xF0,0x20,0x10,0xF0,0x00,0x01,0x01,0x01,0x00,0x01,0x01, // -n-

  94.         0xE0,0x10,0x10,0x10,0xE0,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -o-

  95.         0x10,0xF0,0x10,0x10,0xE0,0x00,0x04,0x07,0x05,0x01,0x00,0x00, // -p-

  96.         0x00,0xE0,0x10,0x10,0xF0,0x00,0x00,0x00,0x01,0x05,0x07,0x04, // -q-

  97.         0x00,0x10,0xF0,0x20,0x10,0x00,0x00,0x01,0x01,0x01,0x00,0x00, // -r-

  98.         0x00,0x20,0x50,0xD0,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, // -s-

  99.         0x00,0x10,0xFC,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // -t-

  100.         0x10,0xF0,0x00,0x10,0xF0,0x00,0x00,0x00,0x01,0x01,0x00,0x01, // -u-

  101.         0x10,0x70,0x80,0x50,0x30,0x00,0x00,0x00,0x01,0x00,0x00,0x00, // -v-

  102.         0xF0,0x00,0xE0,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0x00, // -w-

  103.         0x10,0xB0,0x40,0xB0,0x10,0x00,0x01,0x01,0x00,0x01,0x01,0x00, // -x-

  104.         0x10,0x70,0x80,0xD0,0x30,0x10,0x00,0x04,0x03,0x00,0x00,0x00, // -y-

  105.         0x30,0x90,0x50,0x30,0x90,0x00,0x01,0x01,0x01,0x01,0x01,0x00, // -z-

  106.         0x00,0x00,0x40,0xBC,0x02,0x00,0x00,0x00,0x00,0x03,0x04,0x00, // -{-

  107.         0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, // -|-

  108.         0x00,0x00,0x02,0xBC,0x40,0x00,0x00,0x00,0x04,0x03,0x00,0x00, // -}-

  109.         0x00,0x40,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // -~-

  110.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --
  111. };

  112. typedef struct typFNT_GB12                 // 汉字字模数据结构
  113. {
  114.        unsigned char Index[2];               // 汉字内码索引
  115.        unsigned char Msk[24];                       // 点阵码数据
  116. };

  117. struct typFNT_GB12 code GB_12[] =          // 数据表
  118. {
  119. "模", 0xC4,0x34,0xFF,0x24,0x02,0x7A,0x5F,0xDA,0x6F,0x7A,0x02,0x00,
  120.       0x00,0x00,0x07,0x00,0x05,0x05,0x03,0x01,0x03,0x05,0x05,0x00,

  121. "拟", 0x44,0x24,0xFF,0x14,0x00,0xFE,0x81,0x46,0x00,0xFF,0x00,0x00,
  122.       0x04,0x04,0x07,0x00,0x04,0x05,0x04,0x02,0x01,0x01,0x06,0x00,

  123. "时", 0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,
  124.       0x03,0x01,0x01,0x03,0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,

  125. "钟", 0x58,0x4F,0xFA,0x4A,0x42,0x7C,0x44,0x44,0xFF,0x44,0x7C,0x00,
  126.       0x00,0x00,0x07,0x02,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,

  127. "潘", 0x09,0xD2,0x40,0x29,0xDB,0x4D,0xFF,0x4D,0x5B,0xE9,0x48,0x00,
  128.       0x01,0x07,0x00,0x00,0x07,0x05,0x07,0x05,0x05,0x07,0x00,0x00,

  129. "忠", 0x00,0x1E,0x12,0x92,0x52,0xBF,0x12,0x12,0x12,0x9E,0x00,0x00,
  130.       0x04,0x03,0x00,0x07,0x04,0x04,0x05,0x04,0x07,0x00,0x03,0x00,

  131. "伟", 0x10,0x08,0xFF,0x22,0x2A,0x2A,0xFF,0x2A,0x2A,0x2A,0xE2,0x00,
  132.       0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x02,0x01,0x00,

  133. "制", 0x18,0xD6,0x54,0xFF,0x54,0x56,0xD4,0x00,0xFC,0x00,0xFF,0x00,
  134.       0x00,0x03,0x00,0x07,0x00,0x02,0x03,0x00,0x04,0x04,0x07,0x00,

  135. "作", 0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,
  136.       0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00,

  137. };
  138. /////////////////////////////////////////////////////////////////////////
  139. // Bitmap点阵数据表                                                    //
  140. // 图片: D:\..\未标题-2.bmp,纵向取模下高位,数据排列:从左到右从上到下   //
  141. // 图片尺寸: 120 * 16                                                  //
  142. /////////////////////////////////////////////////////////////////////////
  143. unsigned char code nBitmapDot[] =                  // 数据表
  144. {
  145.       0x44,0x24,0xFF,0x14,0x00,0xFE,0x81,0x46,0x00,0xFF,0x00,0x00,
  146.       0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,
  147.       0x58,0x4F,0xFA,0x4A,0x42,0x7C,0x44,0x44,0xFF,0x44,0x7C,0x00,
  148.       0x09,0xD2,0x40,0x29,0xDB,0x4D,0xFF,0x4D,0x5B,0xE9,0x48,0x00,
  149.       0x00,0x1E,0x12,0x92,0x52,0xBF,0x12,0x12,0x12,0x9E,0x00,0x00,
  150.       0x10,0x08,0xFF,0x22,0x2A,0x2A,0xFF,0x2A,0x2A,0x2A,0xE2,0x00,
  151.       0x18,0xD6,0x54,0xFF,0x54,0x56,0xD4,0x00,0xFC,0x00,0xFF,0x00,
  152.       0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,
  153.       0x0A,0x92,0x62,0x9E,0x02,0x18,0x87,0x74,0x84,0x14,0x0C,0x00,
  154.       0x08,0xF9,0x02,0x00,0xFE,0x42,0x41,0xFE,0x02,0x82,0xFE,0x00,
  155.       0x04,0x04,0x07,0x00,0x04,0x05,0x04,0x02,0x01,0x01,0x06,0x00,
  156.       0x03,0x01,0x01,0x03,0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,
  157.       0x00,0x00,0x07,0x02,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
  158.       0x01,0x07,0x00,0x00,0x07,0x05,0x07,0x05,0x05,0x07,0x00,0x00,
  159.       0x04,0x03,0x00,0x07,0x04,0x04,0x05,0x04,0x07,0x00,0x03,0x00,
  160.       0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x02,0x02,0x01,0x00,
  161.       0x00,0x03,0x00,0x07,0x00,0x02,0x03,0x00,0x04,0x04,0x07,0x00,
  162.       0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00,
  163.       0x02,0x01,0x00,0x04,0x05,0x02,0x01,0x00,0x01,0x02,0x04,0x00,
  164.       0x06,0x01,0x02,0x02,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x00
  165. };
  166. #define CLK_X        95//时钟中心点坐标
  167. #define CLK_Y        31


  168. //秒针结束点坐标,起点坐标(x0,y0)=(31,31);
  169. unsigned char code secondpointerx[]=//x1
  170. {
  171. //0-15秒
  172. 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,
  173. CLK_X+19,CLK_X+20,CLK_X+21,CLK_X+21,CLK_X+21,CLK_X+22,
  174. //16-30秒
  175. 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,
  176. CLK_X+ 9,CLK_X+ 7,CLK_X+ 4,CLK_X+ 2,CLK_X+ 0,
  177. //31-45秒
  178. 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,
  179. CLK_X-20,CLK_X-21,CLK_X-21,CLK_X-21,CLK_X-22,
  180. //46-59秒
  181. 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,
  182. CLK_X- 9,CLK_X- 7,CLK_X- 4,CLK_X- 2,

  183. };
  184. unsigned char code secondpointery[]=//y1
  185. {
  186. //0-15秒
  187. 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,
  188. CLK_Y-11,CLK_Y- 9,CLK_Y- 7,CLK_Y- 4,CLK_Y- 2,CLK_Y- 0,
  189. //16-30秒
  190. 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,
  191. CLK_Y+20,CLK_Y+21,CLK_Y+21,CLK_Y+22,CLK_Y+22,
  192. //31-45秒
  193. 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,
  194. CLK_Y+ 9,CLK_Y+ 7,CLK_Y+ 4,CLK_Y+ 2,CLK_Y+ 0,
  195. //46-59秒
  196. 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,
  197. CLK_Y-20,CLK_Y-21,CLK_Y-21,CLK_Y-22,

  198. };

  199. //分针结束点坐标,起点坐标(x0,y0)=(31,31);
  200. unsigned char code minpointerx[]=//x1
  201. {
  202. //0-15分
  203. 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,
  204. CLK_X+16,CLK_X+17,CLK_X+18,CLK_X+19,CLK_X+20,CLK_X+20,
  205. //16-30分
  206. 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,
  207. CLK_X+ 8,CLK_X+ 6,CLK_X+ 4,CLK_X+ 2,CLK_X+ 0,
  208. //31-45分
  209. 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,
  210. CLK_X-17,CLK_X-18,CLK_X-19,CLK_X-20,CLK_X-20,
  211. //46-59分
  212. 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,
  213. CLK_X- 8,CLK_X- 6,CLK_X- 4,CLK_X- 2,
  214. };
  215. unsigned char code minpointery[]=//y1
  216. {
  217. //0-15分
  218. 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,
  219. CLK_Y- 9,CLK_Y- 8,CLK_Y- 6,CLK_Y- 4,CLK_Y- 2,CLK_Y- 0,
  220. //16-30分
  221. 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,
  222. CLK_Y+17,CLK_Y+18,CLK_Y+19,CLK_Y+20,CLK_Y+20,
  223. //31-45分
  224. 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,
  225. CLK_Y+ 8,CLK_Y+ 6,CLK_Y+ 4,CLK_Y+ 2,CLK_Y+ 0,
  226. //46-59分
  227. 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,
  228. CLK_Y-17,CLK_Y-18,CLK_Y-19,CLK_Y-20,
  229. };

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

  231. unsigned char code hourpointerx[]=//x1
  232. {
  233. 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,
  234. CLK_X+14,CLK_X+14,CLK_X+15,CLK_X+16,CLK_X+16,CLK_X+16,

  235. 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,
  236. CLK_X+ 6,CLK_X+ 5,CLK_X+ 3,CLK_X+ 1,CLK_X+ 0,

  237. 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,
  238. CLK_X-14,CLK_X-15,CLK_X-16,CLK_X-16,CLK_X-16,

  239. 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,
  240. CLK_X- 6,CLK_X- 5,CLK_X- 3,CLK_X- 1,

  241. };
  242. unsigned char code hourpointery[]=//y1
  243. {
  244. 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,
  245. CLK_Y- 8,CLK_Y- 6,CLK_Y- 5,CLK_Y- 3,CLK_Y- 1,CLK_Y- 0,

  246. 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,
  247. CLK_Y+14,CLK_Y+15,CLK_Y+16,CLK_Y+16,CLK_Y+16,

  248. 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,
  249. CLK_Y+ 8,CLK_Y+ 6,CLK_Y+ 5,CLK_Y+ 3,CLK_Y+ 1,CLK_Y+ 0,

  250. 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,
  251. CLK_Y-14,CLK_Y-15,CLK_Y-16,CLK_Y-16,
  252. };
  253. unsigned char code clkbmp[]=//时钟图
  254. {
  255.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x60,0x20,0x30,
  256.       0x38,0xC8,0x0C,0x04,0x04,0x06,0x02,0x02,0x02,0x03,0x01,0x01,0x21,0xF1,0x01,0x07,
  257.       0x21,0x91,0x51,0x21,0x01,0x03,0x02,0x02,0x02,0x06,0x04,0x04,0x0C,0xC8,0x38,0x30,
  258.       0x20,0x60,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  259.       0x00,0x00,0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,
  260.       0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,
  261.       0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
  262.       0x00,0x00,0x00,0x00,0x01,0x03,0x06,0x1C,0x30,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,
  263.       0x00,0xE0,0x3C,0x07,0x01,0x01,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  264.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  265.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  266.       0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x02,0x01,0x01,0x07,0x3C,0xE0,0x00,0x00,
  267.       0xFE,0x83,0x80,0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  268.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,
  269.       0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  270.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x40,0x00,0x80,0x83,0xFE,0x00,
  271.       0x3F,0xE0,0x00,0x00,0x00,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  272.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,
  273.       0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  274.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01,0x00,0x00,0xE0,0x3F,0x00,
  275.       0x00,0x03,0x1E,0x70,0xC0,0xC0,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  276.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  277.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  278.       0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x20,0xC0,0xC0,0x70,0x1E,0x03,0x00,0x00,
  279.       0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x1C,0x30,0x60,0xC0,0x80,0x80,0x00,0x00,0x00,
  280.       0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,
  281.       0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x00,
  282.       0x00,0x00,0x80,0x80,0xC0,0x60,0x30,0x1C,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
  283.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x06,
  284.       0x0E,0x09,0x18,0x10,0x10,0x30,0x20,0x20,0x20,0x60,0x40,0x40,0x40,0x40,0x43,0x75,
  285.       0x45,0x42,0x40,0x40,0x40,0x60,0x20,0x20,0x20,0x30,0x10,0x10,0x18,0x09,0x0E,0x06,
  286.       0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  287. };

  288. sbit LCDRW                = P1^3;
  289. sbit LCDEN                = P1^4;
  290. sbit LCDRS                = P1^5;

  291. sbit LCDCS1        = P1^7;
  292. sbit LCDCS2        = P1^6;



  293. //时间初始值
  294. unsigned char Hour = 9;
  295. unsigned char Min = 9;
  296. unsigned char Sec = 30;
  297. unsigned char xdata dispbuf[8][128];//1024Byte用于存放显示数据

  298. bit refreshflag = 1;//显示刷新标志,每一秒送一次显示数据

  299. unsigned char getState(void)
  300. {
  301.         unsigned char temp;
  302.         DBPort = 0xFF;
  303.         LCDEN=0;
  304.         LCDRS=0;
  305.         LCDRW=1;
  306.         LCDEN=1;
  307.         _nop_();
  308.         LCDEN=0;
  309.         temp = DBPort;
  310.         return temp;
  311. }
  312. void WaiteBusy()
  313. {
  314.         unsigned char temp;
  315.         while(1)
  316.         {
  317.                 temp = getState();
  318.                 temp &= 0x80;
  319.                 if(temp == 0)
  320.                         break;
  321.         }
  322. }

  323. void WriteCmd(unsigned char cmd)                //lcd写命令
  324. {
  325.         WaiteBusy();
  326.         LCDEN=0;
  327.         LCDRW = 0;
  328.         LCDRS = 0;
  329.         DBPort = cmd;
  330.         LCDEN = 1;
  331.         _nop_();
  332.         _nop_();
  333.         LCDEN = 0;
  334. }

  335. void WriteData(unsigned char wdata)        //lcd写数据
  336. {
  337.         WaiteBusy();
  338.         LCDRS = 1;
  339.         LCDRW = 0;
  340.         DBPort = wdata;
  341.         LCDEN = 1;
  342.         _nop_();
  343.         _nop_();
  344.         LCDEN = 0;
  345. }
  346. void LcdInit()                                //lcd初始化
  347. {
  348.         LCDCS1 = 1;
  349.         LCDCS2 = 1;
  350.         WriteCmd(DISP_OFF);
  351.         WriteCmd(DISP_Y);
  352.         WriteCmd(DISP_ON);
  353. }
  354. /****************************************
  355. 函数功能:将显示缓冲区所有数据送到12864显示
  356. ****************************************/
  357. void Show()
  358. {
  359.         unsigned char i,j;
  360.         LcdInit();
  361.         for(j=0;j<8;j++)
  362.         {
  363.                 LCDCS1=1;
  364.                 LCDCS2=0;
  365.                 WriteCmd(DISP_PAGE+j);
  366.                 WriteCmd(DISP_X);
  367.                 for(i=0;i<64;i++)
  368.                         WriteData(dispbuf[j][i]);               
  369.                 LCDCS1=0;
  370.                 LCDCS2=1;
  371.                 WriteCmd(DISP_PAGE+j);
  372.                 WriteCmd(DISP_X);
  373.                 for(i=64;i<128;i++)
  374.                         WriteData(dispbuf[j][i]);        
  375.         }
  376. }

  377. void ClearBuff()//清空显存,0x00
  378. {
  379.         unsigned char i,j;
  380.         for(j=0;j<8;j++)
  381.         {
  382.                 for(i=0;i<128;i++)
  383.                         dispbuf[j][i] = 0x00;
  384.         }               
  385. }
  386. void ClearScreen()                //清屏
  387. {
  388.         ClearBuff();
  389.         Show();
  390. }
  391. /*********************************************
  392. 函数功能:drawflag = 1:在12864任意位置画点
  393.                   drawflag = 0:在12864任意位置清除点

  394. *********************************************/
  395. void DrawPixel(unsigned char x,unsigned char y,bit drawflag)
  396. {
  397.         unsigned char a,b;
  398.         a = y/0x08;
  399.         b = y&0x07;
  400.         if(drawflag)
  401.                 dispbuf[a][x] |= BIT(b);
  402.         else
  403.                 dispbuf[a][x] &= ~BIT(b);               
  404. }

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

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


  411. **输        出:无
  412.                                 坐标如图所示
  413. ----------------------------
  414. |(0,0)                                (127,0)|
  415. |                                                   |
  416. |                                                   |
  417. |                                                   |
  418. |                                                   |
  419. |                                                   |
  420. |                                                   |
  421. |(0,63)                           (127,63)|
  422. ----------------------------

  423. *******************************************************************************/

  424. void Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
  425. {

  426. //使用Bresenham算法画直线
  427.         char dx,dy,x_increase,y_increase;
  428.         int error;
  429.         unsigned char x,y;
  430.         unsigned char i;
  431.         dx = x1-x0;
  432.         dy = y1-y0;
  433.         if(dx>=0)//判断x增长方向
  434.                 x_increase = 1;
  435.         else
  436.                 x_increase = -1;
  437.         if(dy>=0)//判断y增长方向
  438.                 y_increase = 1;
  439.         else
  440.                 y_increase = -1;

  441.          x = x0;
  442.         y = y0;
  443.         dx = cabs(dx);
  444.         dy = cabs(dy);
  445.         if(dx > dy)
  446.         {
  447.                 error = -dx;
  448.                 for(i=0;i<dx+1;i++)
  449.                 {
  450.                         DrawPixel(x,y,1);
  451.                         x += x_increase;
  452.                         error += 2*dy;
  453.                         if(error >= 0)
  454.                         {
  455.                                 y += y_increase;
  456.                                 error -= 2*dx;
  457.                         }
  458.                 }
  459.         }
  460.         else
  461.         {
  462.                 error = -dy;
  463.                 for(i=0;i<dy+1;i++)
  464.                 {
  465.                         DrawPixel(x,y,1);
  466.                         y += y_increase;
  467.                         error += 2*dx;
  468.                         if(error >= 0)
  469.                         {
  470.                                 x += x_increase;
  471.                                 error -= 2*dy;
  472.                         }
  473.                 }
  474.         }
  475. }

  476. /*****************************************************
  477. 函数功能:指定的位置按传入的数据画一条长度为len(len=<8)点的竖线
  478. *****************************************************/
  479. void DrawVerticalLine(unsigned char x,unsigned char y,unsigned char len,unsigned char d)
  480. {
  481.         unsigned char i;
  482.         for(i=0;i<len;i++)
  483.         {
  484.                 if(d&0x01)
  485.                         DrawPixel(x,y+i,1);
  486.                 d >>= 1;
  487.         }
  488. }



  489. /*********************************************
  490. 函数功能:指定的位置显示一个12x12汉字
  491.                 x:0~127-12
  492.                 y:0~63-12
  493. *********************************************/
  494. void Print12_12CHN(unsigned char x,unsigned char y,bit cpl,struct typFNT_GB12 a)
  495. {
  496.         unsigned char i;
  497.         for(i=0;i<12;i++)
  498.         {
  499.                 if(cpl)
  500.                         DrawVerticalLine(x+i,y,8,~a.Msk[i]);
  501.                 else
  502.                         DrawVerticalLine(x+i,y,8,a.Msk[i]);                                
  503.         }

  504.         for(i=0;i<12;i++)
  505.         {
  506.                 if(cpl)
  507.                         DrawVerticalLine(x+i,y+8,4,~a.Msk[i+12]);
  508.                 else
  509.                         DrawVerticalLine(x+i,y+8,4,a.Msk[i+12]);
  510.         }
  511. }
  512. /*********************************************
  513. 函数功能:指定的位置显示一个12x6ASCII
  514.                 x:0~127-6
  515.                 y:0~63-12
  516. *********************************************/
  517. void Print12_6En(unsigned char x,unsigned char y,bit cpl,unsigned char asc)
  518. {
  519.         unsigned char i,j;
  520.         for(j=0;j<2;j++)
  521.         {
  522.                 for(i=0;i<6;i++)
  523.                 {
  524.                         if(cpl)
  525.                                 DrawVerticalLine(x+i,y+8*j,8-4*j,~AsciiDot[(asc-0x20)*12+i+6*j]);
  526.                         else
  527.                                 DrawVerticalLine(x+i,y+8*j,8-4*j,AsciiDot[(asc-0x20)*12+i+6*j]);
  528.                 }
  529.         }
  530. }

  531. /********************************************************************************
  532. **函数功能描述:送显示数据到显存,显示12x12文字(中,英,标点,数字)
  533. **输        入:ptr字符串首地址
  534. **输        出:无
  535. **说明:在显示字符串中遇到  "\n"  输出换行;反显两个"~"中间的包括的字符如:~反显~
  536. *******************************************************************************/
  537. void BufferPrint12(unsigned char x,unsigned char y,unsigned char *ptr)
  538. {
  539.         unsigned char c1,c2,i,j;
  540.         bit cpl = 0;
  541.         for(i=0;ptr[i] != '\0';i++)
  542.         {
  543.                 c1 = ptr[i];
  544.                 c2 = ptr[i+1];
  545.                 if(c1 == '\n')//换行符
  546.                 {
  547.                         x = 0;
  548.                         y += 2;
  549.                         continue;
  550.                 }
  551.                 if(c1 == '~')//反显
  552.                 {
  553.                         cpl = !cpl;
  554.                         continue;
  555.                 }
  556.                 if(c1<128)                                                        //英文或标点
  557.                 {
  558.                         Print12_6En(6*x+4,6*y+2,cpl,c1);
  559.                         x++;
  560.                 }
  561.                 else                                                                        //中文
  562.                 {
  563.                         for(j=0;j<sizeof(GB_12)/sizeof(GB_12[0]);j++)                        //查找汉字
  564.                         {
  565.                                 if(c1 == GB_12[j].Index[0] && c2 == GB_12[j].Index[1])
  566.                                         break;
  567.                         }
  568.                         Print12_12CHN(6*x+4,6*y+2,cpl,GB_12[j]);                                                
  569.                         x += 2;
  570.                         i++;                                                                                                //汉字长度为2                        
  571.                 }
  572.         }
  573. }




  574. void WriteClkBmp(unsigned char  code *image)                //送一幅64x64点阵图像到显存
  575. {
  576.         unsigned char i,j;
  577.         for(j=0;j<8;j++)
  578.         {
  579.                 for(i=64;i<128;i++)
  580.                         dispbuf[j][i] = image[j*64+i-64];
  581.         }
  582. }
  583. void TimeDisp(unsigned char Hour,unsigned char Min,unsigned char Sec)
  584. {
  585.         unsigned char hp;
  586.         hp = Hour*5+Min/12;
  587.         WriteClkBmp(clkbmp);
  588.         Line(CLK_X,31,secondpointerx[Sec],secondpointery[Sec]);//秒针
  589.         Line(CLK_X,31,minpointerx[Min],minpointery[Min]);//分针
  590.         Line(CLK_X,31,hourpointerx[hp],hourpointery[hp]);//时针
  591. }




  592. void TimerInit()
  593. {
  594.         EA = 1;
  595.         ET0 = 1;
  596.         TMOD = 0x01;
  597.         TH0 = (65536-50000)/256;
  598.         TL0 = (65536-50000)%256;
  599.         TR0 = 1;
  600. }

  601. void main()
  602. {
  603.         TimerInit();
  604.         ClearScreen();
  605. //        BufferPrint12(0,0,"这是一个\n模拟时\n 显示实例\n proteus.\n 5d6d.com");
  606. //        BufferPrint12(0,0," 这是一\n模拟时钟\n显示程序");
  607.         while(1)
  608.         {
  609.                 TimeDisp(Hour,Min,Sec);
  610.                 if(refreshflag)
  611.                 {
  612.                         Show();
  613.                         refreshflag = 0;
  614.                 }
  615.         }
  616. }

  617. void Timer0() interrupt 1
  618. {
  619.         unsigned char n;
  620.         TH0 = (65536-49990)/256;//调整初值可使时间更加精确
  621.         TL0 = (65536-49990)%256;
  622.         n++;
  623.         if(n == 40)//24Mhz
  624.         {
  625.                 n = 0;
  626.                 Sec++;
  627.                 refreshflag = 1;
  628.                 if(Sec == 60)
  629.                 {
  630.                         Sec = 0;
  631.                         Min++;
  632.                         if(Min == 60)
  633.                         {
  634.                                 Min = 0;
  635.                                 Hour++;
  636.                                 if(Hour == 12)
  637.                                         Hour = 0;
  638.                         }
  639.                 }
  640.         }
  641. }
复制代码

全部资料51hei下载地址:
基于51单片机和Proteus仿真的模拟时钟设计.zip (86.8 KB, 下载次数: 56)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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