欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4877|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

我的這個(gè)單片機(jī)程序?yàn)槭裁窗存I按下后沒(méi)有作用?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:521078 發(fā)表于 2019-10-19 20:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
25黑幣
Keil4編寫(xiě)環(huán)境:A/D數(shù)模轉(zhuǎn)換和按鍵應(yīng)用操作顯示到Lcd1602上,子程序Lcd1602.c,keyboard.c,I2C.c程序略,跪求主程序
程序要求實(shí)現(xiàn):按上鍵查詢?cè)O(shè)定的電壓值上下限
                      按下鍵查詢當(dāng)前的電壓值(當(dāng)前電壓值是滑動(dòng)變阻器所配置的電壓值)
                      數(shù)據(jù)采集器件用的是PCF8591測(cè)AIN0的值
為什么我的主函數(shù)這樣寫(xiě),在51液晶上按上下鍵沒(méi)有任何顯示,跪求主函數(shù),開(kāi)發(fā)板是金三角開(kāi)發(fā)板
是Lcd如何通過(guò)按鍵進(jìn)行翻頁(yè)操作,這個(gè)程序應(yīng)該怎么寫(xiě),跪求來(lái)個(gè)大神,寫(xiě)下這個(gè)程序

#include <reg52.h>
sbit BUZZ = P1^6;  
bit flag300ms = 1;
bit enBuzz = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned int CountDown = 0;
void ConfigTimer0(unsigned int ms);
unsigned char GetADCValue(unsigned char chn);
void ValueToString(unsigned char *str, unsigned char val);
extern void I2CStart();
extern void I2CStop();
extern void KeyScan();
extern void KeyDriver();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main()
{
    EA = 1;
   ConfigTimer0(10);  
   InitLcd1602();
   LcdShowStr (0, 0, "moli");
while(1)
{
     KeyDriver();
}
}
unsigned char GetADCValue (unsigned char chn)
{
      unsigned char val;
     I2CStart();
    if (!I2CWrite (0x48<<1))
    {
        I2CStop();
        return 0;
    }
I2CWrite (0x40 | chn);
I2CStart();
I2CWrite ((0x48<<1) | 0x01);
I2CReadACK();
val = I2CReadNAK();
I2CStop();
return val;
}
void ValueToString(unsigned char *str, unsigned char val)
{
     
  val = (val * 25) / 55;
  str[0] = (val/10) + '0';  
  str[1] = '.';   //С????
  str[2] = (val%10) + '0';  
  str[3] = 'V';  
  str[4] = '\0';
}
void KeyTaAction()
{
    unsigned char val;
    unsigned char str[10];
    InitLcd1602();
    LcdShowStr (0, 0, "TABANXINHAO");  
     while (1)
    {
         if (flag300ms)
     {
         flag300ms = 0;
           
        val = GetADCValue(0);
        ValueToString(str, val);
        LcdShowStr(0, 1, str);
      if (val >= 200)
      {
         enBuzz = 1;
        if (enBuzz)
           BUZZ = ~BUZZ;
      }
      else
          BUZZ = 1;
   }
  }
}
void KeyAction (unsigned char keycode)
{
   if(keycode == 0x26)
    {
      KeyTaAction();
    }
  else if (keycode == 0x28)
   {
     LcdShowStr (0, 0, "MAX");
     LcdShowStr (0, 1, 2^5);   
     LcdShowStr (6, 0, "MIN");
     LcdShowStr (6, 1, 0^0);
   }
}
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 12;
T0RH = (unsigned char)(tmp >> 8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
    static unsigned char tmr300ms = 0;
TH0 = T0RH;
TL0 = T0RL;
tmr300ms++;
if (tmr300ms >= 30)  
{
     tmr300ms = 0;
  flag300ms = 1;
}
}
LCD程序
#include <reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;

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);
}

