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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

萌新51單片機程序調試求助!涉及矩陣鍵盤方面

[復制鏈接]
跳轉到指定樓層
樓主
ID:870622 發表于 2020-12-29 22:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛剛寫代碼的時候發現我寫的代碼有問題。
我寫了兩篇代碼,分別關于用數碼管做計時器從1至1000和用矩陣鍵盤在數碼管顯示1到F的。
要求如下


下面是我寫的代碼,我發現主函數那段,定時器的代碼和矩陣按鍵的代碼不能同時運行(按鍵在數碼管顯示的數字只有在按鍵按下時才顯示,松手不顯示,不滿足要求),但是當我把他們兩個代碼分別運行的時候,所得到的現象是滿足預期的,為什么當我把這兩個代碼合在一起時不能滿足預期?是哪個地方錯了,求大佬們告訴我

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

使用道具 舉報

沙發
ID:870622 發表于 2020-12-29 22:27 | 只看該作者
     這是代碼在附件里這是要求

原理圖也在附件里了

麻煩大佬們看看我的錯誤在哪
謝謝了

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint num;
void delayms(uint);
int apple,pear,a;
void knowledge(int,int,int);
uchar num1,ge,shi,bai,qian;
void display(uchar,uchar,uchar,uchar);




void display(uchar ge,uchar shi,ucharbai,uchar qian)   //計時器部分
{

dula=1;
       P0=table[qian];
       dula=0;
       P0=0xff;
       wela=1;
       P0=0XFE;
       wela=0;
       delayms(5);

       dula=1;
       P0=table[bai];
       dula=0;
       P0=0XFd;
       wela=1;
       P0=0XFd;
       wela=0;
       delayms(5);

       dula=1;
       P0=table[shi];
       dula=0;
       P0=0xff;
       wela=1;
       P0=0XFb;
       wela=0;
       delayms(5);

       dula=1;
       P0=table[ge];
       dula=0;
       P0=0xff;
       wela=1;
       P0=0XF7;
       wela=0;
       delayms(5);

}

void delayms(uint times)
{
uinti,j;
       for(i=0;i<60;i++)
           for(j=0;j>times;j++);
}

void T1_time() interrupt 1
{
TH0=(65536-18432)/256;
TL0=(65536-18432)%256;
num1++;
if(num1==50)
{
num1=0;
num++;
if(num ==1000)
   TR0=0;
qian= num/1000%10;
bai=num/100%10;
shi= num/10%10;
ge=num%10;

}



}

void knowledge(int apple,pear,a) //矩陣按鍵部分
{
  P3= 0xf0;
apple = P3&0xf0;

       if(apple!=0xf0)
       {
        P3 = 0xf0;
        apple = P3&0xf0;
        delayms(10);
        if(apple!=0xf0)
        {
              P3= 0xf0;
         apple = P3&0xf0;
         switch(apple)
              {
                case(0xe0):pear ==0;break;
                     case(0xd0):pear= 1;break;
                     case(0xb0):pear= 2;break;
                     case(0x70):pear= 3;break;
              }
   P3 = 0x0f;
   apple =P3;
              switch(apple)
              {
                case(0x0e):pear =pear;break;
                     case(0x0d):pear=pear+4;break;
                     case(0x0b):pear=pear+8;break;
                     case(0x07):pear=pear+12;break;
              }

              delayms(50);
               dula=1;
          P0=table[pear];
          dula=0;
    P0=0xff;
    wela=1;
          P0=0X7f;
      wela=0;
          delayms(5);
    P0=0xff;      



              }
       }
}
void main()
{
TMOD=0X01;
ET0=1;
TR0=1;
TH0=(65536-18432)/256;
TL0=(65536-18432)%256;
EA=1;
dula= 0;
while(1)
{
        knowledge(apple,pear,a);
        display(ge,shi, bai,      qian);
}
}
     ...  


BST-V51原理圖 v3.0.pdf

