久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 933|回復: 3
打印 上一主題 下一主題
收起左側

可以幫忙看看單片機程序哪里錯了么,用獨立按鍵控制有問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:694497 發表于 2020-2-17 22:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

typedef unsigned int u16;
typedef unsigned char u8;

sbit LCDEN=P2^7;
sbit LCDRS=P2^6;
sbit LCDRW=P2^5;
sbit DSIO=P3^4;
sbit RST=P3^5;         //CE
sbit SCLK=P3^6;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;

uchar code WRITE_RTC_ADDR[3] = {0x80, 0x82, 0x84};//寫入秒分時的地址命令
uchar code READ_RTC_ADDR[3] = {0x81, 0x83, 0x85};//讀秒分時日月周年的地址命令
uchar TIME[7] = {0x54, 0x57, 0x23};//秒分時日月周年的各個數據
uchar SetState,SetPlace;

void delay(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
            
}

void Write_Cmd(unsigned char C)        //寫命令
{
        LCDEN=0;
        LCDRS=0;
        LCDRW=0;
        P0=C;
        delay(1);
        LCDEN=1;
        delay(5);
        LCDEN=0;
}

void Write_Data(unsigned char D)//寫數據
{
        LCDEN=0;
        LCDRS=1;
        LCDRW=0;
        P0=D;
        delay(1);
        LCDEN=1;
        delay(5);
        LCDEN=0;
}

void LCD_Init()         //LCD初始化
{
        LCDRS=0;
        Write_Cmd(0x38);   //開顯示
        Write_Cmd(0x0c);   //開顯示不顯示光標
        Write_Cmd(0x06);   //寫一個指針加1
        //Write_Cmd(0x01);    //清屏
        Write_Cmd(0x80);        //設置數據指針起點
}


void Ds1302Write(uchar addr,uchar dat)           //向DS1302寫地址,數據
{
        uchar n;
        RST=0;
        _nop_();
        SCLK=0;
    _nop_();
        RST=1;
        _nop_();
        for(n=0;n<8;n++)   //開始傳送八位地址命令
        {
                DSIO=addr&0x01;          //數據從低位開始傳送
                addr>>=1;
                SCLK=1;                 //數據在上升沿(SCLK)時,向DS1302寫數據
                _nop_();
                SCLK=0;
                _nop_();
        }
        for(n=0;n<8;n++)   //寫入8位數據
        {
                DSIO=dat&0x01;           //數據從低位開始傳送
                dat>>=1;
                SCLK=1;          //數據在上升沿(SCLK)時,向DS1302寫數據
                _nop_();
                SCLK=0;
                _nop_();
        }
}

