找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1797|回復(fù): 2
收起左側(cè)

仿真的時(shí)候按鍵功能在1602上顯示不了,看看代碼有什么錯(cuò)誤嗎 求幫助

[復(fù)制鏈接]
ID:725056 發(fā)表于 2020-4-23 21:42 | 顯示全部樓層 |閱讀模式
void RHTkey(p,q,n,m)
{
unsigned char lcd_table[9];//存數(shù)據(jù)
uchar k3n=0;
uchar k4n=0;
if(k3==0)
{
  delaynms(10);
  if(k3==0)
  {
   while(!k3)
    k3n++;
    if(k3n==3)
     k3n=0;
    switch(k3n)
    {
     case 1:break;//按一下
     case 2:break;//按兩下
     case 0:break;//按三下返回
    }
  }
}
  if(k4==0)
{
  delaynms(10);
  if(k4==0)
  {
   while(!k4)
    k4n++;
    if(k4n==3)
     k4n=0;
    switch(k4n)
    {
     case 1:break;//按一下
     case 2:break;//按兩下
     case 0:break;//按三下
    }
  }
}
if(k3n!=0&&k4n==0)//如果按k3,不按k4調(diào)節(jié)濕度上下限
{
   if(k1==0)//加
   {
    delaynms(10);
    if(k1==0)
    {
     while(!k1);
     switch(k3n)
     {
      case 1:
       if(p<100)//上
       p++;
       lcd_table[0]=p/100;//百位
       lcd_table[1]=p%100/10;//十位
       lcd_table[2]=p%100%10;//個(gè)位
       Disp1Char(5,1,(lcd_table[0]+0x30));//顯示
       Disp1Char(6,1,(lcd_table[1]+0x30));
       Disp1Char(7,1,(lcd_table[2]+0x30));
      break;
      case 2:
       if(q<p)//下
       q++;
       lcd_table[3]=q%100/10;//十位
       lcd_table[4]=q%100%10;//個(gè)位
       Disp1Char(8,1,(lcd_table[3]+0x30));
       Disp1Char(9,1,(lcd_table[4]+0x30));
      break;
     }
    }
   
   }
   if(k2==0)//減
   {
    delaynms(10);
    if(k2==0)
    {
     while(!k2);
     switch(k3n)
     {
      case 1:
      if(p>q>0)//上
       p--;
       lcd_table[0]=p/100;//百位
       lcd_table[1]=p%100/10;//十位
       lcd_table[2]=p%100%10;//個(gè)位
       Disp1Char(5,1,(lcd_table[0]+0x30));
       Disp1Char(6,1,(lcd_table[0]+0x30));
       Disp1Char(7,1,(lcd_table[0]+0x30));
      break;
      case 2:
      if(q>0)//下
       q--;
       lcd_table[3]=q%100/10;//十位
       lcd_table[4]=q%100%10;//個(gè)位
       Disp1Char(8,1,(lcd_table[3]+0x30));
       Disp1Char(9,1,(lcd_table[4]+0x30));
      break;
     }
    }
   }
   
}
if(k3n==0&&k4n!=0)//如果按k4,不按k3調(diào)節(jié)溫度上下限
{
  if(k1==0)//加
   {
    delaynms(10);
    if(k1==0)
    {
     while(!k1);
     switch(k4n)
     {
      case 1:
       if(n<50)//上
        n++;
       if(n<0)
       {
        Disp1Char(10,1,('-'));
       }
        lcd_table[5]=n%100/10;//十位
        lcd_table[6]=n%100%10;//個(gè)位
        Disp1Char(11,1,(lcd_table[5]+0x30));
        Disp1Char(12,1,(lcd_table[6]+0x30));
      break;
      case 2:
       if(m<n)//下
        m++;
       if(m<0)
       {
        Disp1Char(13,1,('-'));
       }
        lcd_table[7]=m%100/10;//十位
        lcd_table[8]=m%100%10;//個(gè)位
        Disp1Char(14,1,(lcd_table[7]+0x30));
        Disp1Char(15,1,(lcd_table[8]+0x30));
      break;
     }
    }
   
   }
   if(k2==0)//減
   {
    delaynms(10);
    if(k2==0)
    {
     while(!k2);
     switch(k4n)
     {
      case 1:
      if(n>m)//上
       n--;
      if(n<0)
      {
       Disp1Char(10,1,('-'));
      }
       lcd_table[5]=n%100/10;//十位
       lcd_table[6]=n%100%10;//個(gè)位
       Disp1Char(11,1,(lcd_table[5]+0x30));
       Disp1Char(12,1,(lcd_table[6]+0x30));
      break;
      case 2:
      if(m>-30)//下
       m--;
      if(m<0)
      {
       Disp1Char(13,1,('-'));
      }
       lcd_table[7]=m%100/10;//十位
       lcd_table[8]=m%100%10;//個(gè)位
       Disp1Char(14,1,(lcd_table[7]+0x30));
       Disp1Char(15,1,(lcd_table[8]+0x30));
      break;
     }
    }
   }
   
}
}

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-4-24 14:22 | 顯示全部樓層
無(wú)圖?也無(wú)錯(cuò)誤信息?恐怕無(wú)人能搞定啊
回復(fù)

