搜索
bottom↓
回复: 10

DS12C887时钟实例

[复制链接]

出0入0汤圆

发表于 2011-11-29 06:24:13 | 显示全部楼层 |阅读模式
我也有一个用12864无字库屏+DS12C887的时钟实例,请大家分享。

出0入0汤圆

 楼主| 发表于 2011-11-29 06:25:56 | 显示全部楼层
我的附件是C51test11.rar咋总是不能上传呀???

出0入0汤圆

 楼主| 发表于 2011-11-29 06:28:52 | 显示全部楼层
/*
                *******    基于STC89C52RC的万年历     ********
                功能:
                LCM显示使用太阳人SMG12864K9无字库显示屏和
                使用新型时钟日历芯片 DS12C887作为实时电子时钟时源
                (该芯片可以保留时间为10年)

                定义P0口为DS12C887芯片的复用地址数据总线
                    P1口为DS12C887芯片的控制总线
                        P3和P1口为LCM显示屏和DS12C887的控制总线

                作者:戴志波
                版本:Ver 1.0.0
                日期:2011.11.20
                备注:
                硬件平台基于哈工大的郭天祥老师的学习试验版TX-1C环境下
                此程序为学习版本,仅供学员参考使用。
*/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;
sbit BGC = P3^6;                                                                //控制背光灯的按钮
sbit _BG = P3^5;                                                                //控制屏幕背光的控制指令
uchar bdata bgc_flag;
uchar code *hzcode;

extern uchar count,year,month,day,week,sshi,fen,miao;
extern uchar bdata flag;

extern void mcu_init(void);                                                                //系统初始化
extern void initlcm(void);                                                //初始化LCM
extern void lcdclear(uchar dat1,uchar dat2);        //写测试数据到LCM全屏
extern void read_logo_intr();
extern void keyscan();                                                        //键盘扫描函数
extern void delay_us(uint time);
extern void dishz(uchar x_add,uchar y_add,uchar code *p);//显示汉字
extern void dischar(uchar x_add,uchar y_add,uchar code *p);//显示字符
extern void pagelcdclear(uchar page,uchar dat1,uchar dat2);//清空一行内容

extern void write_miao_data(uchar dat);                                        //显示 秒函数
extern void write_fen_data(uchar dat);                                        //显示 分函数
extern void write_shi_data(uchar dat);                                        //显示 时函数
extern void write_day_data(uchar day);                                        //显示 天函数
extern void write_week_data(uchar week);                                //显示 星期函数
extern void write_month_data(uchar month);                                //显示 月函数
extern void write_year_data(uchar year);                                //显示 年函数

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

void main()
{
        dula=0;                                                                                //  关闭P0口上的LED
        wela=0;                                                                                //        关闭P0口上的LED
        mcu_init();                                                                        //系统初始化
        ds_init();                                                                        //        初始化DS12C887芯片
        initlcm();                                                                        //        初始化SMG12864K9LCM液晶屏
        lcdclear(0x00,0x00);                                                //        打开液晶屏的背光灯
        _BG = 0;
        bgc_flag=0;
        read_logo_intr();
        //set_time();
       
        while(1)
        {
                keyscan();
                if(flag==0)
                {
                        miao=read_ds(0);                                        //读取秒数据                参考 DS12C887的DATASHEET第13页
                        fen=read_ds(2);                                                //读取分数据                Table 2A. Time, Calendar, and Alarm Data Modes—BCD Mode (DM = 0)
                        sshi=read_ds(4);                                        //读取时数据
                        week=read_ds(6);                                        //读取星期数据
                        day=read_ds(7);                                                //读取日数据
                        month=read_ds(8);                                        //读取月数据
                        year=read_ds(9);                                        //读取年数据
                        delay_us(2000);                                                //20ms
                        write_miao_data(miao);                                //向LCM屏幕写秒数据
                        write_fen_data(fen);                                //向LCM屏幕写分数据
                        write_shi_data(sshi);                                //向LCM屏幕写是数据
                        write_week_data(week);                                //向LCM屏幕写星期数据
                        write_day_data(day);                                //向LCM屏幕写日数据
                        write_month_data(month);                        //向LCM屏幕写月数据
                        write_year_data(year);                                //向LCM屏幕写年数据
                }
                if (bgc_flag == 0)
                {
                        if (BGC == 0)                                                   //判断背光控制按钮是否按下
                        {
                                delay_us(2000);                                        //20ms
                                if (BGC == 0)
                                {
                                        while (!BGC);
                                        _BG = 1;
                                        bgc_flag = 1;
                                }                       
                        }
                }
                if (bgc_flag == 1)
                {
                        if (BGC == 0)                                                   //判断背光控制按钮是否按下  
                        {
                                delay_us(2000);                                        //20ms
                                if (BGC == 0)
                                {
                                        while (!BGC);
                                        _BG = 0;
                                        bgc_flag = 0;
                                }                       
                        }
                }
        }
}

出0入0汤圆

 楼主| 发表于 2011-11-29 06:30:43 | 显示全部楼层
#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);
        }
}

出0入0汤圆

 楼主| 发表于 2011-11-29 06:31:42 | 显示全部楼层
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

//对齐方式:左上
//纵向取模 高位在下
//字体:宋体 大小17*16点阵 取模大小16*16点阵

//    显示空格字模
uchar code nullhz[]=
{
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
};
//    汉字年月日星期字模
uchar code logohz1[]=
{
/*年   CC4EA */
0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
};
uchar code logohz2[]=
{
/*月   CD4C2 */
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
};
uchar code logohz3[]=
{
/*日   CC8D5 */
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
};
uchar code logohz4[]=
{
/*星   CD0C7 */
0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,
};
uchar code logohz5[]=
{
/*期   CC6DA */
0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00,
};
//           :字模
uchar code ch11[]={       
/*:   CHAR_3A */
0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,
};
//    修改时间标识字模  方块
uchar code ch12[] = {
/*   CHAR_01 */
0x00,0xFC,0xFC,0x0C,0x0C,0xFC,0xFC,0x00,0x00,0x0F,0x0F,0x0C,0x0C,0x0F,0x0F,0x00,
};
//    数字字模
uchar code chardot[192] = {
/*0   CHAR_30 */
0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,
/*1   CHAR_31 */
0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
/*2   CHAR_32 */
0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
/*3   CHAR_33 */
0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
/*4   CHAR_34 */
0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
/*5   CHAR_35 */
0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
/*6   CHAR_36 */
0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
/*7   CHAR_37 */
0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
/*8   CHAR_38 */
0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
/*9   CHAR_39 */
0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
/*,   CHAR_2C */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
/*.   CHAR_2E */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,

};
//   汉字星期字模
uchar code hzdot[224] = {
/*日   CC8D5 */
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,

/*一   CD2BB */
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*二   CB6FE */
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,

/*三   CC8FD */
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

/*四   CCBC4 */
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,

/*五   CCEE5 */
0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,

/*六   CC1F9 */
0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,

};

出0入0汤圆

发表于 2012-7-23 21:05:52 | 显示全部楼层
怎么这么多啊 ?

出0入0汤圆

发表于 2012-7-30 10:07:39 | 显示全部楼层
怎么不能传一个压缩包

出0入0汤圆

发表于 2012-7-31 21:15:00 | 显示全部楼层
书写很规范啊,赞一个

出0入0汤圆

发表于 2013-3-5 22:39:44 | 显示全部楼层
写了那么多,慢慢看,先顶一个。
头像被屏蔽

出0入0汤圆

发表于 2013-3-7 08:24:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-3-7 16:04:33 | 显示全部楼层
哈哈                  cool                                             
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 07:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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