uchar Ds1302Read(uchar addr)   //DS1302讀數據
{
        uchar n,dat,dat1;
        RST=0;
        _nop_();
        SCLK=0;
    _nop_();
        RST=1;
        _nop_();
        for(n=0;n<8;n++) //讀一個字節(八位)的地址
    {
                DSIO=addr&0x01;
                addr>>=1;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        _nop_();
        for(n=0;n<8;n++)
        {
                dat1=DSIO;
                dat=(dat>>1)|(dat1<<7);
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        RST=0;
        _nop_();
        SCLK=1;
        _nop_();
        SCLK=0;
        _nop_();
        DSIO=0;
        _nop_();
        DSIO=1;
        _nop_();
        return dat;
}

void Ds1302Init()        //DS1302初始化
{
         uchar n;
         Ds1302Write(0x8E,0x00);//禁止寫保護,關閉寫保護功能
         for(n=0;n<3;n++)          //寫入3個字節的時鐘信號:分秒時
         {
                   Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
         }
         Ds1302Write(0x8E,0x80);//打開寫保護功能
}

void Ds1302Read()//讀取時鐘信息
{
        uchar n;
        for(n=0;n<3;n++)
        {
                TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);
        }
}

void shuzu()
{
        Write_Cmd(0x80);
        Write_Data('0'+TIME[2]/16);                                //時
        Write_Data('0'+(TIME[2]&0x0f));                                 
        Write_Data('-');
        Write_Data('0'+TIME[1]/16);                                //分
        Write_Data('0'+(TIME[1]&0x0f));        
        Write_Data('-');
        Write_Data('0'+TIME[0]/16);                                //秒
        Write_Data('0'+(TIME[0]&0x0f));        
}

void INT1Timer1()  //外部中斷T1的配置
{
         IT1=1;
         EX1=1;
         EA=1;
}

void main()
{
        u8 i=0;
    Ds1302Init();
    LCD_Init();
        INT1Timer1();
        while(1)
        {
                if(SetState==0)
                {
                        Ds1302Read();
                }
                else
                if(k1==0)
                {
                        delay(100);
                        if(k1==0)
                        {
                                SetPlace++;
                                if(SetPlace>3)
                                {
                                        SetPlace=0;
                                }
                        }
                }
                if(k2==0)
                {
                        delay(200);
                        if(k2==0)
                        {
                                TIME[SetPlace]++;
                                if(TIME[SetPlace]>=0x60&&(SetPlace<2))  //秒和分不能加到超過60,超過60變為0
                                {
                                        TIME[SetPlace]=0;
                                }
                                if(TIME[SetPlace]>=0x24&&(SetPlace=2))        //小時不能超過23,超過23變為0
                                {
                                        TIME[SetPlace]=0;
                                }
                        }
                        if(k3==0)
                        {
                                delay(200);
                                if(k3==0)
                                {
                                        TIME[SetPlace]--;
                                        if(TIME[SetPlace]<0&&(SetPlace<2))           //秒和分不能減至負數,小于0則變為59
                                        {
                                                TIME[SetPlace]=0x59;
                                        }
                                        if(TIME[SetPlace]<0&&(SetPlace=2))          //小時不能減至負數,小于0則變為23
                                        {
                                                TIME[SetPlace]=0x23;
                                        }
                                }
                        }
                }
                shuzu();
        }
}

void Int1() interrupt 2           //中斷服務程序
{
         delay(10);
         if(k4==0)
         {
                  SetState=~SetState;
                 SetPlace=0;
                 Ds1302Init();
         }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:677678 發表于 2020-2-20 18:48 | 只看該作者
干嘛用中斷,直接讀取io口電平變化,中斷里面最好不要寫東西,   個人建議  
回復

使用道具 舉報

板凳
ID:687423 發表于 2020-2-21 10:13 | 只看該作者
中斷里的延時程序時間太長了,縮短一點。
回復

使用道具 舉報

地板
ID:679425 發表于 2020-2-21 14:00 | 只看該作者
中斷里的延時程序時間太長
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久高清 | 久久高潮 | 成人国产精品久久久 | 欧美精品v国产精品v日韩精品 | 97人澡人人添人人爽欧美 | 久久久精品视频免费看 | 91精品一区 | 一级做a爰片性色毛片视频停止 | 欧美日韩国产一区二区三区不卡 | 奇米影视77 | 日韩欧美在线观看 | 午夜寂寞影院在线观看 | 免费亚洲成人 | www.久久久久久久久久久久 | 亚洲午夜av久久乱码 | 中文字幕在线观看一区 | 精品久久国产 | 欧美国产日韩在线观看 | 看毛片的网站 | 久久久久久国产精品免费 | 日韩在线观看 | h视频免费在线观看 | 午夜av影院 | www.中文字幕.com | 亚洲精品成人在线 | 99精品视频在线 | 欧美三级成人理伦 | 欧美午夜精品 | 成在线人视频免费视频 | 免费黄色在线观看 | 成人不卡 | 91资源在线观看 | 91青青草视频 | 在线国产视频 | 一级片免费视频 | 99福利视频| 嫩草一区二区三区 | 看片wwwwwwwwwww| 久久精品小视频 | 久久精品91 | 在线视频一区二区三区 |