一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 3192|回复: 17

[其他综合] 求助 12864 无字库 时钟程序!

[复制链接]
发表于 2013-9-4 10:34 | 显示全部楼层 |阅读模式
一个12864的 时钟程序!用的是KS0108 驱动!
可显示,时钟也在走,可是开关不能调时,只有一个设置键可用,请高手看看有没有什么问题!谢谢!

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
char sec,min,hour,day,month,year,week;    //定义全局变量,秒,分,时,日,月,年和星期
bit century;                              //定义世纪位:0为20世纪,1为19世纪。
//此时初始日期为2006年8月13日,即此程序完成日期!
void delayX10ms(uint count);
sbit LCD_csa=P2^5;                   //定义左屏开关
sbit LCD_csb=P2^4;                   //定义右屏开关
sbit LCD_di=P2^1;                    //定义数据或指令,1=数据,0=指令
sbit LCD_rw=P2^2;                    //定义读或写?    1=读,  0=写   
sbit LCD_e=P2^0;                     //定义使能操作, 1=能,  0=否
sbit LCD_rst = P2^3;                  //定义复位
sbit k1 = P1^5;
sbit k2 = P1^6;
sbit k3 = P1^7;
sbit k4 = P3^2;
sfr  LCD_db=0x80;                    //定义数据端口  
/**************************************

*************************************************************************************************/
code uchar year_code[597]={
                    0x04,0xAe,0x53,    //1901
                    0x0A,0x57,0x48,    //1902
                    0x55,0x26,0xBd,    //1903
                    0x0d,0x26,0x50,    //1904
                    0x0d,0x95,0x44,    //1905
                    0x46,0xAA,0xB9,    //1906
                    0x05,0x6A,0x4d,    //1907
                    0x09,0xAd,0x42,    //1908
                    0x24,0xAe,0xB6,    //1909
                    0x04,0xAe,0x4A,    //1910
                    0x6A,0x4d,0xBe,    //1911
                    0x0A,0x4d,0x52,    //1912
                    0x0d,0x25,0x46,    //1913
                    0x5d,0x52,0xBA,    //1914
                    0x0B,0x54,0x4e,    //1915
                    0x0d,0x6A,0x43,    //1916
                    0x29,0x6d,0x37,    //1917
                    0x09,0x5B,0x4B,    //1918
                    0x74,0x9B,0xC1,    //1919
                    0x04,0x97,0x54,    //1920
                    0x0A,0x4B,0x48,    //1921
                    0x5B,0x25,0xBC,    //1922
                    0x06,0xA5,0x50,    //1923
                    0x06,0xd4,0x45,    //1924
                    0x4A,0xdA,0xB8,    //1925
                    0x02,0xB6,0x4d,    //1926
                    0x09,0x57,0x42,    //1927
                    0x24,0x97,0xB7,    //1928
                    0x04,0x97,0x4A,    //1929
                    0x66,0x4B,0x3e,    //1930
                    0x0d,0x4A,0x51,    //1931
                    0x0e,0xA5,0x46,    //1932
                    0x56,0xd4,0xBA,    //1933
                    0x05,0xAd,0x4e,    //1934
                    0x02,0xB6,0x44,    //1935
                    0x39,0x37,0x38,    //1936
                    0x09,0x2e,0x4B,    //1937
                    0x7C,0x96,0xBf,    //1938
                    0x0C,0x95,0x53,    //1939
                    0x0d,0x4A,0x48,    //1940
                    0x6d,0xA5,0x3B,    //1941
                    0x0B,0x55,0x4f,    //1942
                    0x05,0x6A,0x45,    //1943
                    0x4A,0xAd,0xB9,    //1944
                    0x02,0x5d,0x4d,    //1945
                    0x09,0x2d,0x42,    //1946
                    0x2C,0x95,0xB6,    //1947
                    0x0A,0x95,0x4A,    //1948
                    0x7B,0x4A,0xBd,    //1949
                    0x06,0xCA,0x51,    //1950
                    0x0B,0x55,0x46,    //1951
                    0x55,0x5A,0xBB,    //1952
                    0x04,0xdA,0x4e,    //1953
                    0x0A,0x5B,0x43,    //1954
                    0x35,0x2B,0xB8,    //1955
                    0x05,0x2B,0x4C,    //1956
                    0x8A,0x95,0x3f,    //1957
                    0x0e,0x95,0x52,    //1958
                    0x06,0xAA,0x48,    //1959
                    0x7A,0xd5,0x3C,    //1960
                    0x0A,0xB5,0x4f,    //1961
                    0x04,0xB6,0x45,    //1962
                    0x4A,0x57,0x39,    //1963
                    0x0A,0x57,0x4d,    //1964
                    0x05,0x26,0x42,    //1965
                    0x3e,0x93,0x35,    //1966
                    0x0d,0x95,0x49,    //1967
                    0x75,0xAA,0xBe,    //1968
                    0x05,0x6A,0x51,    //1969
                    0x09,0x6d,0x46,    //1970
                    0x54,0xAe,0xBB,    //1971
                    0x04,0xAd,0x4f,    //1972
                    0x0A,0x4d,0x43,    //1973
                    0x4d,0x26,0xB7,    //1974
                    0x0d,0x25,0x4B,    //1975
                    0x8d,0x52,0xBf,    //1976
                    0x0B,0x54,0x52,    //1977
                    0x0B,0x6A,0x47,    //1978
                    0x69,0x6d,0x3C,    //1979
                    0x09,0x5B,0x50,    //1980
                    0x04,0x9B,0x45,    //1981
                    0x4A,0x4B,0xB9,    //1982
                    0x0A,0x4B,0x4d,    //1983
                    0xAB,0x25,0xC2,    //1984
                    0x06,0xA5,0x54,    //1985
                    0x06,0xd4,0x49,    //1986
                    0x6A,0xdA,0x3d,    //1987
                    0x0A,0xB6,0x51,    //1988
                    0x09,0x37,0x46,    //1989
                    0x54,0x97,0xBB,    //1990
                    0x04,0x97,0x4f,    //1991
                    0x06,0x4B,0x44,    //1992
                    0x36,0xA5,0x37,    //1993
                    0x0e,0xA5,0x4A,    //1994
                    0x86,0xB2,0xBf,    //1995
                    0x05,0xAC,0x53,    //1996
                    0x0A,0xB6,0x47,    //1997
                    0x59,0x36,0xBC,    //1998
                    0x09,0x2e,0x50,    //1999
                    0x0C,0x96,0x45,    //2000
                    0x4d,0x4A,0xB8,    //2001
                    0x0d,0x4A,0x4C,    //2002
                    0x0d,0xA5,0x41,    //2003
                    0x25,0xAA,0xB6,    //2004
                    0x05,0x6A,0x49,    //2005
                    0x7A,0xAd,0xBd,    //2006
                    0x02,0x5d,0x52,    //2007
                    0x09,0x2d,0x47,    //2008
                    0x5C,0x95,0xBA,    //2009
                    0x0A,0x95,0x4e,    //2010
                    0x0B,0x4A,0x43,    //2011
                    0x4B,0x55,0x37,    //2012
                    0x0A,0xd5,0x4A,    //2013
                    0x95,0x5A,0xBf,    //2014
                    0x04,0xBA,0x53,    //2015
                    0x0A,0x5B,0x48,    //2016
                    0x65,0x2B,0xBC,    //2017
                    0x05,0x2B,0x50,    //2018
                    0x0A,0x93,0x45,    //2019
                    0x47,0x4A,0xB9,    //2020
                    0x06,0xAA,0x4C,    //2021
                    0x0A,0xd5,0x41,    //2022
                    0x24,0xdA,0xB6,    //2023
                    0x04,0xB6,0x4A,    //2024
                    0x69,0x57,0x3d,    //2025
                    0x0A,0x4e,0x51,    //2026
                    0x0d,0x26,0x46,    //2027
                    0x5e,0x93,0x3A,    //2028
                    0x0d,0x53,0x4d,    //2029
                    0x05,0xAA,0x43,    //2030
                    0x36,0xB5,0x37,    //2031
                    0x09,0x6d,0x4B,    //2032
                    0xB4,0xAe,0xBf,    //2033
                    0x04,0xAd,0x53,    //2034
                    0x0A,0x4d,0x48,    //2035
                    0x6d,0x25,0xBC,    //2036
                    0x0d,0x25,0x4f,    //2037
                    0x0d,0x52,0x44,    //2038
                    0x5d,0xAA,0x38,    //2039
                    0x0B,0x5A,0x4C,    //2040
                    0x05,0x6d,0x41,    //2041
                    0x24,0xAd,0xB6,    //2042
                    0x04,0x9B,0x4A,    //2043
                    0x7A,0x4B,0xBe,    //2044
                    0x0A,0x4B,0x51,    //2045
                    0x0A,0xA5,0x46,    //2046
                    0x5B,0x52,0xBA,    //2047
                    0x06,0xd2,0x4e,    //2048
                    0x0A,0xdA,0x42,    //2049
                    0x35,0x5B,0x37,    //2050
                    0x09,0x37,0x4B,    //2051
                    0x84,0x97,0xC1,    //2052
                    0x04,0x97,0x53,    //2053
                    0x06,0x4B,0x48,    //2054
                    0x66,0xA5,0x3C,    //2055
                    0x0e,0xA5,0x4f,    //2056
                    0x06,0xB2,0x44,    //2057
                    0x4A,0xB6,0x38,    //2058
                    0x0A,0xAe,0x4C,    //2059
                    0x09,0x2e,0x42,    //2060
                    0x3C,0x97,0x35,    //2061
                    0x0C,0x96,0x49,    //2062
                    0x7d,0x4A,0xBd,    //2063
                    0x0d,0x4A,0x51,    //2064
                    0x0d,0xA5,0x45,    //2065
                    0x55,0xAA,0xBA,    //2066
                    0x05,0x6A,0x4e,    //2067
                    0x0A,0x6d,0x43,    //2068
                    0x45,0x2e,0xB7,    //2069
                    0x05,0x2d,0x4B,    //2070
                    0x8A,0x95,0xBf,    //2071
                    0x0A,0x95,0x53,    //2072
                    0x0B,0x4A,0x47,    //2073
                    0x6B,0x55,0x3B,    //2074
                    0x0A,0xd5,0x4f,    //2075
                    0x05,0x5A,0x45,    //2076
                    0x4A,0x5d,0x38,    //2077
                    0x0A,0x5B,0x4C,    //2078
                    0x05,0x2B,0x42,    //2079
                    0x3A,0x93,0xB6,    //2080
                    0x06,0x93,0x49,    //2081
                    0x77,0x29,0xBd,    //2082
                    0x06,0xAA,0x51,    //2083
                    0x0A,0xd5,0x46,    //2084
                    0x54,0xdA,0xBA,    //2085
                    0x04,0xB6,0x4e,    //2086
                    0x0A,0x57,0x43,    //2087
                    0x45,0x27,0x38,    //2088
                    0x0d,0x26,0x4A,    //2089
                    0x8e,0x93,0x3e,    //2090
                    0x0d,0x52,0x52,    //2091
                    0x0d,0xAA,0x47,    //2092
                    0x66,0xB5,0x3B,    //2093
                    0x05,0x6d,0x4f,    //2094
                    0x04,0xAe,0x45,    //2095
                    0x4A,0x4e,0xB9,    //2096
                    0x0A,0x4d,0x4C,    //2097
                    0x0d,0x15,0x41,    //2098
                    0x2d,0x92,0xB5,    //2099
};
unsigned char code hz[]={
/*--  文字:  十  --0*/
/*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  一  --1*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  二  --2*/
0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x18,0x18,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,
/*--  文字:  三  --3*/
0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x98,0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x10,0x11,0x11,0x11,0x19,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
/*--  文字:  四  --4*/
0x00,0x70,0xF0,0x90,0x10,0xF0,0xF0,0x10,0xF8,0xF8,0x88,0x88,0xF8,0xF8,0x00,0x00,
0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x0C,0x0F,0x07,0x00,
/*--  文字:  五  --5*/
0x00,0x00,0x00,0x80,0x88,0x88,0xF8,0x7C,0x44,0x44,0xC4,0xC4,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x18,0x1F,0x0F,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,
/*--  文字:  六  --6*/
0x00,0x40,0x40,0x40,0x40,0x40,0x44,0x4C,0x68,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x10,0x10,0x18,0x0C,0x06,0x02,0x00,0x01,0x03,0x06,0x1C,0x18,0x00,0x00,
/*--  文字:  七  --7*/
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x80,0xC0,0x40,0x60,0x20,0x20,0x20,0x00,
0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x0F,0x1F,0x10,0x10,0x10,0x10,0x1C,0x1C,0x00,
/*--  文字:  八  --8*/
0x00,0x00,0x00,0x00,0xC0,0xC4,0x0C,0x38,0x70,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0E,0x0C,0x08,
/*--  文字:  九  --9*/
0x00,0x40,0x40,0x40,0x40,0xC0,0xFE,0x3E,0x20,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x30,0x18,0x0E,0x07,0x01,0x00,0x1F,0x3F,0x20,0x20,0x20,0x20,0x3C,
/*--  文字:  初  --10*/
0x00,0x20,0x20,0xA0,0xF0,0xF2,0xB6,0x84,0x20,0x20,0xE0,0xF0,0x10,0xF0,0xF0,0x00,
0x00,0x04,0x06,0x03,0x01,0x3F,0x3F,0x13,0x1A,0x0C,0x07,0x0B,0x18,0x18,0x1F,0x07,
/*--  文字:  廿  --11*/
0x80,0x80,0x80,0x80,0xB8,0xF8,0xC0,0x40,0x40,0xC0,0xFE,0x3E,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x08,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,
/*--  文字:  鼠  --12*/
0x00,0x00,0x00,0x1C,0x7C,0x76,0xD3,0xEB,0xAA,0xBA,0xBE,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x3F,0x1F,0x15,0x3F,0x3F,0x1A,0x0B,0x0F,0x1C,0x30,0x78,0x78,
/*--  文字:  牛  --13*/
0x00,0x00,0x00,0x40,0x78,0x38,0x10,0xFF,0xFF,0x88,0x88,0x88,0x88,0x80,0x80,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  虎  --14*/
0x00,0x00,0x00,0xF0,0xF0,0x50,0x50,0xFF,0xFF,0xAA,0xAA,0xDA,0xD8,0x08,0x00,0x00,
0x00,0x40,0x60,0x38,0x5F,0x47,0x60,0x3C,0x1E,0x02,0x3E,0x7E,0x40,0x40,0x40,0x78,
/*--  文字:  兔  --*/
0x00,0x00,0x00,0xF0,0xF8,0x2C,0xE7,0xF7,0xBC,0xDC,0xF4,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x20,0x31,0x19,0x0F,0x07,0x1F,0x3F,0x22,0x26,0x24,0x20,0x20,0x3C,
/*--  文字:  龙  --16*/
0x00,0x00,0x20,0x20,0x20,0xE0,0xFE,0xDE,0xD0,0x10,0x12,0xD6,0xC4,0x00,0x00,0x00,
0x00,0x20,0x30,0x18,0x0C,0x07,0x13,0x18,0x1F,0x3F,0x26,0x23,0x21,0x20,0x20,0x3C,
/*--  文字:  蛇  --17*/
0x00,0xE0,0xE0,0xFC,0xFC,0xF0,0xF0,0x60,0x60,0xA2,0xB6,0x14,0x90,0xB0,0x30,0x00,
0x00,0x08,0x09,0x09,0x0F,0x07,0x06,0x06,0x04,0x00,0x1F,0x3F,0x23,0x21,0x20,0x3C,
/*--  文字:  马  --18*/
0x00,0x00,0x00,0x00,0x84,0xF4,0x74,0x86,0xE2,0xFE,0x9E,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x08,0x08,0x08,0x09,0x0D,0x05,0x05,0x04,0x24,0x64,0x60,0x3F,0x1F,0x00,
/*--  文字:  羊  --19*/
0x00,0x00,0x00,0x00,0x10,0x52,0x56,0xFC,0xFC,0x2F,0x2B,0x09,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,
/*--  文字:  猴  --20*/
0x00,0x44,0x6C,0xF8,0xFC,0x6C,0xF8,0xFE,0xE6,0xE8,0xBC,0xDC,0x5C,0x50,0x10,0x00,
0x00,0x04,0x16,0x33,0x3F,0x1F,0x00,0x3F,0x3F,0x33,0x1A,0x0F,0x0F,0x19,0x31,0x21,
/*--  文字:  鸡  --21*/
0x00,0x50,0xD0,0x98,0xC8,0xF8,0x38,0xF8,0xF8,0x2F,0x67,0x7C,0x7C,0x00,0x00,0x00,
0x00,0x08,0x0C,0x06,0x03,0x13,0x16,0x14,0x13,0x1B,0x0A,0x0B,0x49,0x49,0x7F,0x3F,
/*--  文字:  狗  --22*/
0x00,0x40,0x44,0x6C,0xB8,0xFE,0xEE,0x60,0xB8,0x9E,0x96,0x10,0x10,0xF0,0xF0,0x00,
0x00,0x04,0x04,0x06,0x13,0x31,0x3F,0x1F,0x03,0x03,0x03,0x13,0x30,0x30,0x1F,0x0F,
/*--  文字:  猪  --23*/
0x00,0x44,0x6C,0xB8,0xFC,0xEC,0x40,0x50,0xFE,0xFE,0x68,0x30,0x38,0x28,0x20,0x20,
0x00,0x04,0x06,0x13,0x31,0x3F,0x1F,0x06,0x3F,0x3F,0x15,0x15,0x3F,0x3F,0x00,0x00,
/*--  文字:  年  --24*/
0x00,0x00,0x00,0x10,0xF8,0xEC,0x27,0x27,0xFC,0xFE,0x12,0x12,0x10,0x00,0x00,0x00,
0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x01,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,
/*--  文字:  月  --25*/
0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xB6,0x92,0x92,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x01,0x10,0x30,0x3F,0x1F,0x00,0x00,0x00,
/*--  文字:  日  --26*/
0x00,0x00,0x00,0x00,0xF8,0xF8,0x88,0xCC,0x44,0x44,0xFC,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0C,0x04,0x04,0x0C,0x0F,0x0F,0x00,0x00,0x00,
/*--  文字:  周  --27*/
0x00,0x00,0x00,0xFC,0xFC,0xA4,0xA4,0xFE,0x7A,0x52,0x52,0x42,0xFE,0xFE,0x00,0x00,
0x00,0x40,0x60,0x38,0x1F,0x07,0x06,0x0E,0x0B,0x09,0x0F,0x27,0x60,0x7F,0x3F,0x00,
};
unsigned char code number[]={
/*--  文字:  0  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*--  文字:  1  --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*--  文字:  2  --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*--  文字:  3  --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  4  --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字:  5  --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  6  --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  7  --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*--  文字:  8  --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*--  文字:  9  --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*--  文字:  :  --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
};
//*--  调入了一幅图像:漂亮女孩看过来----猪猪  --*/
/*--  宽度x高度=64x64  --*/
unsigned char code bmp208[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x02,0x10,0x01,0x00,0x00,0x00,0x00,
0xC8,0x1F,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x80,0x01,0x00,0x38,
0x74,0x14,0xF5,0x07,0x60,0x01,0x00,0x3C,0x54,0x0D,0x5D,0x05,0x10,0xF1,0x00,0x3E,
0x7C,0x05,0x57,0x05,0x8C,0x0C,0x03,0x37,0x54,0x15,0x55,0x05,0x82,0x02,0x84,0x23,
0x7C,0x1D,0x55,0x05,0x41,0x01,0xC8,0x00,0x54,0x05,0xD5,0x87,0xA0,0xE0,0xD0,0x07,
0x74,0x0D,0x11,0x40,0x60,0x10,0x55,0x08,0x04,0x14,0x10,0x40,0x18,0x08,0x2A,0x17,
0x00,0x00,0x00,0x40,0x80,0x09,0x34,0x2D,0x88,0x11,0x11,0x84,0x44,0x12,0x24,0x0D,
0x88,0x10,0x16,0x82,0x22,0x94,0x49,0x07,0xE8,0x08,0xF0,0x41,0x22,0x97,0x49,0x03,
0xA8,0x06,0x04,0x42,0x44,0x2B,0x90,0x01,0xA8,0x02,0x14,0x44,0x80,0x29,0x90,0x03,
0xAC,0x02,0x64,0x44,0x01,0x28,0x93,0x03,0xA8,0x02,0x04,0xC5,0x84,0x21,0x93,0x01,
0xA8,0x1E,0x04,0x45,0x42,0x12,0x48,0x03,0xE8,0x10,0xFF,0x45,0x22,0x14,0x48,0x07,
0x88,0x10,0x04,0x44,0x24,0x17,0x64,0x0D,0x88,0x1D,0x04,0x44,0x40,0x23,0x53,0x0D,
0x00,0x00,0x00,0x40,0x8C,0xC1,0x40,0x07,0x10,0x13,0x20,0x82,0x30,0xE0,0x20,0x20,
0xF0,0x0A,0x22,0x82,0x42,0x10,0x21,0x10,0x1C,0x04,0x2A,0x01,0x81,0x00,0x50,0x08,
0xF0,0x0B,0xB2,0x80,0x80,0x00,0xD0,0x07,0x10,0x00,0x62,0x80,0x00,0x01,0xC8,0x00,
0x10,0x1F,0xFF,0x87,0x00,0x03,0x8C,0x23,0x10,0x11,0x62,0x80,0x00,0x0D,0x03,0x37,
0xFC,0x11,0xB2,0x00,0x07,0xF2,0x00,0x3E,0x10,0x11,0x2A,0x01,0x78,0x02,0x3C,0x20,
0x10,0x11,0x22,0x02,0x80,0x03,0x42,0x20,0x10,0x1F,0x20,0x02,0x00,0x00,0x99,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x10,0x10,0x00,0x00,0x00,0x00,0x01,0x02,
0xF0,0x0B,0x1C,0x00,0x00,0x00,0x02,0x04,0x1C,0x04,0x7E,0x03,0x00,0x00,0x06,0x08,
0xF0,0x0B,0x7E,0x03,0x00,0x00,0x02,0x0C,0x00,0x00,0x1C,0x00,0x00,0x00,0x01,0x06,
0xF8,0x1F,0x00,0x00,0x00,0x00,0x01,0x03,0xA8,0x10,0x00,0x00,0x00,0x00,0x81,0x01,
0xAC,0x0B,0x00,0x00,0x00,0x00,0xFF,0x00,0xA8,0x04,0x00,0x00,0x00,0x00,0x42,0x00,
0xF8,0x0A,0x00,0x00,0x00,0x00,0x99,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x05,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,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,

};
//定义定时计数,当sec_count==20时,秒加一
uchar sec_count=0;
code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
///月份数据表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint day_code2[3]={0x111,0x130,0x14e};
bit c_moon;
data uchar year_moon,month_moon,day_moon;
/******************************************************************************************
* 函数名称    :get_moon_day
* 功能描述    :用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
bit get_moon_day(uchar month_p,uint table_addr)
{
  uchar temp;
    switch (month_p){
        case 1:{temp=year_code[table_addr]&0x08;
             if (temp==0)return(0);else return(1);}
        case 2:{temp=year_code[table_addr]&0x04;
             if (temp==0)return(0);else return(1);}
        case 3:{temp=year_code[table_addr]&0x02;
             if (temp==0)return(0);else return(1);}
        case 4:{temp=year_code[table_addr]&0x01;
             if (temp==0)return(0);else return(1);}
        case 5:{temp=year_code[table_addr+1]&0x80;
             if (temp==0) return(0);else return(1);}
        case 6:{temp=year_code[table_addr+1]&0x40;
             if (temp==0)return(0);else return(1);}
        case 7:{temp=year_code[table_addr+1]&0x20;
             if (temp==0)return(0);else return(1);}
        case 8:{temp=year_code[table_addr+1]&0x10;
             if (temp==0)return(0);else return(1);}
        case 9:{temp=year_code[table_addr+1]&0x08;
             if (temp==0)return(0);else return(1);}
        case 10:{temp=year_code[table_addr+1]&0x04;
             if (temp==0)return(0);else return(1);}
        case 11:{temp=year_code[table_addr+1]&0x02;
             if (temp==0)return(0);else return(1);}
        case 12:{temp=year_code[table_addr+1]&0x01;
             if (temp==0)return(0);else return(1);}
        case 13:{temp=year_code[table_addr+2]&0x80;
             if (temp==0)return(0);else return(1);}
    }
}
/******************************************************************************************
* 函数名称    :Conversion
* 功能描述    :输入阳历数据,输出阴历数据(只允许1901-2099年)
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void Conversion(bit c,char year,char month,char day)
{                         //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
    uchar temp1,temp2,temp3,month_p;
    uint temp4,table_addr;
    bit flag2,flag_y;

    //定位数据表地址
    if(c==0) { table_addr=(year+0x64-1)*0x3; }
    else     { table_addr=(year-1)*0x3;    }
    //定位数据表地址完成
    //取当年春节所在的公历月份
    temp1=year_code[table_addr+2]&0x60;
    temp1=_cror_(temp1,5);
    //取当年春节所在的公历月份完成
    //取当年春节所在的公历日
    temp2=year_code[table_addr+2]&0x1f;
    //取当年春节所在的公历日完成
    // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
    if(temp1==0x1) { temp3=temp2-1; }  
    else  { temp3=temp2+0x1f-1; }
    // 计算当年春年离当年元旦的天数完成
    //计算公历日离当年元旦的天数,为了减少运算,用了两个表
    //day_code1[9],day_code2[3]
    //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
    //在九月后,天数大于0xff,用表day_code2[3]
    //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
    //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
    if (month<10){ temp4=day_code1[month-1]+day-1; }
    else         { temp4=day_code2[month-10]+day-1;}
    if ((month>0x2)&&(year%0x4==0)&&(year!=0))
       temp4+=1; //如果公历月大于2月并且该年的2月为闰月,天数加1
    //计算公历日离当年元旦的天数完成
    //判断公历日在春节前还是春节后
    if (temp4>=temp3)
    { //公历日在春节后或就是春节当日使用下面代码进行运算
        temp4-=temp3;
        month=0x1;
        month_p=0x1;  //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
        flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
        flag_y=0;
        if(flag2==0)temp1=0x1d; //小月29天
        else temp1=0x1e; //大小30天
        temp2=year_code[table_addr]&0xf0;
        temp2=_cror_(temp2,4);  //从数据表中取该年的闰月月份,如为0则该年无闰月
        while(temp4>=temp1)
        {
            temp4-=temp1;
            month_p+=1;
            if(month==temp2)
     {
              flag_y=~flag_y;
              if(flag_y==0)month+=1;
            }
            else
      month+=1;
            flag2=get_moon_day(month_p,table_addr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
        }
        day=temp4+1;
    }
    else
    {  //公历日在春节前使用下面代码进行运算
        temp3-=temp4;
        if (year==0x0){year=0x63;c=1;}
        else year-=1;
        table_addr-=0x3;
        month=0xc;
        temp2=year_code[table_addr]&0xf0;
        temp2=_cror_(temp2,4);
        if (temp2==0)month_p=0xc;
        else month_p=0xd;
    //   month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12
        flag_y=0;
        flag2=get_moon_day(month_p,table_addr);
        if(flag2==0)temp1=0x1d;
        else temp1=0x1e;
        while(temp3>temp1)
        {
            temp3-=temp1;
            month_p-=1;
            if(flag_y==0)month-=1;
            if(month==temp2)flag_y=~flag_y;
            flag2=get_moon_day(month_p,table_addr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
         }
        day=temp1-temp3+1;
    }
    c_moon=c;
//原程序这里又把这得出的值变回BCD码。但根据我后面的程序,我不需要。
//后面用来显示的农历信息的程序分别是disp_t3()和disp_t4()
    year_moon=year;
    month_moon=month;
    day_moon=day;
}
/******************************************************************************************
* 函数名称    :Conver_week
* 功能描述    :输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
* 参数        :  参数名称: 输入/输出? 类型  描述
* 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期,但如果是在
  闰年又不到3 月份上述之和要减一天再除7星期数。余数为0时,为星期天。

******************************************************************************************/
void Conver_week()
{//century=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
    uchar temp1,temp2;
    temp1=year;
    if (century==0){temp1=temp1+100;}  //如果为21世纪,年份数加100
    temp2=temp1/4;                     //所过闰年数只算1900年之后的
    temp2=temp1+temp2;
    temp2=temp2%7;                     //为节省资源,先进行一次取余,避免数大于255
    temp2=temp2+day+table_week[month-1];
    if (year%0x4==0&&month<3)temp2-=1;
    week=temp2%7;
}
/******************************************************************************************
* 函数名称    :lcd_busy
* 功能描述    :判别LCD12864忙否?不忙才跳出此程序
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void lcd_busy(void)
{
  LCD_di=0;
  LCD_rw=1;
  LCD_db=0xff;
    while (1)
    {
      LCD_e=1;
      if (LCD_db<0x80)                        //如果要进行简单的软件调试,可在这句前面加"//"跳过
      break;
      LCD_e=0;
    }
    LCD_e=0;
}
/******************************************************************************************
* 函数名称    :set_xy
* 功能描述    :设置显示位置! X,Y分别代表横纵坐标!
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void set_xy(unsigned char x,unsigned char y)
{
   if (x>=64)   
    {
     LCD_csa=0;
     LCD_csb=1;
    }
   else         
    {
     LCD_csa=1;
     LCD_csb=0;
    }       //判别是左半屏,还是右半屏
   lcd_busy();
   LCD_di=LCD_rw=0;
   LCD_db=0x40|x;                            //列地址赋值,x取值0----64
   LCD_e=1;LCD_e=0;
   lcd_busy();
   LCD_di=LCD_rw=0;
   LCD_db=0xb8|y;                            //页面地址赋值,y取值0----8
   LCD_e=1;LCD_e=0;
   LCD_db=0xff;
}
/******************************************************************************************
* 函数名称    :lw
* 功能描述    :在指定的位置显示数据
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void lw(uchar x,uchar y,uchar dd)
{
   set_xy(x,y);
   lcd_busy();
   LCD_di=1;
   LCD_rw=0;
   LCD_db=dd;                                //数据送显
   LCD_e=1;
   LCD_e=0;
   LCD_db=0xff;
}
/******************************************************************************************
* 函数名称    :Delay
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void Delay12864(unsigned int t)//
{
unsigned int i,j;
for(i=0;i<t;i++)
{
  for(j=0;j<10;j++);
}
}
/******************************************************************************************
* 函数名称    :lcd_init
* 功能描述    :显示初始化
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
#pragma disable
void lcd_init(void)
{
   unsigned char x,y;
   /*开显示*/
   LCD_rst=0;
  Delay12864(100);
  LCD_rst=1;
  Delay12864(100);
   LCD_e=LCD_di=LCD_rw=0;
   LCD_csa=LCD_csb=0;
   LCD_csa=1;                                //选择左半屏显示
   LCD_db=0x3f;                              //打开左半屏显示
   LCD_e=1;LCD_e=0;LCD_csa=0;
   LCD_csb=1;                                //选择右半屏显示
   LCD_db=0x3f;                              //打开右半屏显示
   LCD_e=1;LCD_e=0;LCD_csb=0;
   /*0行开始显示*/
   LCD_csa=1;lcd_busy();
   LCD_di=LCD_rw=0;LCD_db=0xc0;              //设置左半屏起始行,是第一行
   LCD_e=1;LCD_e=0;LCD_csa=0;
   LCD_csb=1;lcd_busy();
   LCD_di=LCD_rw=0;LCD_db=0xc0;              //设置右半屏起始行,是第一行
   LCD_e=1;LCD_e=0;LCD_csb=0;
   for (y=0;y<8;y++)
   {
     for (x=0;x<128;x++) lw(x,y,0);          //全屏清零显示
   }
}
/******************************************************************************************
* 函数名称    :dis_map
* 功能描述    :显示一幅图象:x,y分别表示图象的行地址和页面地址;map表示图象的数据表;
* 参数        :  参数名称: 输入/输出? 类型  描述
* lon和high分别表示图象和长和高;fb表示是否反白显示.本函数为按列扫描

******************************************************************************************/
void dis_map(uchar x,uchar y,uchar map[],uchar lon,uchar high,bit fb)
{
   uchar dd;
   uint i,j;
   for(i=0;i<lon;i++)                    //按列循环,lon表示共有多少列
   for (j=0;j<high/8;j++)                //每列存有high/8个数据,逐一扫描
   {
     dd=map[i*high/8+j];
     if (fb) dd=255-dd;                  //由fb决定是否反白显示
     lw(x+i,y+j,dd);   
   }
}
/******************************************************************************************
* 函数名称    :delayX10ms
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void delayX10ms(uint count)
{
  uint i,j,k;
  for (i=0; i<count; i++)
    for(j=0; j<10; j++)
      for(k=0; k<120; k++);
}
/******************************************************************************************
* 函数名称    :dz
* 功能描述    :显示一个汉字,n代表字表里第n个字!fb==1:反白显示
* 参数        :  参数名称: 输入/输出? 类型  描述
* 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列...

******************************************************************************************/
void dz(uchar x,uchar y,uchar n,uchar fb)
{
   unsigned char i,dd;
   for (i=0;i<16;i++)
   {
     dd=hz[i+n*32];
     if (fb) dd=255-dd;
     lw(x*8+i,y,dd);                   //显示汉字的上半部分
     dd=hz[i+n*32+16];
     if (fb) dd=255-dd;
     lw(x*8+i,y+1,dd);                 //显示汉字的下半部分
   }
}
/******************************************************************************************
* 函数名称    :dn
* 功能描述    :显示一个数字,n代表字表里第n个数字!fb==1:反白显示
* 参数        :  参数名称: 输入/输出? 类型  描述
* 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列...

******************************************************************************************/
void dn(uchar x,uchar y,uchar n,uchar fb)
{
   unsigned char i,dd;
   for (i=0;i<8;i++)
   {
     dd=number[i+n*16];
     if (fb) dd=255-dd;
     lw(x*8+i,y,dd);                   //显示数字的上半部分
     dd=number[i+n*16+8];
     if (fb) dd=255-dd;
     lw(x*8+i,y+1,dd);                 //显示数字的下半部分
   }
}
/******************************************************************************************
* 函数名称    :max_day
* 功能描述    :阳历月当月的最大天数。参数由全局变量year,month得到。
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
max_day()
{
   switch (month)
   {
     case 1:return(31);
//如果是2月且是闰年则返回29,否则28
//闰年的判断方法是:年份能被4整除但又不能被100整除,则是
     case 2:if ((year%4==0)&&(year!=0)) return(29); else return(28);
     case 3:return(31);
    case 4:return(30);
     case 5:return(31);
     case 6:return(30);
     case 7:return(31);
     case 8:return(31);
     case 9:return(30);
     case 10:return(31);
     case 11:return(30);
     case 12:return(31);
   }
   return(31);                              //防止意外月份发生使天数归1。此句可以不
}
/******************************************************************************************
* 函数名称    :time0
* 功能描述    :定时程序,当中断20次时,秒加一。
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void time0(void) interrupt 1
{
   TH0=0x3C;
   TL0=0xB0;
   if(++sec_count>=20)  sec_count=0,sec++;
}
/******************************************************************************************
* 函数名称    :Delay
* 功能描述    :时间进位、调整处理程序。
* 参数        :  参数名称: 输入/输出? 类型  描述
* 每次时间有所改变,如年份改变,日期改变,分钟改变,都必须调用此函数
* 并且定时器在运行时,每秒钟都必须调用此程序!切记!!!!!!!!!!!!!!!!!!!

******************************************************************************************/
void verify_time (void)
{
   if(sec>=60)
     sec=0,min++;
   else if(sec<0) sec=0;
   if(min>=60)
     min=0,hour++;
   else if(min<0)min=59;
   if(hour>=24)
    hour=0,day++;
   else if(hour<0)hour=23;
   
   if(day>max_day())
     day=1,month++;
   else if(day<1)day=max_day();
   if(month>12)
     month=1,year++;
   else if(month<1)month=12;
   if(year>=100)
     century=~century,year=century;
   else
   {
     if(year<1&&century) century=~century,year=99;
     if(year<0&&(~century)) century=~century,year=99;
   }
}
/******************************************************************
本函数主要用来设置日期和时间的时候,选中的参数可以反白显示。
右屏第一行显示程序,由which决定第几天参数黑显。
如which==1时,年份黑显。
******************************************************************/
/******************************************************************************************
* 函数名称    :Delay
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void disp_t1(uchar which)
{
   bit c_year=0,c_month=0,c_day=0;
   if (which==1) c_year=1;
   if (which==2) c_month=1;
   if (which==3) c_day=1;
   if (century) dn(8,0,1,c_year),dn(9,0,9,c_year);
   else dn(8,0,2,c_year),dn(9,0,0,c_year);         //显示世纪,即年份的前两位
   dn(10,0,year/10,c_year);
   dn(11,0,year%10,c_year);                        //显示年份的后两位
   dn(12,0,month/10,c_month);
   dn(13,0,month%10,c_month);                      //显示月份
   dn(14,0,day/10,c_day);
   dn(15,0,day%10,c_day);                          //显示日期
}
/******************************************************************************************
* 函数名称    :Delay
* 功能描述    :本函数主要用来设置日期和时间的时候,相应的参数可以反白显示。
* 参数        :  参数名称: 输入/输出? 类型  描述
* 右屏第二行显示程序,由which决定第几天参数黑显。
* 如which==2时,分钟黑显。

******************************************************************************************/
void disp_t2(uchar which)
{
   bit c_hour=0,c_min=0,c_sec=0;
   if (which==1) c_hour=1;
   if (which==2) c_min=1;
   if (which==3) c_sec=1;
   dn(8,2,hour/10,c_hour);
   dn(9,2,hour%10,c_hour);                  //显示小时
   dn(10,2,10,0);                           //显示冒号
   dn(11,2,min/10,c_min);
   dn(12,2,min%10,c_min);                   //显示分钟
   dn(13,2,10,0);                           //显示冒号
   dn(14,2,sec/10,c_sec);
   dn(15,2,sec%10,c_sec);                   //显示秒钟
}
/******************************************************************************************
* 函数名称    :disp_t3
* 功能描述    :右屏第三行显示程序
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void disp_t3()
{
   uchar temp;
   dz(8,4,27,0);                            //第三行前两列显示“周”字
   Conver_week();
   if(week) temp=week;                      //赋week值为1----6,用来显示“一”----“六”
   else week=26;                            //赋week值为0时,赋值26用来显示“日”
   dz(10,4,week,0);
   verify_time();
   Conversion(century,year,month,day);      //得到农历日期
   if(c_moon) temp=year_moon%12+12;         //如果是19世纪,则可直接得出年的属性
   else       temp=(year_moon+100)%12+12;   //农历年也过了世纪,则农历年上加100再求属性
   dz(12,4,temp,1);                         //显示属性
   dz(14,4,24,1);                           //显示“年”
}
/******************************************************************************************
* 函数名称    :disp_t4
* 功能描述    :右屏第四行显示程序
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void disp_t4()
{
   uchar temp1,temp2;
   verify_time();
   Conversion(century,year,month,day);      //得到农历日期
   temp1=month_moon/10;
   temp2=month_moon%10;
   if(temp1==0)
     dz(8,6,temp2,1),dz(10,6,25,1);        //月份高位为0,则月份前位显月份,后位显示“月”字
   else if (temp1&&temp2)
            dz(8,6,0,1),dz(10,6,temp2,1);  //月份高位低位都大于0,则月份高位显“十”,后位显日。
       else dz(8,6,0,1),dz(10,6,25,1);     //月份高位为1而低位为0,则前位显“十”,后位显“月”
   temp1=day_moon/10;
   temp2=day_moon%10;
   switch (temp1)
   {
    case 0:  dz(12,6,10,1),dz(14,6,temp2,1);break;   //日期高位为0,则前位显“初”
    case 1:  if(temp2)
               dz(12,6,0,1), dz(14,6,temp2,1);       //日期高位为1且低位不为0,则前位显“十”
             else
               dz(12,6,10,1),dz(12,6,0,1);           //日期高位为1且低位为0,则显“初十”
             break;
    case 2:  dz(12,6,11,1),dz(14,6,temp2,1);break;   //日期高位为2,则前位显“廿”
    case 3:  dz(12,6,3,1), dz(14,6,temp2,1);break;   //日期高位为3,则前位显“三”,低位显“十”
   }
}
/******************************************************************************************
* 函数名称    :disp_time
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void disp_time()
{  
   verify_time();                        //确认时间正确
   disp_t1(0);                           //右屏第一行显示程序
   disp_t2(0);                           //右屏第二行显示程序
   disp_t3();                            //右屏第三行显示程序
   disp_t4();                            //右屏第四行显示程序
}
/******************************************************************************************
* 函数名称    :initial
* 功能描述    :主程序初始化
* 参数        :  参数名称: 输入/输出? 类型  描述

******************************************************************************************/
void initial (void)
{
  EA=1;
  ET0=1;
   TMOD=0x01;
   TH0=0x3C;
   TL0=0xB0;
  
   lcd_init();                       //液晶初始化
   dis_map(0,0,bmp208,64,64,0);      //左屏显示图片
  
   hour=12;
   min=0;
   sec=0;              //分别对时分秒赋初值
   year=6;
   month=8;
   day=13;            //分别对年月日赋初值
   century=0;                        //对世纪赋初值
  
   Conversion(century,year,month,day);
   TR0=1;
}
/******************************************************************************************
* 函数名称    :key_value
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述
* 按键程序,因为本程序所剩端口良多,且这里不程序主要关注点。
* 所以直接以端口来对应按键。
* P1.0对应“调整”键          P1.1对应“增加”键
* P1.2对应“减少”键          P1.3对应“复位”键
******************************************************************************************/
key_value()
{
   k4 = 1;
   if (k4!=1)
   {
      delayX10ms(5);
      if(k1==1)   return(1);         //“调整”键
      if(k2==1)   return(2);         //“增加”键
      if(k3==1)   return(3);         //“减少”键
      
   }
   return(0);                           //无按键按下
}