void LcdWriteCmd (unsigned char cmd)
{
   LcdWaitReady();
   LCD1602_RS = 0;
   LCD1602_RW = 0;
   LCD1602_DB = cmd;
   LCD1602_E = 1;
   LCD1602_E = 0;
}
void LcdWriteDat(unsigned char dat)
{
  LcdWaitReady();
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DB = dat;
  LCD1602_E = 1;
  LCD1602_E = 0;
}

void LcdSetCursor(unsigned char x, unsigned char y)
{
  unsigned char addr;
  if (y == 0)
     addr = 0x00 + x;
  else
     addr = 0x40 + x;
   LcdWriteCmd(addr | 0x80);
}

void LcdShowStr (unsigned char x, unsigned char y,
                 unsigned char *str)
{
  LcdSetCursor(x, y);  
  while (*str != '\0')   
  {
    LcdWriteDat (*str++);
  }
}

void LcdAreaClear(unsigned char x,unsigned char y, unsigned char len)
{

  LcdSetCursor(x, y);
  while (len--)
  {
    LcdWriteDat(' ');
  }
}

void LcdFullClear()
{
  LcdWriteCmd(0x01);
}
void InitLcd1602()
{
  LcdWriteCmd(0x38);
  LcdWriteCmd(0x0C);  
  LcdWriteCmd(0x06);  
  LcdWriteCmd(0x01);  
}
keyboard程序
#include <reg52.h>
sbit KEY_IN_1 = P2^4;
sbit KEY_IN_2 = P2^5;
sbit KEY_IN_3 = P2^6;
sbit KEY_IN_4 = P2^7;
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;
unsigned char code KeyCodeMap[4][4] = {
    { '1',  '2',  '3', 0x26 },
    { '4',  '5',  '6', 0x25 },
    { '7',  '8',  '9', 0x28 },
    { '0', 0x1B, 0x0D, 0x27 }   
};
unsigned char pdata KeySta[4][4] = {
  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
};
extern void KeyAction(unsigned char keycode);

