找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2588|回复: 5
收起左侧

求助 万年历程序怎么把按键程序加进去

[复制链接]
ID:106613 发表于 2016-2-28 15:39 | 显示全部楼层 |阅读模式
/*
#include<reg52.h>
sbit a = P3^4;
void delay(unsigned int z)
{
        unsigned int x,y;
        for(x = z;x > 0;x--)
        for (y = 110;y > 0;y--);
}
void main()
{
        while(1)
        {
            a = 0;
                delay(1);
                a = 1;
                delay(1);
         

        }
*/
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DB  P0
sbit IO_18B20 = P3^4;  //DS18B20í¨DÅòy½Å
sbit LCD1602_RS = P2^5;
sbit LCD1602_RW = P2^6;
sbit LCD1602_E  = P2^7;
sbit DS1302_CE = P1^6;
sbit DS1302_CK = P1^4;
sbit DS1302_IO = P1^5;
bit flag200ms = 0;       //200ms¶¨ê±±êÖ¾
bit flag1s = 0;          //1s¶¨ê±±êÖ¾
unsigned char T1RH = 0 ;
unsigned char T1RL = 0 ;
unsigned char T0RH = 0 ;  //T0ÖØÔØÖμμĸß×Ö½ú
unsigned char T0RL = 0 ;  //T0ÖØÔØÖμμÄμí×Ö½ú
//′yÏÔê¾μÄμúò»DD×Ö·û′®
//unsigned char code str1[] = "Kingst Studio";
//′yÏÔê¾μÄμú¶tDD×Ö·û′®£¬Dè±£3Öóëμúò»DD×Ö·û′®μè3¤£¬½Ï¶ìμÄDD¿éóÿոñ21Æë
//unsigned char code str2[] = "Let's move...";
unsigned char IntToString(unsigned char *str, int dat);
bit Start18B20();
bit Get18B20Temp(int *temp);
void InitDS1302();
void DS1302BurstRead(unsigned char *dat);
void ConfigTimer0(unsigned int ms);
void ConfigTimer1(unsigned int ms);
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y,
                unsigned char *str);


/* μè′yòo¾§×¼±¸oà */
void LcdWaitReady()
{
    unsigned char sta;

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //¶áè¡×′ì¬×Ö
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7μèóú1±íê¾òo¾§ÕyÃ|£¬Öظ′¼ì2aÖ±μ½Æäμèóú0ÎaÖ1
}
/* ÏòLCD1602òo¾§D′èëò»×Ö½úÃüácmd-′yD′èëÃüáîÖμ */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* ÏòLCD1602òo¾§D′èëò»×Ö½úêy¾Y£¬dat-′yD′èëêy¾YÖμ */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}

/* 3õê¼»ˉ1602òo¾§ */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2ÏÔê¾£¬5*7μãÕó£¬8λêy¾Y½ó¿ú
    LcdWriteCmd(0x0C);  //ÏÔê¾Æ÷¿a£¬1a±ê1رÕ
    LcdWriteCmd(0x06);  //ÎÄ×Ö2»¶ˉ£¬μØÖ·×Ô¶ˉ+1
    LcdWriteCmd(0x01);  //ÇåÆá
}

/* éèÖÃÏÔê¾RAMÆeê¼μØÖ·£¬òà¼′1a±êλÖã¬(x,y)-¶Ôó|ÆáÄ»éÏμÄ×Ö·û×ø±ê */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;

    if (y == 0)  //óéêäèëμÄÆáÄ»×ø±ê¼ÆËãÏÔê¾RAMμÄμØÖ·
        addr = 0x00 + x;  //μúò»DD×Ö·ûμØÖ·′ó0x00Æeê¼
    else
        addr = 0x40 + x;  //μú¶tDD×Ö·ûμØÖ·′ó0x40Æeê¼
    LcdWriteCmd(addr | 0x80);  //éèÖÃRAMμØÖ·
}
/* Ôúòo¾§éÏÏÔê¾×Ö·û′®£¬(x,y)-¶Ôó|ÆáÄ»éÏμÄÆeê¼×ø±ê£¬str-×Ö·û′®Ö¸Õë */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);   //éèÖÃÆeê¼μØÖ·
    while (*str != '\0')  //á¬DøD′èë×Ö·û′®êy¾Y£¬Ö±μ½¼ì2aμ½½áêø·û
    {
        LcdWriteDat(*str++);
    }
}
       
