DS12C887时钟实例

2020-01-30 14:08发布

我也有一个用12864无字库屏+DS12C887的时钟实例,请大家分享。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
miyadai
2020-01-31 00:31
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*   SMG12865K9LCM屏参数    */
sbit _RS =         P0^0;         //显示数据或控制指令    A0
sbit _RET = P3^4;         //复位端                                 RES
sbit _CS =         P3^6;         //片选端                                CS
sbit _SID = P0^2;         //数据输入端                           SI
sbit _CLK = P0^1;         //同步时钟                                  SCL
/*   扫描键盘参数定义      */
sbit s1=P3^0;                //定义修改时钟的功能键,按下此键进入可以修改时间,从秒、分...年
sbit s2=P3^1;                //时间参数增加,每次加1
sbit s3=P3^2;                //时间参数减少,每次减1
sbit rd=P3^7;                //定义键盘扫描电平信号
/*   DS12C887参数定义      */
sbit dscs=P1^4;         //片选输入,低电平有效
sbit dsas=P1^5;                //地址选通输入,AS 的上升沿将 AD0~AD7
sbit dsrw=P1^6;                //读/写输入
sbit dsds=P1^7;                //DS/RD:数据选择或读输入
sbit dsirq=P3^3;           //DS12C887输出硬中断触发信号

uchar bdata flag,s1_flag;                                                        //设置程序标识变量
uchar year,month,day,week,sshi,fen,miao,shi,ge;                //定义时间相关参数变量
uchar count,timer_val,s1num;                                                                        //一般变量
uchar data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;                //设置LCM屏X,Y点位置变量

/*   显示相关函数          */
void send2LCM(bit rs,uchar dat);                                        //向液晶写入一个字节
void lcdclear(uchar dat1,uchar dat2);                                //写测试数据到LCM全屏
void dishz(uchar x_add,uchar y_add,uchar code *p);        //显示汉字
void dischar(uchar x_add,uchar y_add,uchar code *p);//显示字符
void pagelcdclear(uchar page,uchar dat1,uchar dat2);//清空一行内容

/*   显示时间相关函数      */
void write_miao_data(uchar dat);                                        //向LCM写秒数据函数
void write_fen_data(uchar dat);                                                   //向LCM写分数据函数
void write_shi_data(uchar dat);                                                   //向LCM写时数据函数
void write_day_data(uchar day);                                                   //向LCM写天数据函数
void write_week_data(uchar week);                                           //向LCM写星期数据函数
void write_month_data(uchar month);                                           //向LCM写月数据函数
void write_year_data(uchar year);                                           //向LCM写年数据函数

/*    初始化,设置相关      */
void mcu_init(void);                                                                //系统初始化
void initlcm(void);                                                                        //初始化LCM
void read_logo_intr();                                                                //初始化LCM显示内容
void keyscan();                                                                                //键盘扫描函数

/*    DS12C887 相关函数     */
void ds_init(void);
void write_ds(uchar add,uchar dat);
uchar read_ds(uchar add);
//void set_time();

/*    延时相关函数          */
void delay(void);                                                                        //LCM延时
void delay_us(uint time);                                                        //系统延时

extern uchar code chardot[176];
extern uchar code hzdot[224];
extern uchar code nullhz[];
extern uchar code logohz1[];
extern uchar code logohz2[];
extern uchar code logohz3[];
extern uchar code logohz4[];
extern uchar code logohz5[];

extern uchar code ch11[];
extern uchar code ch12[];
extern uchar code chardot[];