/******************************************************************************************
* 函数名称    :adjust_time
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述
* 进入本函数后,先停止时钟计时器。退出本程序后将会启动。如果有调整到秒,定时器重新赋初值。
* 本函数中,t变量用来判断是否长时间没有按键动作。当t变量增加到65500后,调整程序退出。
* i变量用来决定当前调整数的黑白闪烁。i<128则黑显,反之则白显。
* j变量用来决定按键时长,长时间按调整则跳出调整程序。长时间按复位,则复位时间,并跳出。
* w_h取值0,1。表示调整的是那行程序。0为右屏第一行,1为右屏第二行。
* w_s取值为1,2,3。表示调整当前行的第几个参数。
* 比如w_h==1,w_s==2时。表示取第二行的第二个参数。即为公历月。

******************************************************************************************/
void adjust_time()
{
   uchar i=0,j=0,t=0,key,w_s=1;
   bit w_h=0;
   TR0=0;
   while(P2==0x06);                            //等待“调整”键松开
   disp_t1(1);                                 //年显示闪烁,黑白显示,i决定黑或白

   //等待按键或时间到退出程序。
   while(1)
   {
     //显示相应的调整参数闪烁。
     i=i+40;
     if(w_h==0)                               //如果参数在第一行
     {
        if (i/128) disp_t1(0);
        else disp_t1(w_s);                    //由i决定黑或白显,w_s决定显示第几个参数
     }
     else                                     //否则参数在第二行
     {
        if (i/128) disp_t2(0);               
        else disp_t2(w_s);                    //由i决定黑或白显,w_s决定显示第几个参数
     }
     key=key_value();                         //取按键取
  //如果调整按键按下
     if (key==1)
     {
        t=0;j=0;                              //函数等待参数t和按键等待参数j清零
        while (key==1)
        {
           if(++j<=30) ;                      //判断是否长时间按。
           //如果长时间按调整。确认时间的正确性,开启时钟,并退出本函数
           else
           {
              verify_time();disp_time();
              while(P1==0x0E)P1=0x0F;         //等待按键放松,退出调整函数
              TR0=1;return;
           }
           key=key_value();
        }
        if(w_s++>=3)
        {
           w_h=~w_h,w_s=1;                    //不是长时间按,则转换相应的调整参数
           if(w_h) disp_t1(0);
           else    disp_t2(0);                //参数换行闪后,防止换行前有黑显示。
        }
     }
  //如果增加键按下
     if(key==2)
     {
        t=0;                                  //函数等待参数t清零。
        //如果被调整数在第一行,则相应的参数加一
        if (w_h==0)
        {
           if(w_s==1) year++,verify_time();
           if(w_s==2) if(month++>=12)month=1;
           if(w_s==3) if(day++>=max_day())day=1;
        }
        //否则被调整数在第二行,则相应的参数加一
        else
        {
           if(w_s==1) if(hour++>=24)hour=0;
           if(w_s==2) if(min++>=60) min=0;
        //调整秒,则秒清零,定时器重新赋初值
           if(w_s==3) {sec=0;sec_count=0;TH0=0x3C;TL0=0xB0;}  
        }
     }
  //如果减少键按下
     if(key==3)
     {
        t=0;                                   //函数等待参数t清零。
        //如果被调整数在第一行,则相应的参数减一
        if (w_h==0)
        {
           if(w_s==1) year--,verify_time();
           if(w_s==2) month--,verify_time();
           if(w_s==3) day--,verify_time();
        }
        //否则被调整数在第二行,则相应的参数减一
        else
        {
           if(w_s==1) hour--,verify_time();
           if(w_s==2) min--,verify_time();
        //调整秒,则秒清零,定时器重新赋初值
           if(w_s==3) {sec=0;sec_count=0;TH0=0x3C;TL0=0xB0;verify_time();}  
        }
     }
  //如果复位键按下
     if (key==4)
     {
        t=0;j=0;                              //函数等待参数t和按键等待参数j清零。
        while(key==4)
        {
           if(++j<=30)  ;                     //长时间按时,计时
           //到规定时间,时间复位并退出调整函数
           else
           {
              initial();verify_time();disp_time();
              while(P1==0x07) P1=0x0F;        //等待按键放松,退出调整函数
              TR0=1;return;      
           }
           key=key_value();
        }
     }
  disp_t3();disp_t4();                        //显示相应的星期和农历日期
  if(++t<=100)  delayX10ms(10);               //空闲等待
  //如果规定时间到还没有按键产生,则确认时间,显示,并退出此函数
  else { verify_time(); disp_time(); TR0=1;return; }
  }
}
/******************************************************************************************
* 函数名称    :Delay
* 功能描述    :
******************************************************************************************/
void main(void)
{
  uchar i=0,key=0;
   delayX10ms(100);                              //通电延时,防止LCD器件的电源抖动
   initial();
   while(1)
   {
     verify_time();                              //确认时间正确性
     disp_time();                                //这里调用显示时间程序
     key=key_value();
     if (key)                                 //判断是否有按键按下
      {
        if(key==1)   adjust_time();               //进入调整功能
        if(key==4)   if(++i>=60) initial();       //如果长按复位键,将时间初始化
      }
   }
}


 楼主| 发表于 2013-9-4 10:35 | 显示全部楼层