/* ·¢Ëíò»¸ö×Ö½úμ½DS1302í¨DÅ×üÏßéÏ */
void DS1302ByteWrite(unsigned char dat)
{
    unsigned char mask;

    for (mask=0x01; mask!=0; mask<<=1)  //μíλÔúÇ°£¬ÖeλòÆ3ö
    {
        if ((mask&dat) != 0) //ê×Ïèêä3ö¸Ãλêy¾Y
            DS1302_IO = 1;
        else
            DS1302_IO = 0;
        DS1302_CK = 1;       //è»oóà-¸ßê±Öó
        DS1302_CK = 0;       //Ôùà-μíê±Öó£¬íê3éò»¸öλμÄ2ù×÷
    }
    DS1302_IO = 1;           //×îoóè·±£êí·ÅIOòy½Å
}
/* óéDS1302í¨DÅ×üÏßé϶áè¡ò»¸ö×Ö½ú */
unsigned char DS1302ByteRead()
{
    unsigned char mask;
    unsigned char dat = 0;

    for (mask=0x01; mask!=0; mask<<=1)  //μíλÔúÇ°£¬Öeλ¶áè¡
    {
        if (DS1302_IO != 0)  //ê×Ïè¶áè¡′Ëê±μÄIOòy½Å£¬2¢éèÖÃdatÖDμĶÔó|λ
        {
            dat |= mask;
        }
        DS1302_CK = 1;       //è»oóà-¸ßê±Öó
        DS1302_CK = 0;       //Ôùà-μíê±Öó£¬íê3éò»¸öλμÄ2ù×÷
    }
    return dat;              //×îoó·μ»Ø¶áμ½μÄ×Ö½úêy¾Y
}
/* óÃμ¥′ÎD′2ù×÷ÏòÄ3ò»¼Ä′æÆ÷D′èëò»¸ö×Ö½ú£¬reg-¼Ä′æÆ÷μØÖ·£¬dat-′yD′èë×Ö½ú */
void DS1302SingleWrite(unsigned char reg, unsigned char dat)
{
    DS1302_CE = 1;                   //ê1ÄüƬѡDÅoÅ
    DS1302ByteWrite((reg<<1)|0x80);  //·¢ËíD′¼Ä′æÆ÷Ö¸áî
    DS1302ByteWrite(dat);            //D′èë×Ö½úêy¾Y
    DS1302_CE = 0;                   //3yÄüƬѡDÅoÅ
}
/* óÃμ¥′ζá2ù×÷′óÄ3ò»¼Ä′æÆ÷¶áè¡ò»¸ö×Ö½ú£¬reg-¼Ä′æÆ÷μØÖ·£¬·μ»ØÖμ-¶áμ½μÄ×Ö½ú */
unsigned char DS1302SingleRead(unsigned char reg)
{
    unsigned char dat;

    DS1302_CE = 1;                   //ê1ÄüƬѡDÅoÅ
    DS1302ByteWrite((reg<<1)|0x81);  //·¢Ëí¶á¼Ä′æÆ÷Ö¸áî
    dat = DS1302ByteRead();          //¶áè¡×Ö½úêy¾Y
    DS1302_CE = 0;                   //3yÄüƬѡDÅoÅ

    return dat;
}
void  DS1302BurstWrite(unsigned char *dat)
{
        unsigned char i;

        DS1302_CE = 1;
        DS1302ByteWrite(0xBE);
        for(i=0; i<8; i++)
        {
                DS1302ByteWrite(dat[i]);
        }
        DS1302_CE = 0;
}