void KeyDriver()
{
    unsigned char i, j;
static unsigned char pdata backup[4][4] = {
  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
};
for (i=0; i<4; i++)
{
    for (j=0; j<4; j++)
    {
    if (backup[ i][j] != KeySta[ i][j])
    {
        if (backup[ i][j] != 0)  
     {
        KeyAction(KeyCodeMap[ i][j]);
     }
     backup[ i][j] = KeySta[ i][j];
    }
    }
}
}
void KeyScan()
{
    unsigned char i;
static unsigned char keyout = 0;
static unsigned char keybuf[4][4] = {
    {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
       {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
};
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;
for (i=0; i<4; i++)
{
     if ((keybuf[keyout][ i] & 0x0F) == 0x00)
  {
     KeySta[keyout][ i] = 0;
  }
  else if ((keybuf[keyout][ i] & 0x0F) == 0x0F)
  {
     KeySta[keyout][ i] = 1;
  }
}
keyout++;
keyout &= 0x03;
switch(keyout)  
{
     case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
  case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
  case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
  case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
  default: break;
}
}
I2C程序
#include <reg52.h>
#include <intrins.h>
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;/

void I2CStart()
{
    I2C_SDA = 1;
I2C_SCL = 1;
I2CDelay();
I2C_SDA = 0;
I2CDelay();
I2C_SCL = 0;  
}
void I2CStop()
{
    I2C_SCL = 0;
I2C_SDA = 0;
I2CDelay();
I2C_SCL = 1;  
I2CDelay();
I2C_SDA = 1;  
I2CDelay();
}
bit I2CWrite (unsigned char dat)
{
    bit ack;
unsigned char mask;
for (mask=0x80; mask!=0; mask>>=1)
{
    if ((mask&dat) == 0)
       I2C_SDA = 0;
    else
       I2C_SDA = 1;
  I2CDelay();
  I2C_SCL = 1;
  I2CDelay();
  I2C_SCL = 0;
}
I2C_SDA = 1;
I2CDelay();
I2C_SCL = 1;
ack = I2C_SDA;
I2CDelay();
I2C_SCL = 0;  
return (~ack);
            
}
unsigned char I2CReadNAK()
{
    unsigned char mask;
unsigned char dat;
I2C_SDA = 1;
for (mask=0x80; mask!=0; mask>>=1)
{
     I2CDelay();
  I2C_SCL = 1;
  if(I2C_SDA == 0)
      dat &= ~mask;
     else
      dat |= mask;   
  I2CDelay();
  I2C_SCL = 0;     
}
I2C_SDA = 1;   
I2CDelay();
I2C_SCL = 1;   
I2CDelay();
I2C_SCL = 0;   
return dat;
}
unsigned char I2CReadACK()
{
     unsigned char mask;
  unsigned char dat;
  I2C_SDA = 1;
  for (mask=0x80; mask!=0; mask>>=1)  
     {
      I2CDelay();
   I2C_SCL = 1;
   if (I2C_SDA == 0)
       dat &= ~mask;  
   else
       dat |= mask;   
   I2CDelay();
   I2C_SCL = 0;   
   }
   I2C_SDA = 0;
   I2CDelay();
   I2C_SCL = 1;  
   I2CDelay();
   I2C_SCL = 0;
   return dat;
  
}

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

使用道具 舉報(bào)

沙發(fā)
ID:616759 發(fā)表于 2019-10-20 13:17 | 只看該作者
你的KeyScan()函數(shù)在主程序中都沒(méi)有出現(xiàn),這個(gè)函數(shù)的意思是按鍵掃描,一般是用來(lái)檢測(cè)按鍵是否被按下的,同時(shí)一般的按鍵掃描是放在一個(gè)大概1s的for循環(huán)中的,當(dāng)然,寫(xiě)在while循環(huán)里就不用這個(gè)1s的for循環(huán)了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:521078 發(fā)表于 2019-10-20 14:25 | 只看該作者
bai_yun_123 發(fā)表于 2019-10-20 13:17
你的KeyScan()函數(shù)在主程序中都沒(méi)有出現(xiàn),這個(gè)函數(shù)的意思是按鍵掃描,一般是用來(lái)檢測(cè)按鍵是否被按下的, ...

嗯嗯,謝謝大哥的解答,我也發(fā)現(xiàn)了沒(méi)寫(xiě)按鍵掃描了,我把按鍵掃描加上,現(xiàn)在lcd可以進(jìn)行翻頁(yè)操作,電壓值都可以查詢,但按上鍵我查當(dāng)前值的時(shí)候,每次進(jìn)去都進(jìn)入了KeyTaAction()這個(gè)函數(shù)的while死循環(huán),但再摁下鍵查詢最大最小值就沒(méi)有任何反應(yīng),我想過(guò)把while改成do while 還是實(shí)現(xiàn)不了這個(gè)電壓值每300ms要檢測(cè),所以,我想問(wèn)下這個(gè)問(wèn)題怎么解答,謝謝,萬(wàn)分感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:616759 發(fā)表于 2019-10-20 17:30 | 只看該作者
不是while和do while的問(wèn)題,這兩個(gè)循環(huán)只是執(zhí)行條件的先后問(wèn)題,我看了keytaaction的函數(shù),while(1)是個(gè)死循環(huán),只要進(jìn)去了,沒(méi)有break,continue這種跳出循環(huán)的語(yǔ)句,那么就出不來(lái),即死循環(huán)。把while括號(hào)里的條件改成你需要的條件, 比如:
while (flag300ms)
     {
         flag300ms = 0;
           
        val = GetADCValue(0);
        ValueToString(str, val);
        LcdShowStr(0, 1, str);
      if (val >= 200)
      {
         enBuzz = 1;
        if (enBuzz)
           BUZZ = ~BUZZ;
      }
      else
          BUZZ = 1;
  }
當(dāng)然,條件不一定對(duì),因?yàn)楹竺嬗袀(gè)flag300ms置零,所以這個(gè)循環(huán)只執(zhí)行一次,至于執(zhí)行多少次就得看你的條件了,還有,你的程序很多不對(duì)齊,也沒(méi)有注釋?zhuān)雌饋?lái)很麻煩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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