仿真原理圖如下(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
|