void  DS1302BurstRead(unsigned char *dat)
{
        unsigned char i;

        DS1302_CE = 1;
        DS1302ByteWrite(0xBF);
        for(i=0; i<8; i++)
        {
                dat[i] = DS1302ByteRead();
        }
        DS1302_CE = 0;
}
/* DS13023õê¼»ˉ£¬èç·¢éúμôμçÔòÖØDÂéèÖÃ3õê¼ê±¼ä */
void InitDS1302()
{
    unsigned char dat;
    unsigned char code InitTime[] = {  //2013Äê10ÔÂ8èÕ DÇÆú¶t 12:30:00
        0x00,0x53,0x20, 0x07, 0x01, 0x04, 0x16
    };

    DS1302_CE = 0;  //3õê¼»ˉDS1302í¨DÅòy½Å
    DS1302_CK = 0;
    dat = DS1302SingleRead(0);  //¶áè¡Ãë¼Ä′æÆ÷
    if ((dat & 0x80) != 0)      //óéÃë¼Ä′æÆ÷×î¸ßλCHμÄÖμÅD¶ÏDS1302êÇ·ñòÑí£Ö1
    {
        DS1302SingleWrite(7, 0x00);  //3·ÏúD′±£»¤òÔÔêDíD′èëêy¾Y
        DS1302BurstWrite(InitTime);  //éèÖÃDS1302ÎaĬèÏμÄ3õê¼ê±¼ä
    }
}
/* ÅäÖÃ2¢Æô¶ˉT1£¬ms-T1¶¨ê±ê±¼ä */
void ConfigTimer1(unsigned int ms)
{
    unsigned long tmp;  //áùê±±äá¿

    tmp = 11059200 / 12;      //¶¨ê±Æ÷¼ÆêyÆμÂê
    tmp = (tmp * ms) / 1000;  //¼ÆËãËùDèμļÆêyÖμ
    tmp = 65536 - tmp;        //¼ÆË㶨ê±Æ÷ÖØÔØÖμ
    tmp = tmp + 12;           //213¥ÖD¶ÏÏìó|Ñóê±Ôì3éμÄÎó2î
    T1RH = (unsigned char)(tmp>>8);  //¶¨ê±Æ÷ÖØÔØÖμ2e·ÖÎa¸ßμí×Ö½ú
    T1RL = (unsigned char)tmp;
    TMOD &= 0x0F;   //ÇåáãT1μÄ¿ØÖÆλ
    TMOD |= 0x10;   //ÅäÖÃT1ÎaÄ£ê½1
    TH1 = T1RH;     //¼óÔØT1ÖØÔØÖμ
    TL1 = T1RL;
    ET1 = 1;        //ê1ÄüT1ÖD¶Ï
    TR1 = 1;        //Æô¶ˉT1
}

/* ÅäÖÃ2¢Æô¶ˉT0£¬ms-T0¶¨ê±ê±¼ä */
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //áùê±±äá¿

    tmp = 11059200 / 12;      //¶¨ê±Æ÷¼ÆêyÆμÂê
    tmp = (tmp * ms) / 1000;  //¼ÆËãËùDèμļÆêyÖμ
    tmp = 65536 - tmp;        //¼ÆË㶨ê±Æ÷ÖØÔØÖμ
    tmp = tmp + 12;           //213¥ÖD¶ÏÏìó|Ñóê±Ôì3éμÄÎó2î
    T0RH = (unsigned char)(tmp>>8);  //¶¨ê±Æ÷ÖØÔØÖμ2e·ÖÎa¸ßμí×Ö½ú
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //ÇåáãT0μÄ¿ØÖÆλ
    TMOD |= 0x01;   //ÅäÖÃT0ÎaÄ£ê½1
    TH0 = T0RH;     //¼óÔØT0ÖØÔØÖμ
    TL0 = T0RL;
    ET0 = 1;        //ê1ÄüT0ÖD¶Ï
    TR0 = 1;        //Æô¶ˉT0
}
  /* èí¼tÑóê±oˉêy£¬Ñóê±ê±¼ä(t*10)us */
void DelayX10us(unsigned char t)
{
    do {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    } while (--t);
}
bit Get18B20Ack()
{
        bit ack;

        EA = 0;
        IO_18B20 = 0;
        DelayX10us(50);
        IO_18B20 = 1;
        DelayX10us(6);
        ack = IO_18B20;
        while(!IO_18B20);
        EA = 1;

        return ack;
}

void  Write18B20(unsigned char dat)
{
        unsigned char mask;
        EA = 0;
        for(mask=0x01; mask!= 0; mask<<=1)
        {
                IO_18B20 = 0;
                _nop_();
                _nop_();
                if((mask&dat) == 0)
                        IO_18B20 = 0;
                else
                        IO_18B20 = 1;
                DelayX10us(6);
                IO_18B20 = 1;
        }
        EA = 1;
}

unsigned char Read18B20()
{
        unsigned char dat;
        unsigned char mask;

        EA = 0;
        for(mask=0x01; mask!=0; mask<<=1)
        {
                IO_18B20 = 0;
                _nop_();
                _nop_();
                IO_18B20 = 1;
                _nop_();
                _nop_();
                if(!IO_18B20)
                        dat &= ~mask;
                else
                        dat |= mask;
                DelayX10us(6);
        }
        EA = 1;

        return dat;
}

bit Start18B20()
{
        bit ack;

        ack = Get18B20Ack();
        if(ack == 0)
        {
                Write18B20(0xCC);
                Write18B20(0x44);
        }
        return ~ack;
}