本帖最后由 zjhchp 于 2013-9-4 18:22 编辑

http://img.mydigit.net/Mon_1308/108_160183_906999256e3a3e2.jpg?107


回复

使用道具 举报

发表于 2013-9-4 11:04 | 显示全部楼层
* 函数名称    :key_value
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述0 }# H( W0 Z0 `) f3 e$ J/ f$ R
* 按键程序,因为本程序所剩端口良多,且这里不程序主要关注点。' x+ Y1 f1 Y) R7 U$ p" L5 `  O
* 所以直接以端口来对应按键。$ W; C$ _, s( V  }% D: a) i
* P1.0对应“调整”键          P1.1对应“增加”键
* P1.2对应“减少”键          P1.3对应“复位”键' A7 O+ }/ s) _# V* i; ?' w$ P  ~
******************************************************************************************/6 F/ V& f% E( X8 `% D2 |" v6 z
key_value()
{
   k4 = 1;
   if (k4!=1)6 j, u$ o( `1 }# o# I' a6 N
    {( M6 ?7 n  ]* J5 Y: B; E
       delayX10ms(5);
      if(k1==1)   return(1);         //“调整”键. V7 `) C! |7 g9 \
       if(k2==1)   return(2);         //“增加”键
      if(k3==1)   return(3);         //“减少”键
      " z5 w# j3 B; E, h' M# C5 S6 l* H
    }
   return(0);                           //无按键按下0 C# E1 y/ P! t' T1 l9 A# P: u
}# S9 R) p* b" d" j. o+ c' W( M