使用道具 舉報(bào)

ID:725056 發(fā)表于 2020-4-28 10:39 | 顯示全部樓層
51hei團(tuán)團(tuán) 發(fā)表于 2020-4-24 14:22
無(wú)圖?也無(wú)錯(cuò)誤信息?恐怕無(wú)人能搞定啊

166879.png

這是完整代碼,幫我看看RHTke'y那部分,主程序我按下去1602顯示屏數(shù)值不會(huì)改變,是為什么,那里錯(cuò)了?
這個(gè)沒(méi)有程序錯(cuò)誤,我覺(jué)得是邏輯寫錯(cuò)了,搞不來(lái),能仔細(xì)幫我看看嗎?

#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define ulongint unsigned long int

uint code tab[2][11]={0,10,20,30,40,50,60,70,80,90,100,7351,7224,7100,6976,6853,6728,6600,6468,6330,6186,6033};//濕敏電容表格
ulongint F=0;
ulongint T0_count=0,T1_count=0;
bit flag=0;//flag的取值只能是0或1
ulongint RH=0;
ulongint u=50;//濕度上限值
ulongint j=25;//濕度下限值
int h=25;//溫度上限值
int g=10;//溫度下限值
void delay1ms()//(3j+2)*i,延時(shí)1ms
{
unsigned char i,j;
for(i=0;i<10;i++)
  for(j=0;j<33;j++);
}
void delaynms(unsigned char n)//延時(shí)若干毫秒
{
unsigned char i;
for(i=0;i<n;i++)
  delay1ms();
}
sbit fmq=P3^3;//蜂鳴器
sbit k1=P2^4;//加
sbit k2=P2^3;//減
sbit k3=P2^2;//濕度上下限調(diào)節(jié)
sbit k4=P2^1;//溫度上下限調(diào)節(jié)
void delay500us()//500us基準(zhǔn)延時(shí)
{
unsigned char j;
for(j=0;j<57;j++);
}
void beep()//產(chǎn)生1KHZ頻率聲音
{
unsigned int t;
for(t=0;t<1000;t++)
{
  fmq=~fmq;
  delay500us();
}
fmq=1;
delaynms(1000);
}
//對(duì)lcd1602操作
sbit lcdrs = P2^5;//寄存器選擇位,將rs位定義為P2.5引腳
sbit lcdrw = P2^6;//讀寫選擇位,將rw位定義為P2.6引腳
sbit lcden = P2^7;//使能信號(hào)位,將e位定義為P2.7引腳
sbit lcdBF = P0^7;//忙碌標(biāo)志位,14號(hào)引腳
bit BusyTest(void)//判斷1602忙碌狀態(tài),1忙碌,0不忙
{
bit result;
lcdrs=0;//rs為低電平,rw為高電平時(shí),可以讀狀態(tài)
lcdrw=1;
lcden=1;//e=1,才允許讀寫
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作4個(gè)周期,給硬件反應(yīng)時(shí)間
result=lcdBF;//將忙碌標(biāo)志位給result
lcden=0;//將e恢復(fù)低電平
return result;
}
void LcdWriteCommand(unsigned char dictate)//將顯示地址寫入1602
{
while(BusyTest()==1);//如果忙就等待
lcdrs=0;
lcdrw=0;//rs和rw同時(shí)為低電平,可以寫入指令
lcden=0;//e給低電平,讓e從0到1發(fā)生正跳變,所以先置0
_nop_();
_nop_();
P0=dictate;//將數(shù)據(jù)送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();
lcden=1;//給高電平
_nop_();
_nop_();
_nop_();
_nop_();
lcden=0;//當(dāng)e由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令
}
void LcdWriteData(unsigned char y)//將數(shù)據(jù)寫入液晶模塊
{
while(BusyTest()==1);//如果忙就等待
lcdrs=1;
lcdrw=0;//rs和rw同時(shí)為低電平,可以寫入指令
lcden=0;//e給低電平,讓e從0到1發(fā)生正跳變,所以先置0
P0=y;//將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_();
lcden=1;//給高電平
_nop_();
_nop_();
_nop_();
_nop_();
lcden=0;//當(dāng)e由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令
}
void LcdInitiate(void)//對(duì)LCD的顯示模式進(jìn)行初始化設(shè)置
{
delaynms(15);//延時(shí)15ms
LcdWriteCommand(0x38);//顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
delaynms(5);//延時(shí)5ms
LcdWriteCommand(0x38);
delaynms(5);//延時(shí)5ms
LcdWriteCommand(0x38);//連續(xù)三次,確保初始化成功
delaynms(5);
LcdWriteCommand(0x08);//顯示關(guān)閉
delaynms(5);
LcdWriteCommand(0x0c);//顯示模式設(shè)置:顯示開,有光標(biāo),光標(biāo)閃爍
delaynms(5);
LcdWriteCommand(0x06);//顯示模式設(shè)置:光標(biāo)右移,字符不移
delaynms(5);
LcdWriteCommand(0x01);//清屏幕指令,將以前的顯示內(nèi)容清除
delaynms(5);
}
void Disp1Char(unsigned char x,unsigned char y,unsigned char N)//在某個(gè)位置顯示一個(gè)字符。x-列坐標(biāo),y-行坐標(biāo),N-顯示的字符數(shù)據(jù)
{
if(y==0)
{
  LcdWriteCommand(0x80 + x);//第一行顯示
}
else
{
  LcdWriteCommand(0xC0 + x);//第二行顯示
}
LcdWriteData(N);
}
void DispNChar(uchar x,uchar y,uchar n,uchar *ptr)//讓液晶屏從某個(gè)位置連續(xù)顯示N個(gè)字符。n-字符個(gè)數(shù),ptr-指向字符存放位置的指針
{
uchar i;
for(i=0;i<n;i++)
{
  Disp1Char(x++,y,ptr);
  if(x==0x0f)
  {
   x=0;
   y^=1;
  }
}
}
void DispStr(uchar x,uchar y,uchar *ptr)//讓液晶從某個(gè)位置連續(xù)顯示一個(gè)字符串。ptr-指向字符串存放位置的指針
{
uchar *temp;
uchar i,n=0;
temp = ptr;
while(*ptr++ != '\0')
  n++;//計(jì)算字符串有效字符的個(gè)數(shù)
for(i=0;i<n;i++)
{
  Disp1Char(x++,y,temp);
  if(x==0x0f)
  {
   x=0;
   y^=1;
  }
}
}
void Welcome()//歡迎界面
{
DispStr(0,0,"Welcome");
DispStr(0,1,"WaiT");
}
void Disp_RH(ulongint f_data)//顯示最終結(jié)果RH
{
unsigned char lcd_table[3];
ulongint aa;
aa=f_data;
lcd_table[0]=aa/100;//百位
lcd_table[1]=aa%100/10;//十位
lcd_table[2]=aa%100%10;//個(gè)位
DispStr(0,0,"RH=");
Disp1Char(3,0,(lcd_table[0]+0x30));
Disp1Char(4,0,(lcd_table[1]+0x30));
Disp1Char(5,0,(lcd_table[2]+0x30));//加上0x30以便直接得到相應(yīng)ASCII碼去顯示
Disp1Char(6,0,('%'));
}
void Disp_u(ulongint u_data,ulongint d_data)//顯示初始設(shè)定濕度數(shù)值
{
Disp1Char(5,1,(u_data/100+0x30));
Disp1Char(6,1,(u_data%100/10+0x30));
Disp1Char(7,1,(u_data%100%10+0x30));
Disp1Char(8,1,(d_data%100/10+0x30));
Disp1Char(9,1,(d_data%100%10+0x30));
}
void Disp_t(int u_data,int d_data)//顯示初始設(shè)定溫度數(shù)值
{
Disp1Char(11,1,(u_data%100/10+0x30));
Disp1Char(12,1,(u_data%100%10+0x30));
Disp1Char(14,1,(d_data%100/10+0x30));
Disp1Char(15,1,(d_data%100%10+0x30));
}
void Disp_F(ulongint f_data)//顯示頻率
{
unsigned char lcd_table[4];
ulongint aa;
aa=f_data;
lcd_table[0]=aa/1000;
lcd_table[1]=aa%1000/100;
lcd_table[2]=aa%100/10;
lcd_table[3]=aa%10;
DispStr(0,0,"F=");
Disp1Char(2,0,(lcd_table[0]+0x30));
Disp1Char(3,0,(lcd_table[1]+0x30));
Disp1Char(4,0,(lcd_table[2]+0x30));
Disp1Char(5,0,(lcd_table[3]+0x30));
Disp1Char(6,0,('H'));
Disp1Char(7,0,('Z'));
}
void Timer_Iint()//定時(shí)器T0,T1初始化
{
TMOD=0x51;//T1計(jì)數(shù),T0定時(shí),方式1:16位計(jì)數(shù)
TH0=(65536-50000)/256;//定時(shí)器T0的高8位賦初值
TL0=(65536-50000)%256;//定時(shí)器T0的低8位賦初值
TH1=0x00;//計(jì)數(shù)初值,0
TL1=0x00;
EA=1;//開總中斷
ET0=1;//定時(shí)器T0終端允許
ET1=1;//計(jì)數(shù)器T1中斷允許
TR0=1;
TR1=1;//開始計(jì)數(shù)
}
void RHTkey()
{
uchar k3n=0;
uchar k4n=0;
if(k3==0)
{
  delaynms(10);
  if(k3==0)
  {
   while(!k3)
    k3n++;
    if(k3n==3)
     k3n=0;
    switch(k3n)
    {
     case 1:break;//按一下
     case 2:break;//按兩下
     case 0:break;//按三下返回
    }
  }
}
  if(k4==0)
{
  delaynms(10);
  if(k4==0)
  {
   while(!k4)
    k4n++;
    if(k4n==3)
     k4n=0;
    switch(k4n)
    {
     case 1:break;//按一下
     case 2:break;//按兩下
     case 0:break;//按三下
    }
  }
}
if(k3n!=0)//如果按k3,不按k4調(diào)節(jié)濕度上下限
{
   if(k1==0)//加
   {
    delaynms(10);
    if(k1==0)
    {
     while(!k1);
     switch(k3n)
     {
      case 1:
       u++;
       if(u==100)//?
       {
        u=99;
       }
      break;
      case 2:
        j++;
       if(j==u)//?
       {
        j=u-1;
       }
      break;
     }
    }
        Disp_u(u,j);
   }
   if(k2==0)//減
   {
    delaynms(10);
    if(k2==0)
    {
     while(!k2);
     switch(k3n)
     {
      case 1:
      u--;
      if(u==j)//?
      {
       u=j+1;
      }
      break;
      case 2:
       j--;
       if(j==0)//?
       {
        j=1;
       }
      break;
     }
    }
        Disp_u(u,j);
   }
   
}
if(k3n==0)//如果按k4,不按k3調(diào)節(jié)溫度上下限
{
  if(k1==0)//加
   {
    delaynms(10);
    if(k1==0)
    {
     while(!k1);
     switch(k4n)
     {
      case 1:
       h++;
       if(h==50)//?
       {
        h=49;
       }
       if(h<0)
        Disp1Char(10,1,('-'));
      break;
      case 2:
       g++;
       if(g==h)//?
       {
        g=h-1;
       }
       if(g<0)
        Disp1Char(13,1,('-'));
      break;
     }
    }
        Disp_t(h,g);
   }
   if(k2==0)//減
   {
    delaynms(10);
    if(k2==0)
    {
     while(!k2);
     switch(k4n)
     {
      case 1:
        h--;
       if(h==g)//?
       {
        h=g+1;
       }
       if(h<0)
       Disp1Char(10,1,('-'));
      break;
      case 2:
       g--;
       if(g==-30)//?
       {
        g=-29;
       }
      
       if(g<0)
       Disp1Char(13,1,('-'));
      break;
     }
    }
    Disp_t(h,g);
   }
   
}
}