bit Get18B20Temp(int *temp)
{
        bit ack;
        unsigned char LSB, MSB;

        ack = Get18B20Ack();
        if(ack == 0)
        {
                Write18B20(0xCC);
                Write18B20(0xBE);
                LSB = Read18B20();
                MSB = Read18B20();
                *temp = ((int)MSB<<8) + LSB;
        }
        return ~ack;
}

void main()
{
    unsigned char psec=0xAA;  //Ã뱸·Y£¬3õÖμAAè·±£ê×′ζáè¡ê±¼äoó»áË¢DÂÏÔê¾
    unsigned char time[8];    //μ±Ç°ê±¼äêy×é
    unsigned char str[12];    //×Ö·û′®×a»»»o3åÇø
        unsigned char str1[12];
        bit res;
    int temp;        //¶áè¡μ½μÄμ±Ç°Î¶èÖμ
    int intT, decT;  //ζèÖμμÄÕûêyoíD¡êy2¿·Ö
    unsigned char len;
    EA = 1;           //¿a×üÖD¶Ï
    ConfigTimer1(1);  //T0¶¨ê±1ms
        ConfigTimer0(10);
    InitDS1302();     //3õê¼»ˉêμê±ê±Öó
    InitLcd1602();    //3õê¼»ˉòo¾§
    Start18B20();      //Æô¶ˉDS18B20
    while (1)
  {
                if (flag1s)  //ÿÃë¸üDÂò»′Îζè
        {
            flag1s = 0;
            res = Get18B20Temp(&temp);  //¶áè¡μ±Ç°Î¶è
            if (res)                    //¶áè¡3é1|ê±£¬Ë¢DÂμ±Ç°Î¶èÏÔê¾
            {
                intT = temp >> 4;             //·Öàë3öζèÖμÕûêy2¿·Ö
                decT = temp & 0xF;            //·Öàë3öζèÖμD¡êy2¿·Ö
                len = IntToString(str1, intT); //Õûêy2¿·Ö×a»»Îa×Ö·û′®
                str1[len++] = '.';             //ìí¼óD¡êyμã
                decT = (decT*10) / 16;        //¶t½øÖÆμÄD¡êy2¿·Ö×a»»Îa1λꮽøÖÆλ
                str1[len++] = decT + '0';      //ꮽøÖÆD¡êyλÔù×a»»ÎaASCII×Ö·û
                while (len < 6)               //óÿոñ21Æëμ½6¸ö×Ö·û3¤¶è
                {
                    str1[len++] = ' ';
                }
                str1[len] = '\0';              //ìí¼ó×Ö·û′®½áêø·û
                LcdShowStr(10, 1, str1);        //ÏÔê¾μ½òo¾§ÆáéÏ
                                LcdWriteCmd(0x80+0x40+14);
                LcdWriteDat(0xdf);
                     LcdWriteDat('C');
            }
            else                        //¶áè¡ê§°üê±£¬ìáê¾′íÎóDÅÏ¢
            {
                LcdShowStr(10, 1, "error!");
            }
            Start18B20();               //ÖØDÂÆô¶ˉÏÂò»′Î×a»»
        }
        if (flag200ms)  //ÿ200ms¶áè¡òà′Îê±¼ä
        {
            flag200ms = 0;
            DS1302BurstRead(time); //¶áè¡DS1302μ±Ç°ê±¼ä
            if (psec != time[0])   //¼ì2aμ½ê±¼äóD±ä»ˉê±Ë¢DÂÏÔê¾
            {
                str[0] = '2';  //ìí¼óÄê·Yμĸß2λ£o20
               str[1] = '0';
                str[2] = (time[6] >> 4) + '0';  //¡°Äꡱ¸ßλêy×Ö×a»»ÎaASCIIÂë
                str[3] = (time[6]&0x0F) + '0';  //¡°Äꡱμíλêy×Ö×a»»ÎaASCIIÂë
                str[4] = '-';  //ìí¼óèÕÆú·Ö¸ô·û
                str[5] = (time[4] >> 4) + '0';  //¡°Ô¡±
                str[6] = (time[4]&0x0F) + '0';
                str[7] = '-';
                str[8] = (time[3] >> 4) + '0';  //¡°èÕ¡±
                str[9] = (time[3]&0x0F) + '0';
                str[10] = '\0';
                LcdShowStr(0, 0, str);  //ÏÔê¾μ½òo¾§μÄμúò»DD

                str[0] = (time[5]&0x0F) + '0';  //¡°DÇÆú¡±
                str[1] = '\0';
                LcdShowStr(11, 0, "week");
                LcdShowStr(15, 0, str);  //ÏÔê¾μ½òo¾§μÄμúò»DD

                str[0] = (time[2] >> 4) + '0';  //¡°ê±¡±
                str[1] = (time[2]&0x0F) + '0';
                str[2] = ':';  //ìí¼óê±¼ä·Ö¸ô·û
                str[3] = (time[1] >> 4) + '0';  //¡°·Ö¡±
                str[4] = (time[1]&0x0F) + '0';
                str[5] = ':';
                str[6] = (time[0] >> 4) + '0';  //¡°Ã롱
                str[7] = (time[0]&0x0F) + '0';
                str[8] = '\0';
                LcdShowStr(1, 1, str);  //ÏÔê¾μ½òo¾§μÄμú¶tDD

                psec = time[0];  //óÃμ±Ç°Öμ¸üDÂéÏ′ÎÃëêy
            }
        }
        }
}
/* ÕûDíêy×a»»Îa×Ö·û′®£¬str-×Ö·û′®Ö¸Õ룬dat-′y×a»»êy£¬·μ»ØÖμ-×Ö·û′®3¤¶è */
unsigned char IntToString(unsigned char *str, int dat)
{
    signed char i = 0;
    unsigned char len = 0;
    unsigned char buf[6];

    if (dat < 0)  //èç1ûÎa¸oêy£¬ê×Ïè衾ø¶ÔÖ죬2¢ÔúÖ¸ÕëéÏìí¼ó¸ooÅ
    {
        dat = -dat;
        *str++ = '-';
        len++;
    }
    do {          //Ïè×a»»ÎaμíλÔúÇ°μÄꮽøÖÆêy×é
        buf[i++] = dat % 10;
        dat /= 10;
    } while (dat > 0);
    len += i;     //i×îoóμÄÖμ¾íêÇóDD§×Ö·ûμĸöêy
    while (i-- > 0)   //½«êy×éÖμ×a»»ÎaASCIIÂë·′Ïò¿½±′μ½½óêÕÖ¸ÕëéÏ
    {
        *str++ = buf[i] + '0';
    }
    *str = '\0';  //ìí¼ó×Ö·û′®½áêø·û

    return len;   //·μ»Ø×Ö·û′®3¤¶è
}
  /* T0ÖD¶Ï·tÎñoˉêy£¬íê3é1Ãë¶¨ê± */
