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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

lcd屏幕單片機電子鐘為啥不能加減,大神幫忙看下

查看數: 3948 | 評論數: 12 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-1-25 17:03

正文摘要:

上面是我的程序,圖片是我的仿真圖,時鐘功能正常,就是不能在暫停時加減 #include "reg51.h" typedef unsigned int u16;          //對數據類型進行聲明定義 typedef uns ...

回復

ID:318185 發表于 2019-1-27 10:03
a601623202 發表于 2019-1-27 08:32
調試中發現把keyscan函數中的s2按鍵部分重新寫在一個新的函數中,然后在主函數中keyscan()

的下面調用那個新函數,就可以正常運行加減了
ID:318185 發表于 2019-1-27 08:32
調試中發現把keyscan函數中的s2按鍵部分重新寫在一個新的函數中,然后在主函數中keyscan()
ID:96682 發表于 2019-1-26 16:02
a601623202 發表于 2019-1-26 10:58
我按鍵是取矩陣按鍵的最后一列來用,是不是不能這樣用,有點懵

去 86 行找答案
ID:213173 發表于 2019-1-26 16:01
a601623202 發表于 2019-1-26 10:57
我在矩陣按鍵里取最后一列來做,獨立按鍵使,后來換成獨立按鍵也不行

給你一個示例,是壇友寫的,改按你的接法。用4了個按鍵。



/*******************************
STC89C52RC,晶振11.0592MHz
(如果晶振12MHz時間更準些)
********************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_EN=P2^7;                                 //定義1602液晶LCDEN端,使能信號
sbit LCD_RS=P2^6;                                 //定義1602液晶RS端,數據/命令選擇端(H/L)
//sbit LCD_RW=P2^5;                         //定義1602液晶RW端,讀/寫選擇端(H/L)已接地禁止讀
sbit BUZZ=P2^3;                                 //定義蜂鳴器端,按鍵釋放和整點響
sbit key_1=P3^0;                                //進入調試方式
sbit key_2=P3^1;                                //調試+
sbit key_3=P3^2;                                //調試-
sbit key_4=P3^3;                                //退出調試方式
sbit MND_1=P3^7;                                //矩陣鍵盤模擬地

uchar code keycode[] = {0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,//按鍵鍵值
                        0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
uchar yue,ri,shi,fen,miao,week,nian;         //月、日、時、分、秒、周、年變量
uchar flag=0;        //功能鍵計數變量
uint count=0;        //中斷計數變量
bit Cnt1s=0;        //秒標志
uchar code table[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};//顯示周

/***********毫秒級延時函數**********/
void delay(uint x)
{
        uint y,z;
        for(y=x;y>0;y--)
                for(z=110;z>0;z--);
}
/***********蜂鳴器發聲函數**********/
void di(uint dd)
{
        BUZZ=0;
        delay(dd);
        BUZZ=1;
}
/***********LCD1602忙等待**********/
/*
uchar busycheck()
{
        uchar s;                        //臨時變量
        LCD_RS=0;                //允許寫指令
//        LCD_RW=1;                //允許讀數據(讀寫端已接地,禁止讀)
        LCD_EN=1;                //高電平使能讀數據
        delay(1);                //延時
        s=P0;                                //讀P0數據賦值s
        LCD_EN=0;                //低跳變執行
        return s;                //返回s值 s=0x80有效
}
*/
/***********液晶寫指令函數**********/
void write_com(uchar com)
{
//        while((busycheck()&0x80)==0x80);//忙等待
        LCD_RS=0;        //允許寫指令
//        LCD_RW=0;        //讀寫端已接地,禁止讀
        LCD_EN=0;        //初始設置LCD_EN低電平
        P0=com;                //傳遞指令
        delay(5);        //延時
        LCD_EN=1;        //使能寫入
        delay(5);        //延時
        LCD_EN=0;        //低跳變執行
}

