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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7307|回復: 12
收起左側

編譯沒有錯誤,但是protues仿真/顯示為0且不能夠實現上下值加減,什么原因啊?

  [復制鏈接]
ID:76963 發表于 2015-4-24 10:38 | 顯示全部樓層 |閱讀模式


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



uchar menu_1;           //菜單設計的變量

sbit beep = P3^7;
uchar flag_200ms ;


sbit rs=P1^0;       
sbit rw=P1^1;       
sbit e =P1^2;         

unsigned char i=0,timecount=0,displayOK=0,rate=0;
unsigned int time[6]={0};
uchar rate_l=50,rate_h=120;


/***********************延時函數*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<110;j++);
}

void delay_uint(uint q)
{
        while(q--);
}

/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數
***********************************************************************/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;
}

/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫數據函數
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;       
}

/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
                  write_string(1,5,"ab cd ef;")
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)
        {
                if(*p == '\0')  break;
                write_data(*p);
                p++;
        }       
}

/*****************控制光標函數********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{               
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        if(date == 1)
                write_com(0x0f);     //顯示光標并且閃爍       
        else
                write_com(0x0c);   //關閉光標
}       


/***********************lcd1602上顯示兩位十進制數************************/
void write_sfm3(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);       
}

/***********************lcd1602初始化設置************************/
void init_1602()
{
        write_com(0x38);       
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
        write_string(1,4,"000/min");       
        write_string(2,2,"H:120  L:050 ");
}

/*************定時器0初始化程序***************/
void time_init()          
{
        EA   = 1;                   //開總中斷
        TMOD = 0X01;          //定時器0、定時器1工作方式1
        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時
}


/***********外部中斷0初始化程序****************/
void init_int0()          //外部中斷0初始化程序
{
        EX0=1;                          //允許外部中斷0中斷
        EA=1;                           //開總中斷
        IT0 = 1;                   //外部中斷0負跳變中斷
}

/********************獨立按鍵程序*****************/
uchar key_can;         //按鍵值

void key()         //獨立按鍵程序
{
        static uchar key_new;
        key_can = 20;                   //按鍵值還原
        P2 |= 0x78;                     //對應的按鍵IO口輸出為1
        if((P2 & 0x78) != 0x78)                //按鍵按下
        {
                delay_1ms(1);                     //按鍵消抖動
                if(((P2 & 0x78) != 0x78) && (key_new == 1))
                {                                                //確認是按鍵按下
                        key_new = 0;
                        switch(P2& 0x78)
                        {
                                case 0x68:  key_can = 3;  break;         //得到按鍵值
                                case 0x58:  key_can = 2;  break;         //得到按鍵值
                                case 0x38:  key_can = 1;  break;         //得到按鍵值
                        }
                }                       
        }
        else
                key_new = 1;       
}

/**********************設置函數************************/
void key_with()
{
        if(key_can == 1)        //設置鍵
        {
                menu_1++;
                if(menu_1 > 2)    //回到正常顯示
                {
                        menu_1 = 0;
                        write_guanbiao(1,2,0);         //關閉光標
                        init_1602();      //初始化液晶顯示               
                }
        }
/***************設置*********************/
        if(menu_1 != 0)
        {
                if(menu_1 == 1)                  //設置上限報警
                {
                        if(key_can == 2)        //加
                        {
                            rate_h ++;
                                if(rate_h >= 255)
                                        rate_h = 0;
                        }               
                        if(key_can == 3)        //減          
                        {
                                rate_h -- ;
                                if(rate_h <= rate_l)
                                        rate_h = rate_l + 1;
                        }       
                }
                if(menu_1 == 2)                  //設置下限報警
                {
                        if(key_can == 2)        //加
                        {
                            rate_l ++;
                                if(rate_l >= rate_h)
                                        rate_l = rate_h - 1;
                        }       
                        if(key_can == 3)        //減          
                        {
                                if(rate_l == 0x00)
                                        rate_l = 1;
                                rate_l -- ;                       
                        }
                }
       
                switch(menu_1)           // 光標顯示
                {
                        case 1:  write_guanbiao(2,4,1);  break;
                        case 2:  write_guanbiao(2,11,1);  break;
                }       
        }
}

/****************報警函數***************/
void clock_h_l()
{
        static uchar value;
        if(rate != 0)
        {
                if((rate <= rate_l) || (rate >= rate_h))
                {
                        value ++;  //消除實際距離在設定距離左右變化時的干擾
                        if(value >= 2)
                        {
                                beep = ~beep;           //蜂鳴器報警                       
                        }       
                }
                else
                {
                        beep = 1;        //取消報警
                }
        }else
        {
                beep = 1;   //取消報警       
        }
                       
}

/****************主函數***************/
void main()
{       
        init_1602();                    //1602初始化


        time_init();                    //初始化定時器
        init_int0();          //外部中斷0初始化程序
        while(1)
        {                       
                key();                                         //按鍵函數
                key_with();
                if(key_can <10)
                {
                        key_with();                         //按鍵處理函數
                }
                if(displayOK==0)//如果顯示關
                {
                         rate = 0;
                }
                else//如果顯示開
                {
                        rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
                }
                write_sfm3(2,5,rate);
                flag_200ms ++;
                if(flag_200ms >= 200)        //200ms
                {
                        flag_200ms = 0;
                        write_sfm3(1,5,rate);
                        clock_h_l();    //報警函數
                }
                delay_1ms(1);

                delay_1ms(300);
        }
}