void HS1101()//查表等差法F-RH轉(zhuǎn)換
{
//unsigned char i;//沒(méi)用可刪除
if(flag==1)
{
  flag=0;
  F=T1_count*65536+TH1*256+TL1;//存儲(chǔ)頻率值
  //LcdWriteCommand(0x01);//清屏幕指令
  //Disp_F(F);//不顯示可刪除
  /*for(i=0;i<=10;i++)//查表法
  {
   if(F<=tab[1]&&F>tab[1][i+1])
   {
    RH=tab[0]+(tab[1]-F)/((tab[0][i+1]-tab[0])/10);
    break;
   }
  }*/
  /*if(F>=6033&&F<=7351)
   {
    if(F>6033)
    RH=(588-0.08*F)+0.5;
    else
    RH=(586-0.08*F)+0.5;
   }*/
  if(F<=7351&&F>=6033)
  {
   if(F>7224)
    RH=((7351-F)/12.7);//去掉+0.5了
   else if(F>6600)
    RH=(10+(7224-F)/12.4);
   else if(F>6186)
    RH=(60+(6600-F)/13.8);
   else
    RH=(90+(6186-F)/15.3);
  }
  Disp_RH(RH);
  if(RH>u)
  {
   beep();
   DispStr(0,1,"RHh");
   delaynms(20);
  }
  if(RH<j)//當(dāng)濕度大于30時(shí),蜂鳴器響
  {
   beep();
   DispStr(0,1,"RHl");
   delaynms(20);
  }
  T0_count=0;
  TH0=(65536-50000)/256;//定時(shí)器T0的高8位賦初值
  TL0=(65536-50000)%256;//定時(shí)器T0的低8位賦初值
  T1_count=0;
  TH1=0x00;
  TL1=0x00;
  TR0=1;
  TR1=1;//開始計(jì)數(shù)
}
}
void main()
{
Timer_Iint();//初始化
LcdInitiate();
Welcome();
while(1)
{
  Disp_u(u,j);//顯示濕度
  Disp_t(h,g);//顯示溫度
  HS1101();
  RHTkey();
}

}

void Time1(void)interrupt 3//定時(shí)器2中斷。這是計(jì)數(shù)器1
{
TH1=0x00;
TL1=0x00;//重裝初值,0
T1_count++;
}
void Time0(void)interrupt 1//定時(shí)器1中斷,其后的0為定時(shí)器T0的中斷編號(hào)
{
TH0=(65536-50000)/256;//定時(shí)器T0的高8位賦初值
TL0=(65536-50000)%256;//定時(shí)器T0的低8位賦初值
T0_count++;
if(T0_count==20)
{
  flag=1;
  TR1=0;
  TR0=0;
  T0_count=0;
}
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表