/*  系统初始化函数     
        函数原型:mcu_init(void)
        功能:
*/
void mcu_init(void)
{
/*                         11.0,592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
                                                65536-9216=56320(dc00)
                                                TH0=0xdc,TL0=0x00
*/
        TMOD = 0x01;                                                        //将定时器0设置为方式1即16位定时器
    TH0 = 0x4C;                                                                   //装载定时器0计数初值          *** 11.0592MHz晶振计算出10ms
    TL0 = 0x00;
    EA = 1;                                                                         //开总中断
    ET0 = 1;                                                                //允许定时器0中断
    TR0 = 1;                                                                //启动定时器0
}
/*  DS12C887  初始化函数     
        函数原型:ds_init(void)
        功能:
*/
void ds_init(void)
{
         dsas=0;
         dsds=0;
         dsrw=0;
         write_ds(0x0a,0x20);                                //DS12C887寄存器A功能设置,开启时钟振荡器
                                                                                 // BIT7  BIT6  BIT5  BIT4  BIT3  BIT2  BIT1  BIT0
                                                                                // UIP   DV2   DV1   DV0   RS3   RS2   RS1   RS0
         write_ds(0x0b,0x76);                                //DS12C887寄存器B功能设置,开启24小时模式
                                                                                 // BIT7  BIT6  BIT5  BIT4  BIT3  BIT2  BIT1  BIT0
                                                                                // SET   PIE   AIE   UIE   SQWE  DM    24/12 DSE
}
/*        DS12C887  设置时间函数
        函数原型:set_time()
        功能:

void set_time()
{
        write_ds(9,11);                                                                        // 设置年
        write_ds(8,11);                                                                        // 设置月
        write_ds(7,19);                                                                        // 设置天
        write_ds(6,7);                                                                        // 设置星期
        write_ds(4,11);                                                                        // 设置时
        write_ds(2,39);                                                                        // 设置分         
        write_ds(0,35);                                                                        // 设置秒
}
*/
/*         DS12C887 芯片写函数
        函数原型:wirte_ds(uchar add,uchar dat)
        功能:
*/
void write_ds(uchar add,uchar dat)
{
        dscs=0;                                                                                        //置片选信号为有效
        dsas=1;                                                                                        //置地址选通信号有效
        dsds=1;                                                                                        //置地址信号有效
        dsrw=1;                                                                                        //置写地址信号有效
        P0=add;                                                                                        //写入要写数据的地址
        dsas=0;                                                                                        //置数据选通信号有效
        dsrw=0;                                                                                        //置写数据信号有效
        P0=dat;                                                                                        //写入数据
        dsrw=1;                                                                                           //置读/写为高
        dsas=1;                                                                                        //置地址选通为高
        dscs=1;                                                                                        //置片选为高
}
/*  DS12C887  芯片读函数
        函数原型:read_ds(uchar add)
        功能:
*/
uchar read_ds(uchar add)
{
        uchar ds_date;                                                                        //设置临时变量
        dsas=1;                                                                                        //置地址选通信号有效
        dsds=1;                                                                                        //置数据信号有效
        dsrw=1;                                                                                        //置写地址信号有效
        dscs=0;                                                                                        //置片选信号为有效
        P0=add;                                                                                        //写入要取数据的地址
        dsas=0;                                                                                        //置数据选通信号有效
        dsds=0;                                                                                        //置数据信号有效
        P0=0xff;                                                                                //送0xff准备取数标识给DS12C887
        ds_date=P0;                                                                                //取对应地址的有效数据
        dsds=1;                                                                                        //置地址/数据为高
        dsas=1;                                                                                        //置地址选通为高
        dscs=1;                                                                                           //置片选为高
        return ds_date;                                                                        //返回所取到的时钟数据
}
/*  LCM液晶屏初始化需要的延时函数
        函数原型:delay(void)
        功能:
*/
void delay(void)
{
        uchar i,j;
        for (i = 0;i != 0x80;i++)
        for (j = 0;j != 0x80;j++) ;
}
/*        延时函数  time:延时长度
        函数原型:delay_us(uchar time)
        功能:
*/
void delay_us(uint time)
{
        uint i;
        for (i=0;i<time;i++);
}