void InterruptTimer0() interrupt 1
{
    static unsigned char tmr1s = 0;

    TH0 = T0RH;  //ÖØD¼óÔØÖØÔØÖμ
    TL0 = T0RL;
    tmr1s++;
    if (tmr1s >= 100)  //¶¨ê±1s
    {
        tmr1s = 0;
        flag1s = 1;
    }
}

/* T1ÖD¶Ï·tÎñoˉêy£¬Ö′DD200ms¶¨ê± */
void InterruptTimer1() interrupt 3
{
    static unsigned char tmr200ms = 0;

    TH1 = T1RH;  //ÖØD¼óÔØÖØÔØÖμ
    TL1 = T1RL;
    tmr200ms++;
    if (tmr200ms >= 200)  //¶¨ê±200ms
    {
        tmr200ms = 0;
        flag200ms = 1;
    }
}


360截图20160228153617062.jpg
360截图20160228153626084.jpg
回复

使用道具 举报

ID:105890 发表于 2016-2-29 17:23 | 显示全部楼层
注释的怎回事?
回复

使用道具 举报

ID:106613 发表于 2016-2-29 18:59 | 显示全部楼层
河马 发表于 2016-2-29 17:23
注释的怎回事?

复制过来 粘贴就这样了
回复

使用道具 举报

ID:106613 发表于 2016-2-29 18:59 | 显示全部楼层
河马 发表于 2016-2-29 17:23
注释的怎回事?

你会么
回复

使用道具 举报

ID:106705 发表于 2016-2-29 20:31 | 显示全部楼层
一般的处理方式是在main函数中的while(1)里面添加按键的处理程序。
void main()
{
... ...
  while(1)
  {//只处理单按键的方式
    switch(P2)
    {
      case 0x01:
      {//S3处理
      }break;
      case 0x02:
      {//S4处理
      }break;
      case 0x04:
      {//S5处理
      }break;
      case 0x08;
      {//S6处理
      }break;
      default:
      break;
    }
     if (flag1s) ... ...
    ... ...
  }
}
回复

使用道具 举报

ID:36525 发表于 2016-2-29 20:32 | 显示全部楼层
注释怎么是乱码。整理一下重发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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