高级会员
主题
回帖0
积分3145
阅读权限30
注册时间2013-5-25
最后登录1970-1-1
在线时间 小时
|
一个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&¢ury) 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(); //如果长按复位键,将时间初始化
}
}
}
|
|