简单看了下,这个函数有问题
k4 = 1;
   if (k4!=1)6 j, u$ o( `1 }# o# I' a6 N
这个两行改为
P1 = P1| 0x0f;     //P1低4位置1
if((P1 && 0x0f) != 0x0f)    //有键按下

自己调试下,看看
回复

使用道具 举报

 楼主| 发表于 2013-9-4 11:23 | 显示全部楼层
hzmsn 发表于 2013-9-4 11:04
* 函数名称    :key_value
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述0 }# ...

谢谢!
回复

使用道具 举报

 楼主| 发表于 2013-9-4 13:14 | 显示全部楼层
本帖最后由 zjhchp 于 2013-9-4 18:24 编辑
hzmsn 发表于 2013-9-4 11:04
* 函数名称    :key_value
* 功能描述    :
* 参数        :  参数名称: 输入/输出? 类型  描述0 }# ...


我试了一下,将
k4 = 1;
   if (k4!=1)
这个两行改为:

P1 = P1| 0x0f;         //P1低4位置1
if((P1 && 0x0f) != 0x0f)     //有键按下

现在是,只有一个键可以用(接在P15脚的),始终是设置状态下。这个键,点按一下是换项目,常按是项目调整,而且还无法返回。
按键原来接的是   k1 = P1^5;  k2 = P1^6; k3 = P1^7;  k4 = P3^2;        K4脚可以调出调设置!


这是什么情况!还有什么不对!  谢谢!
回复

使用道具 举报

发表于 2013-9-4 14:02 | 显示全部楼层
你的图很大啊!!!!!!看不到是什么。。。。
回复

使用道具 举报

发表于 2013-9-4 14:08 | 显示全部楼层
我看到上面有这样的定义:
sbit k1 = P1^5;
sbit k2 = P1^6;
sbit k3 = P1^7;
sbit k4 = P3^2;
下面又有这个
* P1.0对应“调整”键          P1.1对应“增加”键
* P1.2对应“减少”键          P1.3对应“复位”键

有没有矛盾呢?我不懂单片机程序
回复

使用道具 举报

发表于 2013-9-4 14:33 | 显示全部楼层
呃,你把按键实际硬件接的管脚定义,确认好,再改
回复

使用道具 举报

发表于 2013-9-4 14:35 | 显示全部楼层
改成这样好了
k1 = 1;
k2 = 1;
k3 = 1;
k4 = 1;
if(!(k1 && k2 && k3 && k4))
这样试试看,如果还不对,检查程序定义管脚和实际硬件的连接
回复

使用道具 举报

发表于 2013-9-4 15:11 | 显示全部楼层
图好大……完全不知道什么
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-19 08:55 , Processed in 0.056194 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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