/***********液晶寫數據函數**********/
void write_date(uchar date)
{
//        while((busycheck()&0x80)==0x80);//忙等待
        LCD_RS=1;        //允許寫數據
//        LCD_RW=0;        //讀寫端已接地,禁止讀
        LCD_EN=0;        //初始設置LCD_EN低電平
        P0 =date;        //傳遞數據
        delay(5);        //延時
        LCD_EN=1;        //使能寫入
        delay(5);        //延時
        LCD_EN=0;        //低跳變執行
}

/***********寫年函數**********/
void write_nian(uchar add,uchar date)reentrant  //reentrant定義為可重入函數,允許被遞歸調用
{
        uint bai,shi,ge;                //定義百、十、個變量
        bai=date/100;                        //分解百
        shi=date%100/10;                //分解十
        ge=date%100%10;                //分解個
        write_com(0x80+add); //寫指令、設置顯示位置
        write_date(0x30+bai);//寫數據百位0~9對應的字符碼是0x30~0x39
        write_date(0x30+shi);//寫數據十位
        write_date(0x30+ge); //寫數據個位
        /*write_date(dat[bai]);
        write_date(dat[shi]);
        write_date(dat[ge]);*/
}

/***********大小月份設置**********/
uchar dxy(uchar r)
{
        uchar k;
        switch(r)
        {
                case 1:
                        k=31;
                break;

                case 2: //閏年29天, 平年28天
                if((2000+nian)%100==0)
                        if((2000+nian)%400==0)
                                k=29;
                        else
                                k=28;
                        else if((2000+nian)%4==0)
                                k=29;
                        else
                                k=28;
                break;

                case  3:k=31;break;
                case  4:k=30;break;
                case  5:k=31;break;
                case  6:k=30;break;
                case  7:k=31;break;
                case  8:k=31;break;
                case  9:k=30;break;
                case 10:k=31;break;
                case 11:k=30;break;
                case 12:k=31;break;
        }
        return k;
}

/***********寫月、日、時、分、秒函數**********/
void write_yrsfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0x80+add); //設置顯示位置
        write_date(0x30+shi);
        write_date(0x30+ge);
        /*write_date(dat[shi]);
        write_date(dat[ge]);*/
}

/***********寫星期函數**********/
void write_week(uchar add,uchar date)
{
        uchar i;
        write_com(0x80+add); //設置顯示位置
        for(i=0;i<3;i++)
        {
                write_date(table[date]);
                delay(5);
        }
}