70.84 KB, 下載次數: 7

評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:743654 發表于 2020-12-30 21:35 | 只看該作者
因為你定時器中斷打開后,時間還沒到就進入while(1)循環了。在中斷服務函數中加個標志位flag=1,然后在while(1)循環中對標志位加以判斷并清0,響應中斷。
回復

使用道具 舉報

地板
ID:213173 發表于 2020-12-31 06:47 | 只看該作者
啊_奶瓶 發表于 2020-12-29 22:27
這是代碼在附件里這是要求

原理圖也在附件里了

樓主顯示方式不當,給你改為有鍵操作顯示鍵值,無鍵操作2秒自動恢復顯示時間。

  1. #include "reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit dula=P2^6;
  5. sbit wela=P2^7;

  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  9. uchar num;//中斷計數變量
  10. uchar sec,min;//秒、分變量
  11. uint count;//計數變量
  12. uchar keyValue;//鍵值變量

  13. void delayms(uint);//延時
  14. void keyscan();//按鍵掃描
  15. void display();//數碼管顯示

  16. void display()   //數碼管動態顯示
  17. {
  18.         static uchar i=0;//動態掃描計數變量
  19.         uchar buf[4];//顯示內容緩存數組

  20.         if(count==0)
  21.         {
  22.                 buf[0]=table[min/10];//顯示十分
  23.                 buf[1]=table[min%10]|0x80;//顯示分加小數點
  24.                 buf[2]=table[sec/10];//顯示十秒
  25.                 buf[3]=table[sec%10];//顯示秒
  26.         }
  27.         else
  28.         {
  29.                 buf[0]=0;//不顯示
  30.                 buf[1]=0;//不顯示
  31.                 buf[2]=0;//不顯示
  32.                 buf[3]=table[keyValue];//顯示鍵值
  33.         }
  34.         P0=0x00;//消隱
  35.         dula=1;//鎖存
  36.         dula=0;
  37.         P0=~(0x01<<i);//送位碼
  38.         wela=1;//鎖存
  39.         wela=0;
  40.         P0=buf[i];//送段碼
  41.         dula=1;//鎖存
  42.         dula=0;
  43.         i++;
  44.         i%=4;
  45. }
  46. void delayms(uint times)
  47. {
  48.         uint i,j;
  49.         for(i=0;i<60;i++)
  50.                 for(j=0;j>times;j++);
  51. }


  52. void keyscan() //矩陣按鍵部分
  53. {
  54.         static bit time=0;
  55.         P3=0xf0;
  56.         if(P3!=0xf0)
  57.         {
  58.                 delayms(10);
  59.                 if(P3!=0xf0&&time==0)
  60.                 {
  61.                         time=1;
  62.                         count=250;//預置5秒切換
  63.                         switch(P3)
  64.                         {
  65.                                 case(0xe0):keyValue=0;break;
  66.                                 case(0xd0):keyValue=1;break;
  67.                                 case(0xb0):keyValue=2;break;
  68.                                 case(0x70):keyValue=3;break;
  69.                         }
  70.                         P3=0x0f;
  71.                         switch(P3)
  72.                         {
  73.                                 case(0x0e):keyValue=keyValue;break;
  74.                                 case(0x0d):keyValue=keyValue+4;break;
  75.                                 case(0x0b):keyValue=keyValue+8;break;
  76.                                 case(0x07):keyValue=keyValue+12;break;
  77.                         }       
  78.                 }
  79.         }
  80.         else time=0;
  81. }
  82. void main()
  83. {
  84.         TMOD=0X01;
  85.         TH0=(65536-18432)/256;//20ms
  86.         TL0=(65536-18432)%256;
  87.         TR0=1;
  88.         ET0=1;
  89.         EA=1;
  90.         while(1)
  91.         {
  92.                 keyscan();
  93.                 display();
  94.         }
  95. }

  96. void T1_time() interrupt 1
  97. {
  98.         TH0=(65536-18432)/256;
  99.         TL0=(65536-18432)%256;
  100.         num++;
  101.         if(num>=50)//秒
  102.         {
  103.                 num=0;
  104.                 sec++;
  105.                 if(sec>=60)
  106.                 {
  107.                         sec=0;
  108.                         min++;
  109.                         if(min>=60)
  110.                         min=0;
  111.                 }
  112.         }
  113.         if(count>0)
  114.                 count--;
  115. }