/*        写LCM屏指令函数
        函数原型:send2LCM(bit rs,uchar dat)
        功能:rs=0时写入控制指令,rs=1时写入显示数据
*/
void send2LCM(bit rs,uchar dat)
{
        uchar i;
        _RS = rs;
        _CS = 0;
        for (i=0;i<8;i++)
        {
                _CLK = 0;
                if ((dat & 0x80)!=0)
                _SID = 1;
                else
                _SID = 0;
                _CLK = 1;
                dat = dat<<1;
        }
        _CS = 1;
}

/*        清LCM数据到LCM屏
        函数原型:lcdclear(uchar dat1,uchar dat2)
        功能:
*/
void lcdclear(uchar dat1,uchar dat2)
{
        uchar i,j;
        for(i = 0xb0;i<0xb8;i++)
        {
                send2LCM(0,i);                                                                 //写页地址
                send2LCM(0,0x10);                                                         //写初始列地址
                send2LCM(0,0x00);
                for(j = 0x00;j<0x41;j++)
                {
                        send2LCM(1,dat1);                                                 //写显示数据
                        send2LCM(1,dat2);
                }
        }
}
/*        写页清屏数据到LCM屏
        函数原型:pagelcdclear(uchar page,uchar dat1,uchar dat2)
        功能:
*/
void pagelcdclear(uchar page,uchar dat1,uchar dat2)
{
        uchar i,j;
        i = page*2 + 0xb0;
        send2LCM(0,i);                                                                         //写页地址
        send2LCM(0,0x10);                                                                 //写初始列地址
        send2LCM(0,0x00);
        for(j = 0x00;j<0x41;j++)
        {
                send2LCM(1,dat1);                                                         //写显示数据
                send2LCM(1,dat2);                                                         //写显示数据
        }
        send2LCM(0,i+1);                                                                 //写页地址
        send2LCM(0,0x10);                                                                 //写初始列地址
        send2LCM(0,0x00);
        for(j = 0x00;j<0x41;j++)
        {
                send2LCM(1,dat1);                                                         //写显示数据
                send2LCM(1,dat2);                                                         //写显示数据
        }
}