/***********初始化函數**********/
void init()
{
        count=0;                         //
//        P0=0xff;                         //關閉發光二極管
        write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
        write_com(0x0c); //設置開顯示,不顯示光標
        write_com(0x06); //寫一個字符后地址指針加1
        write_com(0x01); //顯示清零,數據指針清零
        write_com(0x80); //設置顯示初始位置
        write_com(0x80+1); //寫出年份的最高位“2”
        write_date('2');         //寫數據'2'
        write_com(0x80+5); //寫指令,顯示位置 日期顯示部分的的兩'-'
        write_date('-');         //寫數據'-'
        write_com(0x80+8); //寫指令,顯示位置 日期顯示部分的的兩'-'
        write_date('-');          //寫數據'-'
        write_com(0x80+0x40+6); //寫指令,時間顯示部分的的兩個“:”
        write_date(':');                //寫數據':'
        write_com(0x80+0x40+9); //寫指令,時間顯示部分的的兩個“:”
        write_date(':');                                //寫數據':'
        miao=0;                                                        //秒
        fen=0;                                                        //分
        shi=0;                                                        //時
        week=5;                                                //星期
        ri=20;                                      //日
        yue=5;                                      //月
        nian=17;                                              //年
        write_yrsfm(0x40+10,miao);        //寫入秒
        write_yrsfm(0x40+7,fen);        //寫入分
        write_yrsfm(0x40+4,shi);        //寫入時
        write_week(12,week);                   //寫入星期
        write_yrsfm(9,ri);                        //寫入日
        write_yrsfm(6,yue);                        //寫入月
        write_nian(2,nian);                        //寫入年
}
/***********按鍵掃描函數**********/
void keyscan()
{
        if(key_1==0) //功能鍵按下
        {
                delay(10); //消抖
                if(key_1==0)//功能鍵確認按下
                {
                        flag++; //記錄功能鍵按下次數
                        while(!key_1); //確認釋放功能鍵
                        di(100); //每當有按鍵釋放蜂鳴器發出滴聲提醒
                        if((flag==1)||(flag==8)) //第一次按下功能鍵光標閃爍到秒位置
                        {
                                TR0=0; //關閉定時器
                                write_com(0x80+0x40+11); //光標定位到秒位置
                                write_com(0x0f); //光標開始閃爍
                        }
                        if(flag==2) //第二次按下功能鍵光標閃爍到分鐘位置
                        {
                                write_com(0x80+0x40+8);
                        }
                        if(flag==3) //第三次按下功能鍵光標閃爍到時位置
                        {
                                write_com(0x80+0x40+5);
                        }
                        if(flag==4) //第四次按下功能鍵光標閃爍到星期位置
                        {
                                write_com(0x80+12);
                        }
                        if(flag==5) //第五次按下功能鍵光標閃爍到日位置
                        {
                                write_com(0x80+10);
                        }
                        if(flag==6) //第六次按下功能鍵光標閃爍到月位置
                        {
                                write_com(0x80+7);
                        }
                        if(flag==7) //第七次按下功能鍵光標閃爍到年位置
                        {
                                write_com(0x80+4);
                        }
                        if(flag==8) //第八次按下功能鍵退出功能鍵
                                flag=1; //記錄變成1;光標重新回到秒位置
                }
        }
        if(key_4==0) //退出調節
        {
                delay(10);
                if(key_4==0)
                {
                        while(!key_4); //釋放按鍵
                        if(TR0==0)
                        di(100); //只在調節時有按鍵釋放蜂鳴器發出滴聲
                        flag=0; //功能鍵按鍵次數清零
                        write_com(0x0c); //取消光標閃爍
                        count=0;
                        Cnt1s=0;
                        TR0=1; //啟動定時器
                }
        }
        if(flag!=0) //功能鍵按下后flag=1
        {  //增大鍵
                if(key_2==0) //只有功能鍵按下后,增大和減少鍵才有效
                {
                        delay(10);
                        if(key_2==0)//確認增加按下
                        {
                                while(!key_2); //釋放按鍵
                                di(100); //每當有按鍵釋放蜂鳴器發出滴聲提醒
                                if(flag==1) //功能鍵第一次按下調節秒
                                {
                                        miao++; //秒加1
                                        if(miao>59)
                                                miao=0;
                                        write_yrsfm(0x40+10,miao); //每調節一次送液晶顯示一下
                                        write_com(0x80+0x40+11); //顯示位置重新回到調節處
                                }
                                if(flag==2) //功能鍵第二次按下調節分
                                {
                                        fen++;
                                        if(fen>59)
                                                fen=0;
                                        write_yrsfm(0x40+7,fen);
                                        write_com(0x80+0x40+8);
                                }
                                if(flag==3) //功能鍵第三次按下調節時
                                {
                                        shi++;
                                        if(shi>23)
                                                shi=0;
                                        write_yrsfm(0x40+4,shi);
                                        write_com(0x80+0x40+5);
                                }
                                if(flag==4)    //功能鍵第四次按下調節星期
                                {
                                        week++;
                                        if(week>6)
                                                week=0;
                                        write_week(12,week);
                                        write_com(0x80+12);
                                }
                                if(flag==5) //功能鍵第五次按下調節日
                                {
                                        ri++;
                                        if(ri>(dxy(yue)))
                                                ri=1;
                                        write_yrsfm(9,ri);
                                        write_com(0x80+10);
                                }
                                if(flag==6) //功能鍵第六次按下調節月份
                                {
                                        yue++;
                                        if(yue>12)
                                                yue=1;
                                        write_yrsfm(6,yue);
                                        write_com(0x80+7);
                                }
                                if(flag==7)          //功能鍵第七次按下調節年份
                                {
                                        nian++;
                                        write_nian(2,nian);
                                        write_com(0x80+4);
                                }
                        }
                }
                //減少鍵
                if(key_3==0) //減少鍵被按下
                {
                        delay(10);
                        if(key_3==0)//確認減少鍵被按下
                        {
                                while(!key_3);//按鍵釋放
                                di(100); //每當有按鍵釋放蜂鳴器發出滴聲
                                if(flag==1) //功能鍵第一次按下調節秒
                                { //秒減1
                                        miao--;
                                        if((miao==(-1))||(miao>59)) //59到0循環遞減;
                                                miao=59;
                                        write_yrsfm(0x40+10,miao); //每調節一次送液晶顯示一下
                                        write_com(0x80+0x40+11); //顯示位置重新回到調節處
                                }
                                if(flag==2) //功能鍵第二次按下調節分
                                {
                                        fen--;
                                        if((fen==(-1))||(fen>59))
                                                fen=59;
                                        write_yrsfm(0x40+7,fen);
                                        write_com(0x80+0x40+8);
                                }
                                if(flag==3) //功能鍵第三次按下調節時
                                {
                                        shi--;
                                        if((shi==(-1))||(shi>23))
                                                shi=23;
                                        write_yrsfm(0x40+4,shi);
                                        write_com(0x80+0x40+5);
                                }
                                if(flag==4) //功能鍵第四次按下調節星期
                                {
                                        week--;
                                        if((week==(-1))||(week>6))
                                                week=6;
                                        write_week(12,week);
                                        write_com(0x80+12);
                                }
                                if(flag==5) //功能鍵第五次按下調節日
                                {
                                        ri--;
                                        if((ri==0)||ri>dxy(yue))
                                                ri=dxy(yue);
                                        write_yrsfm(9,ri);
                                        write_com(0x80+10);
                                }
                                if(flag==6) //功能鍵第六次按下調節月份
                                {
                                        yue--;
                                        if((yue==0)||(yue>12))
                                                yue=12;
                                        write_yrsfm(6,yue);
                                        write_com(0x80+7);
                                }
                                if(flag==7)         //功能鍵第七次按下調節年份
                                {
                                        nian--;
                                        write_nian(2,nian);
                                        write_com(0x80+4);
                                }
                        }
                }
        }
}
void LCD_Refresh()
{
        if(flag==0)                //調整時停止刷新
        {
                if((ri>dxy(yue))||(ri<1)) //大小月匹配
                        ri=1;
                write_yrsfm(9,ri); //日若變化則重新寫入
                if(Cnt1s==1) //1秒時間到
                {
                        Cnt1s=0; //清零
                        miao++; //秒、分、時、星期、日、月、年自動調節功能運行
                        if(miao==60)
                        {
                                miao=0;
                                fen++;
                                if(fen==60)
                           {
                                   fen=0;
                                   di(500); //整點提醒
                                   shi++;
                                        if(shi==24)
                                        {
                                                shi=0;
                                                week++;
                                                ri++;
                                                if(week>6)
                                                        week=0;
                                                write_week(12,week); //星期若變化則重新寫入
                                                if(ri>dxy(yue))
                                                {
                                                        ri=1;
                                                        yue++;
                                                        if(yue==13)
                                                        {
                                                                yue=1;
                                                                nian++;
                                                                write_nian(2,nian); //年份若變化則重新寫入
                                                        }
                                                        write_yrsfm(6,yue); //月份若變化則重新寫入
                                                }
                                                write_yrsfm(9,ri); //日若變化則重新寫入
                                        }
                                        write_yrsfm(0x40+4,shi); //時若變化則重新寫入
                                }
                                write_yrsfm(0x40+7,fen); //分若變化則重新寫入
                        }
                        write_yrsfm(0x40+10,miao); //秒若變化則重新寫入
                }
        }
}
void Timer0Init()                                //100微秒@12.000MHz
{
        TMOD = 0x02;                                //設置定時器自動重載模式
//        TL0 = 0x9C;                                        //設置定時初值
//        TH0 = 0x9C;                                        //設置定時重載值
        TL0=0xA4;                                         //定時器裝初值 100微秒@11.0592MHz
        TH0=0xA4;                                         //定時器裝初值 100微秒@11.0592MHz
        TF0 = 0;                                                //清除TF0標志
        TR0 = 1;                                                //定時器0開始計時
        EA=1;                                                 //開總中斷
        ET0=1;                                                 //開定時器0中斷
}
/***********主函數**********/
void main()
{
        MND_1=0;                                                        //矩陣鍵盤模擬地
        init();                                                                //初始化程序
        Timer0Init();                                                //初始化定時器                                       
        di(100);                                                                //開機蜂鳴器提示音
        while(1)                                                         //不停地檢測按鍵是否被按下
        {
                keyscan();                                                //按鍵掃描程序
                LCD_Refresh();                                        //液晶屏顯示刷新
        }
}
/***********中斷函數**********/
void timer0() interrupt 1
{
        count++;                                         //11.0592MHz誤差0.17%,12MHz誤差0
        if(count>=10017)                        //1秒/11.0592MHz
//        if(count>=10000)                        //1秒/12MHz
        {
                count=0;                                        //清0
                Cnt1s=1;                                        //1秒標標志置1
        }
}