復制代碼
回復

使用道具 舉報

5#
ID:390416 發表于 2020-12-31 10:40 | 只看該作者
#include "all.h"
u8 xdata Key4x4_Read_Byte=3;//矩陣結果輸出變量
u8 code Key4x4_Buffer[4]={0xfe,0xfd,0xfb,0xf7};
void Key4x4_Scan_Drive()
{
        static xdata u16 count=0;
        u8 i,j,Value;
        count++;
        if(count>1000)
        {
                count=0;
                IE2&=~0x08;
                for(i=0;i<4;i++)
                {
                        P0=Key4x4_Buffer[i];
                        Value=0x80;
                        for(j=0;j<4;j++)
                        {
                                if((P0&Value)==0)
                                {
                                        Key4x4_Read_Byte=j*4+i+1;
                                }
                                Value>>=1;
                        }
                }
                P0=0xff;
                IE2|=0x08;
        }
}

主函數 高速調用上面的函數 就行。主函數必須高速循環。不能有while(key)的這種 死等。
回復

使用道具 舉報

6#
ID:870622 發表于 2021-1-1 00:14 | 只看該作者
wulin 發表于 2020-12-31 06:47
樓主顯示方式不當,給你改為有鍵操作顯示鍵值,無鍵操作2秒自動恢復顯示時間。

謝謝你
回復

使用道具 舉報

7#
ID:870622 發表于 2021-1-1 00:15 | 只看該作者
cheney03 發表于 2020-12-30 21:35
因為你定時器中斷打開后,時間還沒到就進入while(1)循環了。在中斷服務函數中加個標志位flag=1,然后在whil ...

好的,謝謝你
回復

使用道具 舉報

8#
ID:870622 發表于 2021-1-1 00:16 | 只看該作者
人人學會單片機 發表于 2020-12-31 10:40
#include "all.h"
u8 xdata Key4x4_Read_Byte=3;//矩陣結果輸出變量
u8 code Key4x4_Buffer[4]={0xfe,0xf ...

好的,謝謝你
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞网站 | 日韩一区二区av | 亚洲国产成人在线视频 | japanhdxxxx裸体 | 久草成人 | 一区二区三区在线播放视频 | 久久99精品久久久97夜夜嗨 | 欧美一区不卡 | 美女中文字幕视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 久久亚洲天堂 | 97超碰人人草 | 五月婷婷激情网 | 男女在线网站 | 欧美在线激情 | 91精品国产一区二区三区 | 99精品在线观看 | 91资源在线| 欧美xxxx色视频在线观看免费 | 国产偷录叫床高潮录音 | 国产一区二区三区免费 | 久久一区二区三区四区五区 | 国产美女在线播放 | 亚洲一区二区三区在线播放 | 中文字幕一区二区三区不卡 | 一本大道久久a久久精二百 欧洲一区二区三区 | 欧美日韩国产精品激情在线播放 | 久久久久久久av | 亚洲精品片 | 天天综合久久 | 中文字幕一区二区三区日韩精品 | 超碰97免费在线 | 国产一区二区三区久久久久久久久 | 国产午夜精品理论片a大结局 | 国产乱码精品一区二区三区忘忧草 | 国产日韩欧美电影 | av网站免费观看 | 一区二区三区精品在线视频 | 成人乱人乱一区二区三区软件 | 国产欧美日韩精品在线观看 | 国产亚洲欧美另类一区二区三区 |