/*        初始化LCM液晶屏        (SMG12864K9)
        函数原型:initlcm(void)
        功能:
*/       
void initlcm(void)
{
        _RET = 0;                                                                                 //硬复位
        delay();
        _RET = 1;
        send2LCM(0,0xe2);                                                                 //软件复位
        delay();
        send2LCM(0,0xa2);                                                                 //LCM BIAS=1/9
        send2LCM(0,0xa0);                                                                 //列地址移动方向:ADC=0(SEG1->SEG132)
        send2LCM(0,0xc8);                                                                 //行扫描方向:SHL=1(COM64->COM1)
        delay();
        send2LCM(0,0x2f);                                                                 //电源控制模式:VC,VR,VF=111
        delay();
        send2LCM(0,0x26);                                                                 //内部调整电阻比率:R2,R1,R0=111
        delay();
        send2LCM(0,0x81);                                                                 //对比度寄存器模式
        send2LCM(0,0x18);                                                                 //对比度寄存器值 修改这个值就可以调节对比度了
        send2LCM(0,0x40);                                                                 //起始行
        send2LCM(0,0xe0);                                                                 //写入数据时列地址自动加1,但读时不变
        send2LCM(0,0xaf);                                                                 //开显示
}
/*        写汉字到LCM函数
        函数原型:dishz(uchar x_add,uchar y_add,uchar code *p)
        功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dishz(uchar x_add,uchar y_add,uchar code *p)
{
        uchar i,pag,colh,coll;
        pag = x_add*2+0xb0;
        colh = y_add>>4;                                                                 //取y_add的高4位
        colh = colh | 0xf0;
        colh = colh & 0x1f;
        coll = y_add & 0x0f;                                                         //取y_add的低4位
        send2LCM(0,colh);
        send2LCM(0,coll);
        send2LCM(0,pag);
        for (i=0;i<32;i++)
        {
                if (i == 16)
                {
                        send2LCM(0,pag+1);
                        send2LCM(0,colh);
                        send2LCM(0,coll);
                }
                send2LCM(1,*p++);
        }
}
/*        写西文到LCM函数
        函数原型:lcdclear(uchar dat1,uchar dat2)
        功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dischar(uchar x_add,uchar y_add,uchar code *p)
{
        uchar i,pag,colh,coll;
        pag = x_add*2+0xb0;
        colh = y_add>>4;                                                                 //取y_add的高4位
        colh = colh | 0xf0;
        colh = colh & 0x1f;
        coll = y_add & 0x0f;                                                         //取y_add的低4位
        send2LCM(0,colh);
        send2LCM(0,coll);
        send2LCM(0,pag);
        for (i=0;i<16;i++)
        {
                if (i == 8)
                {
                        send2LCM(0,pag+1);
                        send2LCM(0,colh);
                        send2LCM(0,coll);
                }
                send2LCM(1,*p++);
        }
}

/*        初始化LCM显示内容
        函数原型:read_logo_init()
        功能:
*/
void read_logo_intr()
{
        uchar code *hzcode;       
        /*   显示年月日   */
        pagelcdclear(3,0,0);                                                           //清除第3页,准备在第3页显示年月日的内容。显示样例 2011年01月01日
        hzcode = chardot;                                                                   //取数字字模
        hzcode = hzcode +2*16;                                                        //置字模指针
        dischar(3,8,hzcode);                                                        //写字模到LCM屏幕指定的位置
        hzcode = chardot;                                                                //取数字字模
        hzcode = hzcode +0*16;                                                        //置字模指针
        dischar(3,16,hzcode);                                                        //写字模到LCM屏幕指定的位置
        hzcode = chardot;                                                                 //取数字字模
        hzcode = hzcode +1*16;
        dischar(3,24,hzcode);
        hzcode = chardot;                                                                //取数字字模
        hzcode = hzcode +1*16;
        dischar(3,32,hzcode);
        hzcode = logohz1;                                                                //取汉字字模:年
        dishz(3,40,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(3,56,hzcode);
        hzcode = chardot;
        hzcode = hzcode +1*16;
        dischar(3,64,hzcode);
        hzcode = logohz2;                                                                //取汉字字模:月
        dishz(3,72,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(3,88,hzcode);
        hzcode = chardot;
        hzcode = hzcode +1*16;
        dischar(3,96,hzcode);
        hzcode = logohz3;                                                                //取汉字字模:日
        dishz(3,104,hzcode);
    /*   显示时间   */
        pagelcdclear(0,0,0);                                                        //清除第0页,准备在第0页显示时间的内容。显示样例 00:00:00
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,32,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,40,hzcode);
        hzcode = ch11;                                                                        //取 :字模
        dischar(0,48,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,56,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,64,hzcode);
        hzcode = ch11;                                                                        //取 :字模
        dischar(0,72,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,80,hzcode);
        hzcode = chardot;
        hzcode = hzcode +0*16;
        dischar(0,88,hzcode);
        /*   显示星期    */
        pagelcdclear(1,0,0);                                                        //清除第1页,准备在第1页显示星期的内容。显示样例 星期日
        hzcode = logohz4;                                                                //取汉字字模:星
        dishz(1,40,hzcode);
        hzcode = logohz5;                                                                //取汉字字模:期
        dishz(1,56,hzcode);       
        write_week_data(1);                                                            //显示实时的星期,由DS12C887芯片自己根据年月日输出的星期
        delay();       
}
/*  显示秒函数
        函数原型:wirte_miao_data(uchar dat)
        功能:
*/
void write_miao_data(uchar dat)
{
        uchar shi,ge;                                                                        //设置要显示的秒个位和十位的变量
        uchar code *hzcode;                                                                //设置字模指针变量
        shi=dat/10;                                                                                //取秒的十位数
        ge=dat%10;                                                                                //取秒的个位数
        hzcode = chardot;                                                                //取数字字模
        hzcode = hzcode +shi*16;                                                //根据十位数置要显示数字的地址指针
        dischar(0,80,hzcode);                                                           //显示十位数字
        hzcode = chardot;                                                                //取数字字模
        hzcode = hzcode +ge*16;                                                           //根据个位数置要显示数字的地址指针
        dischar(0,88,hzcode);                                                           //显示个位数字
}
/*        显示分函数
        函数原型:wirte_fen_data(uchar dat)
        功能:
*/
void write_fen_data(uchar dat)
{
        uchar shi,ge;                                                                        //设置要显示的分个位和十位的变量
        uchar code *hzcode;
        shi=dat/10;
        ge=dat%10;
        hzcode = chardot;
        hzcode = hzcode +shi*16;
        dischar(0,56,hzcode);
        hzcode = chardot;
        hzcode = hzcode +ge*16;
        dischar(0,64,hzcode);
}
/*        显示时函数
        函数原型:wirte_shi_data(uchar dat)
        功能:
*/
void write_shi_data(uchar dat)
{
        uchar shi,ge;                                                                        //设置要显示的时个位和十位的变量
        uchar code *hzcode;
        shi=dat/10;
        ge=dat%10;
        hzcode = chardot;
        hzcode = hzcode +shi*16;
        dischar(0,32,hzcode);
        hzcode = chardot;
        hzcode = hzcode +ge*16;
        dischar(0,40,hzcode);
}
/*        显示星期函数
        函数原型:wirte_week_data(uchar dat)
        功能:
*/
void write_week_data(uchar week)
{
        uchar code *hzcode;
        hzcode=hzdot;
        hzcode=hzcode+(week-1)*32;
        dishz(1,72,hzcode);
}
/*        显示天函数
        函数原型:wirte_day_data(uchar dat)
        功能:
*/
void write_day_data(uchar day)
{
        uchar shi,ge;                                                                        //设置要显示的日个位和十位的变量
        uchar code *hzcode;
        shi=day/10;
        ge=day%10;
        hzcode = chardot;
        hzcode = hzcode +shi*16;
        dischar(3,88,hzcode);
        hzcode = chardot;
        hzcode = hzcode +ge*16;
        dischar(3,96,hzcode);
}
/*        显示月函数
        函数原型:wirte_month_data(uchar dat)
        功能:
*/
void write_month_data(uchar month)
{
        uchar shi,ge;                                                                        //设置要显示的月个位和十位的变量
        uchar code *hzcode;
        shi=month/10;
        ge=month%10;
        hzcode = chardot;
        hzcode = hzcode +shi*16;
        dischar(3,56,hzcode);
        hzcode = chardot;
        hzcode = hzcode +ge*16;
        dischar(3,64,hzcode);
}
/*        显示年函数
        函数原型:wirte_year_data(uchar dat)
        功能:
*/
void write_year_data(uchar year)
{
        uchar shi,ge;                                                                        //设置要显示的年个位和十位的变量
        uchar code *hzcode;
        shi=year/10;
        ge=year%10;
        hzcode = chardot;
        hzcode = hzcode +shi*16;
        dischar(3,24,hzcode);
        hzcode = chardot;
        hzcode = hzcode +ge*16;
        dischar(3,32,hzcode);
}

/*        扫描功能键  S16 S17 S18
        函数原型:keyscan()
        功能:
*/
void keyscan()
{
        uchar code *hzcode;
        rd=0;
        if(s1==0)                                                                                //判断是否时间设置功能按键按下
        {
                delay_us(2000);
                if(s1==0)
                {
                        P1=0x00;                                                                //调试标识
                        flag=1;                                                                        //置修改时间标识有效,停止主机向DS12C887取数据
                        s1num++;                                                                //记录s1按下的次数,已选择修改的是那个参数。如:秒、分....年
                        while(!s1);
                        if(s1num==1)                                                           //s1num为1可以修改秒参数
                        {
                                hzcode = nullhz;
                                dischar(0,88,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(0,88,hzcode);
                                s1_flag=1;                                                        //置修改时间标识有效
                        }
                        if(s1num==2)                                                        //s1num为2可以修改分参数
                        {
                                hzcode = nullhz;
                                dischar(0,64,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(0,64,hzcode);                                  //置修改时间标识有效
                                s1_flag=1;
                        }
                        if(s1num==3)                                                        //s1num为3可以修改时参数
                        {
                                hzcode = nullhz;
                                dischar(0,40,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(0,40,hzcode);                                //置修改时间标识有效
                                s1_flag=1;
                        }
                        if(s1num==4)                                                        //s1num为4可以修改日参数
                        {
                                hzcode = ch12;
                                dischar(3,88,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(3,96,hzcode);
                                s1_flag=1;                                                        //置修改时间标识有效
                        }
                        if(s1num==5)                                                        //s1num为5可以修改月参数
                        {
                                hzcode = ch12;
                                dischar(3,56,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(3,64,hzcode);
                                s1_flag=1;                                                        //置修改时间标识有效
                        }
                        if(s1num==6)                                                        //s1num为6可以修改年参数
                        {
                                hzcode = ch12;
                                dischar(3,24,hzcode);
                                delay();
                                hzcode = ch12;
                                dischar(3,32,hzcode);
                                s1_flag=1;                                                        //置修改时间标识有效
                        }
                        if(s1num==7)
                        {
                                s1num=0;
                                flag=0;
                                s1_flag=0;
                                write_ds(9,year);                                        // 写入修改后的参数 年
                                write_ds(8,month);                                        // 写入修改后的参数 月
                                write_ds(7,day);                                        // 写入修改后的参数 天
                               
                                write_ds(4,sshi);                                        // 写入修改后的参数 时
                                write_ds(2,fen);                                        // 写入修改后的参数 分         
                                write_ds(0,miao);                                        // 写入修改后的参数 秒
                                read_logo_intr();                                        //刷新LCM屏幕
                                P1=0xff;                                                        //调试标识
                        }
                }
               
        }
        if(s1_flag==1)
        {
                if(s2==0)
                {
                        delay_us(2000);
                        if(s2==0)
                        {
                                while(!s2);
                                if(s1num==1)                                                //s1num为1可以修改秒参数
                                {
                                        P1=0x00;
                                        miao++;                                                        //每按下一次s1键秒的参数加1
                                        if(miao==60)                                        //当miao参数到60时,置miao参数为0
                                                miao=0;
                                        shi=miao/10;
                                        ge=miao%10;
                                        hzcode = nullhz;
                                        dischar(0,88,hzcode);
                                        delay();
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,80,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,88,hzcode);
                                }
                                if(s1num==2)                                                  //s1num为2可以修改分参数
                                {
                                        fen++;                                                        //每按下一次s1键分的参数加1
                                        if(fen==60)                                                //当fen参数到60时,置fen参数为0
                                                fen=0;
                                        shi=fen/10;
                                        ge=fen%10;
                                        hzcode = nullhz;
                                        dischar(0,64,hzcode);
                                        delay();
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,56,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,64,hzcode);
                                        fen=fen+1;
                                }
                                if(s1num==3)                                                //s1num为3可以修改时参数
                                {
                                        sshi++;                                                        //每按下一次s1键时的参数加1
                                        if(sshi==24)                                        //当sshi参数到24时,置sshi参数为0
                                                sshi=0;
                                        shi=sshi/10;
                                        ge=sshi%10;
                                        hzcode = nullhz;
                                        dischar(0,40,hzcode);
                                        delay();
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,32,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,40,hzcode);
                                }                                                                       
                                if(s1num==4)                                                //s1num为4可以修改日参数
                                {
                                        day++;                                                           //每按下一次s1键日的参数加1
                                        if(day==31)                                                //当fday参数到31时,置day参数为0
                                                day=0;
                                        shi=day/10;
                                        ge=day%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,88,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,96,hzcode);
                                }                                                                       
                                if(s1num==5)                                                //s1num为5可以修改月参数
                                {
                                        month++;                                                //每按下一次s1键月的参数加1
                                        if(month==12)                                        //当month参数到12时,置month参数为0
                                                month=0;
                                        shi=month/10;
                                        ge=month%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,56,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,64,hzcode);
                                }
                                if(s1num==6)                                                  //s1num为6可以修改年参数
                                {
                                        year++;                                                           //每按下一次s1键年的参数加1
                                        if(year==99)                                        //当year参数到99时,置year参数为0
                                                year=0;
                                        shi=year/10;
                                        ge=year%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,24,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,32,hzcode);
                                }
                        }
                }
                if(s3==0)
                {
                        delay_us(2000);
                        if(s3==0)
                        {
                                while(!s3);
                                if(s1num==1)                                                //s1num为1可以修改秒参数
                                {                                                                       
                                        miao--;                                                        //每按下一次s1键秒的参数减1
                                        if(miao==-1)                                        //当miao参数到-1时,置miao参数为59
                                                miao=59;
                                        shi=miao/10;
                                        ge=miao%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,80,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,88,hzcode);
                                }                                                                         
                                if(s1num==2)                                                 //s1num为2可以修改分参数
                                {
                                        fen--;                                                         //每按下一次s1键分的参数减1
                                        if(fen==-1)                                                 //当fen参数到-1时,置fen参数为59
                                                fen=59;
                                        shi=fen/10;
                                        ge=fen%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,56,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,64,hzcode);
                                }                                                                          
                                if(s1num==3)                                                  //s1num为3可以修改时参数
                                {
                                        sshi--;                                                          //每按下一次s1键时的参数减1
                                        if(sshi==-1)                                          //当sshi参数到-1时,置sshi参数为23
                                                sshi=23;
                                        shi=sshi/10;
                                        ge=sshi%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(0,32,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(0,40,hzcode);
                                }
                                if(s1num==4)                                                  //s1num为4可以修改日参数
                                {
                                        day--;                                                           //每按下一次s1键日的参数减1
                                        if(day==-1)                                                //当day参数到-1时,置day参数为31
                                                day=31;
                                        shi=day/10;
                                        ge=day%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,88,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,96,hzcode);
                                }                                                                       
                                if(s1num==5)                                                //s1num为5可以修改月参数
                                {
                                        month--;                                                //每按下一次s1键月的参数减1
                                        if(month==-1)                                        //当month参数到-1时,置month参数为12
                                                month=12;
                                        shi=month/10;
                                        ge=month%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,56,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,64,hzcode);
                                }                                                                         
                                if(s1num==6)                                                 //s1num为6可以修改年参数
                                {
                                        year--;                                                         //每按下一次s1键年的参数减1
                                        if(year==-1)                                         //当year参数到-1时,置year参数为99
                                                year=99;
                                        shi=year/10;
                                        ge=year%10;
                                        hzcode = chardot;
                                        hzcode = hzcode +shi*16;
                                        dischar(3,24,hzcode);
                                        hzcode = chardot;
                                        hzcode = hzcode +ge*16;
                                        dischar(3,32,hzcode);
                                }
                        }
                }
        }
}
/*        中断响应函数
        函数原型:timer0()
        功能:定时刷新LCM屏幕
*/
void timer0() interrupt 1
{
        TH0 = 0x4C;                                                                                   //装载定时器0计数初值          *** 11.0592MHz晶振计算出10ms
    TL0 = 0x00;
        count++;
        if(count==timer_val)
        {
                count=0;
                timer_val++;
         }
        if(timer_val==0x1a)
        {
                count=0;                                                                        //将计数器相关暂存数据清零
                timer_val=0;
                read_logo_intr();                                                        //刷新LCM屏幕
                miao=read_ds(0);
                fen=read_ds(2);
                sshi=read_ds(4);
                week=read_ds(6);
                day=read_ds(7);
                month=read_ds(8);
                year=read_ds(9);
                delay_us(2000);
                write_miao_data(miao);
                write_fen_data(fen);
                write_shi_data(sshi);
                write_week_data(week);
                write_day_data(day);
                write_month_data(month);
                write_year_data(year);
        }
}

一周热门 更多>