ID:21069 發表于 2019-1-26 14:33
你按鍵的回路沒有了,按鍵按了也是白按,就如同你按鍵一只腳一直是懸空狀態,你自己好好看看電路就會發現這個問題.

評分

參與人數 3黑幣 +80 收起 理由
刀刀見紅 + 35
areyouok + 35 很給力!
zhengchong60 + 10 回帖助人的獎勵!

查看全部評分

ID:318185 發表于 2019-1-26 10:58
wc86110 發表于 2019-1-26 00:44
按鍵怎么是這樣弄能行么

我按鍵是取矩陣按鍵的最后一列來用,是不是不能這樣用,有點懵
ID:318185 發表于 2019-1-26 10:57
shuisheng 發表于 2019-1-26 01:02
仿真畫的矩陣按鍵,代碼用獨立按鍵操作。先把電路整好再說

我在矩陣按鍵里取最后一列來做,獨立按鍵使,后來換成獨立按鍵也不行
ID:318185 發表于 2019-1-26 10:56

按下S1按鍵后,TR0置0,停止定時器,就暫停了
ID:7485 發表于 2019-1-26 01:45
怎么暫停的?
ID:454000 發表于 2019-1-26 01:02
仿真畫的矩陣按鍵,代碼用獨立按鍵操作。先把電路整好再說