void int0() interrupt 0
{
                EX0=0;//暫時關外部中斷
                if(timecount<8)   //當連續兩次檢測時間間隔小于8*50ms=400ms不處理
                {
                                TR0=1;//開定時器
                }
                else
                {
                        time[i]=timecount*50+TH0*0.256+TL0/1000;//算出間隔時間
                        TH0 = 0x3c;
                        TL0 = 0xb0;     // 50ms         12M
                        timecount=0;//50ms計數清零
                        i++;
                        if(i==6)//記錄到超過等于6次時間
                        {
                                i=1;//計數從1開始
                                displayOK=1;    //測得5次開始顯示?
                        }                                                               
                }
}

/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{       
        TH0 = 0x3c;
        TL0 = 0xb0;     // 50ms         12M
        timecount++;//每50ms一次計數
        if(timecount>25)     //當超過25*50ms=1.5s沒有檢測到信號停止顯示
        {
                        i=0;//數據個數清零
                        timecount=0;//50ms計數清零
                        displayOK=0;//顯示關
                        TR0=0;//定時器關
                        TH0 = 0x3c;
                        TL0 = 0xb0;     // 50ms         12M
        }
}


顯示有錯,不能通過按鍵實現H、L數值加減

顯示有錯,不能通過按鍵實現H、L數值加減
回復

使用道具 舉報

ID:77958 發表于 2015-4-24 20:52 | 顯示全部樓層
看不懂。。。。。。。。
回復

使用道具 舉報

ID:78279 發表于 2015-4-27 23:21 | 顯示全部樓層
樓主 我想問一下按鍵那一部分的程序
switch(P3 & 0xf0)
          {
            case 0xb0: key_can = 3; break;      //得到k3鍵值
        case 0x70: key_can = 2; break;      //得到k2鍵值
        case 0x30: key_can = 1; break;      //得到k4鍵值
         }
我是不理解 case后面那個16進制數是用來的干嘛的?別人說按鍵值,能具體說說干嘛用的嗎?

跪求 我從別人那里拿的程序,拷到自己芯片上按鍵程序根本就不能運行,按鍵按哪個系統都沒有反應

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:75782 發表于 2015-4-28 13:02 | 顯示全部樓層
  switch(P2& 0x78) 這部分有問題,對應的應該是P3口才對。 然后P3.4~P3.6 。 P3|(~(0X70))

switch(P3|(0X1F))
          {
            case 0xBF: key_can = 3; break;      //得到k3鍵值
        case 0xDF: key_can = 2; break;      //得到k2鍵值
        case 0xEF: key_can = 1; break;      //得到k4鍵值
         }

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76963 發表于 2015-4-28 16:03 | 顯示全部樓層
jmc1001 發表于 2015-4-28 13:02
switch(P2& 0x78) 這部分有問題,對應的應該是P3口才對。 然后P3.4~P3.6 。 P3|(~(0X70))

switch(P3|( ...

想同時用P3^4端口作為按鍵輸入和T0定時器中斷是否有沖突
回復

使用道具 舉報

ID:75782 發表于 2015-4-28 16:08 | 顯示全部樓層
chenyahuan 發表于 2015-4-28 16:03
想同時用P3^4端口作為按鍵輸入和T0定時器中斷是否有沖突

不會,可用做定時器,產生中斷。

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:76963 發表于 2015-4-28 16:16 | 顯示全部樓層
大六神丸 發表于 2015-4-27 23:21
樓主 我想問一下按鍵那一部分的程序
switch(P3 & 0xf0)
          {

應該是用P3端口狀態與0xf(11110000)按位與,出現以下case x 情況就代表是哪個按鍵按下,但是你這個case3的0x30(00110000)是不是錯了,不然要求兩鍵同時按下嗎?嗯,你拷貝的程序調試有問題嗎?

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:78366 發表于 2015-4-28 21:04 | 顯示全部樓層
有時候仿真有問題

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:78646 發表于 2015-5-2 12:29 | 顯示全部樓層
代碼有點長
回復

使用道具 舉報

ID:78659 發表于 2015-5-2 15:03 | 顯示全部樓層
仿真一般是不會有問題的額你好好看看你額按鍵

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:78279 發表于 2015-5-10 18:53 | 顯示全部樓層
chenyahuan 發表于 2015-4-28 16:16
應該是用P3端口狀態與0xf(11110000)按位與,出現以下case x 情況就代表是哪個按鍵按下,但是你這個case3 ...

嗯,確實那個設置錯了

評分

參與人數 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:79558 發表于 2015-5-10 20:03 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:162036 發表于 2017-1-16 16:01 | 顯示全部樓層
樓主,問題解決了嗎??可否發奮源程序給我,我遇到和你一樣的問題了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产小视频在线观看 | 一区二区三区视频在线免费观看 | av在线免费网| 国产午夜精品一区二区三区四区 | 91精品国产一区二区三区蜜臀 | 久久伊人青青草 | 国产成人在线一区 | 精品久久电影 | 91综合网 | www.日韩av.com| 久久精品久久综合 | 99热这里都是精品 | 国产美女自拍视频 | 国产色网| 日韩在线成人 | 色啪网 | 欧美综合在线观看 | 在线播放国产一区二区三区 | 中文字幕不卡在线88 | 黄色网络在线观看 | 国产一区二 | 视频一区二区在线观看 | 日韩欧美精品 | 国产日韩精品久久 | 男人的天堂中文字幕 | 在线免费观看欧美 | 欧美一区二区三区精品免费 | 超碰在线影院 | 久久久久久一区 | 欧美性生活网 | 一区二区三区四区视频 | 亚洲精品一区国语对白 | 中文字幕在线观看www | 久久久精品一区二区三区四季av | 91精品久久 | 羞羞网站在线免费观看 | 超碰免费在线观看 | 国产一区二区三区四区在线观看 | 午夜影院操 | 国产亚洲成av人片在线观看桃 | 国产精品污www一区二区三区 |