評分

參與人數 4黑幣 +77 收起 理由
站著說話不腰疼 + 15
鉆牛尖滴劉尖尖 + 15
yoxi + 35
areyouok + 12 回帖助人的獎勵!

查看全部評分

ID:96682 發表于 2019-1-26 00:44
a601623202 發表于 2019-1-25 22:39
看了好久不知道是啥問題

按鍵怎么是這樣弄能行么
ID:318185 發表于 2019-1-25 22:39
看了好久不知道是啥問題

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费三级网 | 亚洲成人黄色 | 国产精品视频免费观看 | 国产中文 | 99re国产视频| 美人の美乳で授乳プレイ | 一级毛片在线播放 | 久久亚洲一区二区三区四区 | 国产激情视频网址 | 久久精品国产亚洲一区二区三区 | 国产精品美女久久久久久久久久久 | 亚洲精品一区二区三区蜜桃久 | 亚洲精品视频免费观看 | 亚洲最大福利网 | 成人深夜福利在线观看 | 亚洲国产一区二区视频 | 91综合网 | 久久久久久国产免费视网址 | 狠狠操狠狠搞 | 欧美日韩亚洲成人 | 国产综合久久 | av一区二区在线观看 | 在线观看亚洲专区 | 久久久精彩视频 | 亚洲精品中文在线 | 久久天堂网 | 可以免费观看的av片 | 久久99深爱久久99精品 | 婷婷综合激情 | 三级黄片毛片 | 一区中文 | 久久久性色精品国产免费观看 | 久久久性| 国产精品日韩欧美一区二区三区 | 亚洲视频一区在线观看 | 中文字幕人成人 | 久久99精品国产麻豆婷婷 | a级片网站 | 三级视频在线观看电影 | 亚洲毛片网站 | 操人视频在线观看 |