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

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

QQ登錄

只需一步,快速開始

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

2個(gè)74HC595控制2個(gè)8x8點(diǎn)陣,顯示3位數(shù)字

[復(fù)制鏈接]
ID:566214 發(fā)表于 2020-12-30 23:35 | 顯示全部樓層 |閱讀模式
想用2個(gè)74HC595控制2個(gè)8x8點(diǎn)陣,顯示3位數(shù)字,但這3個(gè)數(shù)字要互不干擾,如圖,顯示2位數(shù)字會(huì)做,但是顯示3位的就不知道怎么下手了,沒有思路,就像控制8位數(shù)碼管的小數(shù)點(diǎn)亮一下滅一下,而不影響其數(shù)字的顯示一樣,這個(gè)問題我也不知道怎么解決,求各位大佬給點(diǎn)思路,怎么寫這個(gè)驅(qū)動(dòng)程序,小弟不勝感激,謝謝各位。
屏幕截圖 2020-12-30 232758.png
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-3 14:17 | 顯示全部樓層
如果每個(gè)數(shù)字字符使用5*8的點(diǎn)陣表達(dá)(有一個(gè)空白列作為間隔),三個(gè)數(shù)字占用15列像素。兩個(gè)595可以表達(dá)兩個(gè)字節(jié)計(jì)16位,絕對(duì)是夠用了。但這就要求你自己重新設(shè)計(jì)所有數(shù)字、字母的點(diǎn)陣數(shù)據(jù)了,以適應(yīng)5*8的方式。你給的圖片中1、2、3,使用了5*8的點(diǎn)陣方式.
我個(gè)人建議你建立4*7點(diǎn)陣模式,因?yàn)橐紤]數(shù)字中間的空白間隔。使用5*8導(dǎo)致太緊湊,不好看。
5x7點(diǎn)陣數(shù)字.jpg

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2020-12-30 23:37 | 顯示全部樓層
3位數(shù)字可自由控制
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-31 11:35 | 顯示全部樓層
我很想知道,你兩個(gè)595怎么驅(qū)動(dòng)16*8點(diǎn)的?正反都驅(qū)動(dòng)?
說說你的問題,你可以開辟一個(gè)16字節(jié)的數(shù)組,分別對(duì)應(yīng)每一列。595就負(fù)責(zé)把每一列的字節(jié)顯示到16*8點(diǎn)LED上去,這樣,至于你顯示什么圖案,那就跟595無關(guān)了。你只需要往數(shù)組里面填充字節(jié)值就行了。
具體操作,建議你學(xué)習(xí)《人人學(xué)會(huì)單片機(jī)》視頻教程,第13、14、15、16課程,就是這樣操作的。
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2020-12-31 20:39 | 顯示全部樓層
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2020-12-31 11:35
我很想知道,你兩個(gè)595怎么驅(qū)動(dòng)16*8點(diǎn)的?正反都驅(qū)動(dòng)?
說說你的問題,你可以開辟一個(gè)16字節(jié)的數(shù)組,分別 ...

行掃描我沒有寫出來,兩個(gè)595是列掃描,如果2個(gè)595只顯示2個(gè)數(shù)字,我會(huì)寫驅(qū)動(dòng),但是2個(gè)595要顯示3個(gè)數(shù)字,我沒不知道怎么寫了,請(qǐng)賜教
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-3 20:32 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-3 14:17
如果每個(gè)數(shù)字字符使用5*8的點(diǎn)陣表達(dá)(有一個(gè)空白列作為間隔),三個(gè)數(shù)字占用15列像素。兩個(gè)595可以表達(dá)兩個(gè) ...

2個(gè)595是16位,每次發(fā)8位,如果只顯示2位數(shù)字,那好辦,我不明白的是如何把16位原本顯示兩位數(shù)字的拆成顯示3位數(shù)字,就是說我只能用一個(gè)595來控制顯示1位數(shù)字,如果要讓2個(gè)595來顯示3位數(shù),這個(gè)就不懂了,不知道怎么寫這個(gè)驅(qū)動(dòng)程序
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-4 22:04 | 顯示全部樓層
本帖最后由 suncat0504 于 2021-1-5 18:41 編輯
dcjdcj 發(fā)表于 2021-1-3 20:32
2個(gè)595是16位,每次發(fā)8位,如果只顯示2位數(shù)字,那好辦,我不明白的是如何把16位原本顯示兩位數(shù)字的拆成顯 ...

原理我已經(jīng)和你說了。點(diǎn)陣顯示數(shù)字字符,無非就是逐行逐列把像素點(diǎn)的數(shù)據(jù)傳遞給顯示部件。
一個(gè)595對(duì)應(yīng)一個(gè)字節(jié),就是8個(gè)bit位。兩個(gè)對(duì)應(yīng)16個(gè)Bit位。當(dāng)每個(gè)字符、數(shù)字占用一個(gè)字節(jié)8Bit位的時(shí)候,每個(gè)595一次只能顯示一個(gè)一行8列的像素點(diǎn),逐行掃描,視覺暫留現(xiàn)象,呈現(xiàn)出一個(gè)完整的字符。
當(dāng)一個(gè)字符使用4x8方式顯示的的時(shí)候。這個(gè)字符每一行占用4個(gè)像素點(diǎn),共8行就能完整顯示一個(gè)字符。那么兩個(gè)595,就能同時(shí)顯示4個(gè)字符了。實(shí)際使用,為了避免太緊湊,我加了一行空白行,就是全0的那行。數(shù)字之間間隔一個(gè)空白列,數(shù)字最后還有一個(gè)空白咧,就是在垂直方向上全都為0的那些列。
比如,使用我提供的點(diǎn)陣組合,對(duì)234這個(gè)數(shù)值的組合,我只用0和1來表達(dá), 0表示不亮,1表示亮:
0 1234 5 6789 A BCDE F    // 這行是以16進(jìn)制表示Bit位的編號(hào)
------------------------------
0 0000 0 0000 0 0000 0    // 第0行 從這行開始,表示的是像素?cái)?shù)據(jù),0-不亮;1-亮;這樣是空白行。
0 0110 0 0110 0 0110 0    // 第1行
0 1001 0 1001 0 1010 0    // 第2行
0 0001 0 0001 0 1010 0    // 第3行
0 0010 0 0010 0 1010 0    // 第4行
0 0100 0 0001 0 1110 0    // 第5行
0 1000 0 1001 0 0010 0    // 第6行
0 1111 0 0110 0 0010 0    // 第7行
你注意看由1組成的圖形是不是2、3、4?
按照這個(gè)點(diǎn)陣數(shù)據(jù),你只需要把每行的數(shù)據(jù)拆分為兩個(gè)字節(jié),分別提供給595即可。
這樣。為了顯示234,把以下數(shù)據(jù)逐行提供給兩個(gè)595
0x00 0x00    // 第0行,,對(duì)應(yīng)000000000000
0x31 0x8C    // 第1行,對(duì)應(yīng)0 0110 0 011 0 0 0110 0
0x4A 0x54    // 第2行 對(duì)應(yīng)0 1001 0 1001 0 1010 0
0x08 0x54    // 第3行 對(duì)應(yīng)0 0001 0 0001 0 1010 0
0x10 0x94    // 第4行 0 0010 0 0010 0 1010 0
0x20 0x5E    // 第5行 0 0100 0 0001 0 1110 0
0x42 0x44    // 第6行 0 1000 0 1001 0 0010 0
0x79 0x84    // 第7行 0 1111 0 0110 0 0010 0
那么,在16*8的點(diǎn)陣LED上現(xiàn)實(shí)的就是234數(shù)字了。其中第0、5、A、F列是空白列。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-4 22:20 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-3 20:32
2個(gè)595是16位,每次發(fā)8位,如果只顯示2位數(shù)字,那好辦,我不明白的是如何把16位原本顯示兩位數(shù)字的拆成顯 ...

自己組織點(diǎn)陣數(shù)據(jù)對(duì)應(yīng)數(shù)字,需要預(yù)先把每個(gè)數(shù)字的點(diǎn)陣數(shù)據(jù)以0和1的方式建立出數(shù)組,對(duì)4列8行,每個(gè)數(shù)字張勇一個(gè)二維數(shù)組,比如對(duì)于數(shù)字2的點(diǎn)陣數(shù)據(jù):
pix[2]={{0,0,0,0},
          {0,1,1,0},
          {1,0,0,1},
          {0,0,0,1},
          {0,0,1,0},
          {0,1,0,0},
          {1,0,0,0},
          {1,1,1,1}
         }
把所有數(shù)字弄到一起,組成一個(gè)三維數(shù)組,方便按照下標(biāo)定位數(shù)字所在元素,組成字節(jié)數(shù)據(jù)。
當(dāng)需要顯示234時(shí),
先取第一行像素?cái)?shù)據(jù),依次把0、pix[2]的第0行像素的四列,0,pix[3]的第0行像素的前兩列,0,共計(jì)8Bit位,放到第一個(gè)595
再取pix[3]的第0行像素的后兩列,0,pix[4]的第0行像素的四列,0,共計(jì)8Bit位,放到第二個(gè)595中,
這樣234的第一行就都被設(shè)置好了;接著是其他各行的像素?cái)?shù)據(jù),也按照這種方式組織并顯示,最終,“234”就被顯示出來了。
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-4 22:24 | 顯示全部樓層
實(shí)際上,pix也可以被定義為一位數(shù)組,而一位數(shù)組的每個(gè)元素是另一個(gè)二維數(shù)組(對(duì)應(yīng)4 x 8的點(diǎn)陣數(shù)據(jù))。這樣處理,可能更容易一些。
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-4 22:43 | 顯示全部樓層
本帖最后由 suncat0504 于 2021-1-5 18:42 編輯

圖片說明更容易理解,第五行16進(jìn)制數(shù)錯(cuò)了,是0x20, 0x5E
4x8點(diǎn)陣數(shù)字的掃描.jpg
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-4 23:20 | 顯示全部樓層
本帖最后由 suncat0504 于 2021-1-4 23:26 編輯

如果不想用點(diǎn)陣模式保存,也可以用字節(jié)數(shù)據(jù)保存,比如
數(shù)字2的各行數(shù)值 pix[2] = {0, 6,9, 1, 2, 4, 8, 15}
數(shù)字3的各行數(shù)值 pix[3] = {0  6 , 9, 1, 2, 1, 9, 6 }
數(shù)字4的各行數(shù)值 pix[4] = {0, 6, 10, 10, 10, 15, 2, 2}
顯示234的時(shí)候,第二行的點(diǎn)陣數(shù)據(jù):
        第一個(gè)595 = (pix[2][1]<<3) | (pix[3][1]>>2) ;    // 6<<3 | 6>>2=49=0x31;
        第一個(gè)595 = (pix[3][1]<<6) | (pix[4][1]<<1);; // 6<<6 | 6<<1=140=0x8c
這樣的效果是一樣的。(注意,移位操作,是不帶進(jìn)位的移位)
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-5 22:00 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-4 23:20
如果不想用點(diǎn)陣模式保存,也可以用字節(jié)數(shù)據(jù)保存,比如
數(shù)字2的各行數(shù)值 pix[2] = {0, 6,9, 1, 2, 4, 8, 1 ...

#include<reg52.h>
#include<intrins.h>
#define LED_HX P2
typedef unsigned int u16;        
typedef unsigned char u8;
bit Dis_Flag=0;                                    //掃描時(shí)間標(biāo)志位
u8 DATA1,DATA2;                                //   595數(shù)據(jù)
u8 Duan_Xuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//行掃描
u8 code Num_Table[3][8]=
{
        {0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x0E},        //     0
        {0x00,0x04,0x0C,0x04,0x04,0x04,0x04,0x0E},        //        1
//        {},        //  2
//        {},        //        3
//        {},        //        4
//        {},        //        5
//        {},        //        6
        {0x00,0x1F,0x01,0x02,0x04,0x04,0x04,0x04},        //        7
//        {},        //        8
//        {},        //        9
};

sbit SRCLK=P1^0;
sbit R_CLK=P1^1;
sbit SER=P1^2;

void Hc595SendByte()
{
        u8 i;
        SER=1;
        SRCLK=0;
        R_CLK=0;
                for(i=0;i<8;i++)
                {
                        SER=DATA1&0x80;
                        DATA1<<=1;
                        SRCLK=1;
                        _nop_();
                        _nop_();
                        SRCLK=0;        
                }

                for(i=0;i<8;i++)
                {
                        SER=DATA2&0x80;
                        DATA2<<=1;
                        SRCLK=1;
                        _nop_();
                        _nop_();
                        SRCLK=0;        
                }

                R_CLK=1;
                _nop_();
                _nop_();
                R_CLK=0;
}

void Duan_Dis()                //顯示
{
        static u8 i=0;
        if(Dis_Flag)
        {
                Dis_Flag=0;
                LED_HX=Duan_Xuan[ i];     
                DATA1=Num_Table[0][ i];
                DATA2=Num_Table[2][ i];
                i++;
                i%=8;
        }
}

void Timer0Init(void)                //100us 22.1184.000MHz
{        
        TMOD &= 0xF0;               
        TMOD |= 0x02;               
        TL0 = 0x48;               
        TH0 = 0x48;               
        TF0 = 0;               
        TR0 = 1;               
        ET0=1;
        EA=1;
}

void main(void)
{
        Timer0Init();
        while(1)                        
        {
                Hc595SendByte();
                Duan_Dis();
        }
}

void Timer_Ser(void) interrupt 1
{
        static u8 i;
        i++;
        if(i>=5)
        {
                i=0;
                Dis_Flag=1;
        }
}


屏幕截圖 2021-01-05 195407.png
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-5 22:12 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-4 23:20
如果不想用點(diǎn)陣模式保存,也可以用字節(jié)數(shù)據(jù)保存,比如
數(shù)字2的各行數(shù)值 pix[2] = {0, 6,9, 1, 2, 4, 8, 1 ...

比如5*7的字體,16列可顯示3個(gè)數(shù)字,這3個(gè)數(shù)字用變量去控制其顯示的內(nèi)容
回復(fù)

使用道具 舉報(bào)

14#
無效樓層,該帖已經(jīng)被刪除
ID:517466 發(fā)表于 2021-1-6 10:06 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-5 22:12
比如5*7的字體,16列可顯示3個(gè)數(shù)字,這3個(gè)數(shù)字用變量去控制其顯示的內(nèi)容

是啊,你想要的這個(gè)變量,不就是數(shù)組pix的以為元素的下標(biāo)嗎?
變量num1=2; 那么pix[num1]不就是pix[2]嗎?編程要靈活一些。
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-6 22:18 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-6 10:06
是啊,你想要的這個(gè)變量,不就是數(shù)組pix的以為元素的下標(biāo)嗎?
變量num1=2; 那么pix[num1]不就是pix[2]嗎 ...

看了一些教程,說是可以開一個(gè)16字節(jié)緩存,再映射到每一列上,但是我這個(gè)是發(fā)一個(gè)字節(jié)是橫向排列的,不改電路的情況下可以實(shí)現(xiàn)一列一列的掃描嗎?如果這樣,就可以控制每一列顯示的內(nèi)容了,就可以顯示任意的內(nèi)容了
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-6 23:57 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-4 23:20
如果不想用點(diǎn)陣模式保存,也可以用字節(jié)數(shù)據(jù)保存,比如
數(shù)字2的各行數(shù)值 pix[2] = {0, 6,9, 1, 2, 4, 8, 1 ...

非常感謝您的耐心解答,這樣是可以一個(gè)595顯示兩個(gè)字了,但是不能把1號(hào)595的數(shù)據(jù)移到2號(hào)上面,不能實(shí)現(xiàn)自由顯示的目的

  1. u8 code Table1[10][8]=
  2. {
  3.         {0,6,9,9,9,9,9,6},                //0
  4.         {0,2,6,2,2,2,2,7},                //1        
  5.         {0,6,9,1,2,4,8,15},                //2
  6.         {0,6,9,1,6,1,9,6},                //3
  7.         {0,2,6,10,10,15,2,2},        //4
  8.         {0,15,8,14,1,1,9,6},        //5
  9.         {0,6,9,8,14,9,9,6},                //6
  10.         {0,15,9,1,2,2,4,4},                //7
  11.         {0,6,9,9,6,9,9,6},                //8
  12.         {0,6,9,9,7,1,2,4},                //9
  13. };
  14. void Duan_Dis()                //ÏÔê¾
  15. {
  16.         static u8 i=0;
  17.         if(Dis_Flag)
  18.         {
  19.                 Dis_Flag=0;
  20.                 LED_HX=Duan_Xuan[i];     
  21.                 DATA1=Table1[5][i]<<4|Table1[2][i];
  22.                 DATA2=Table1[9][i]<<4|Table1[0][i];
  23.                 i++;
  24.                 i%=8;
  25.         }
  26. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-7 14:40 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-6 23:57
非常感謝您的耐心解答,這樣是可以一個(gè)595顯示兩個(gè)字了,但是不能把1號(hào)595的數(shù)據(jù)移到2號(hào)上面,不能實(shí)現(xiàn)自 ...

顯示原理通了,下一步就是怎么用程序用合理的邏輯實(shí)現(xiàn)的問題了,對(duì)嗎?這不就是程序員要做到的事情嗎?
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-7 18:44 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-7 14:40
顯示原理通了,下一步就是怎么用程序用合理的邏輯實(shí)現(xiàn)的問題了,對(duì)嗎?這不就是程序員要做到的事情嗎?

唉,剛?cè)肟有“滓幻,理論?jīng)驗(yàn)都不足
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-7 20:23 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-7 18:44
唉,剛?cè)肟有“滓幻,理論?jīng)驗(yàn)都不足

這是我剛剛測(cè)試過的程序,已經(jīng)用proteus模擬過了。你可以試試。

595顯示數(shù)字.zip

66.68 KB, 下載次數(shù): 11

2個(gè)595顯示3位數(shù)字

回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-7 20:41 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-7 18:44
唉,剛?cè)肟有“滓幻叮碚摻?jīng)驗(yàn)都不足

程序稍加改動(dòng),就可以變成驅(qū)動(dòng)四位數(shù)字的。// 保存四位數(shù)字的數(shù)組變量
u8 v[4]={2,3,4,5};


void getValue(void) {
        v[0]=val/1000;
        v[1]=(val%1000)/100;
        v[2]=(val%100)/10;
    v[3]=val%10;
}

void main() {
    // 初始化595控制管腳
        DATA=0;
        CLK=0;
        LOCK=0;
        getValue(); // 獲得顯示數(shù)值
        while(1) {
                // 按鍵按下,累加數(shù)據(jù)
                if (Key==0) {
                        delayms(5); // 防抖
                        if (Key==0) {
                            while(Key==0); // 等待按鍵松開
                                val++; // 累加1
                                getValue(); // 獲得顯示數(shù)值
                        }
                }
                disp();
        }
}


disp函數(shù)中,計(jì)算行顯示數(shù)據(jù)的地方:
        // 循環(huán)行
        for (row=0; row<8; row++) {
                // 根據(jù)顯示數(shù)值,計(jì)算每行的點(diǎn)陣數(shù)據(jù)。一行兩個(gè)字節(jié),16Bit位對(duì)應(yīng)16列
                // col_data[row][0]對(duì)應(yīng)第一個(gè)595,col_data[row][1]對(duì)應(yīng)第二個(gè)595.
                // 因?yàn)槭羌?jí)聯(lián),所以從col_data[row][1]到col_data[row][0],從Bit0到Bit7串行輸出
                //col_data[row][0]=(Table[v[0]][row]<<3) | (Table[v[1]][row]>>2);
                //col_data[row][1]=(Table[v[1]][row]<<6) | (Table[v[2]][row]<<1);
                col_data[row][0]=(Table[v[0]][row]<<4) | (Table[v[1]][row]);
                col_data[row][1]=(Table[v[2]][row]<<4) | (Table[v[3]][row]);
        }

編譯、執(zhí)行proteus模擬后,就會(huì)看到顯示結(jié)果。每按動(dòng)一次按鈕,顯示數(shù)據(jù)+1.
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-7 20:45 | 顯示全部樓層
把顯示延時(shí)3毫秒改成1毫秒,proteus顯示更穩(wěn)定,不閃爍。

proteus模擬的截圖

proteus模擬的截圖
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-7 21:49 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-7 20:41
程序稍加改動(dòng),就可以變成驅(qū)動(dòng)四位數(shù)字的。// 保存四位數(shù)字的數(shù)組變量
u8 v[4]={2,3,4,5};

顯示4位數(shù)字的已經(jīng)實(shí)現(xiàn)了,但是太緊湊了,顯示3位的問題是:如何將1號(hào)595的數(shù)據(jù)移一點(diǎn)在2號(hào)595上,這樣就可以顯示3位了,還可以每位數(shù)字之間間隔一列空的,但只能右移4次,超過的就移出去了,預(yù)想的是移到2號(hào)595上
屏幕截圖 2021-01-07 213236.png
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-7 22:14 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-7 20:41
程序稍加改動(dòng),就可以變成驅(qū)動(dòng)四位數(shù)字的。// 保存四位數(shù)字的數(shù)組變量
u8 v[4]={2,3,4,5};

3位的我也懂了,非常謝謝你,還想請(qǐng)教一個(gè)問題:就有源蜂鳴器怎么實(shí)現(xiàn)檢查到按鍵按下響,長按就一直響直到松手為止,這個(gè)問題也困擾了我好久,網(wǎng)上也沒有找到解決的方法,有一個(gè)多月了,現(xiàn)在也沒有想出怎么驅(qū)動(dòng),難道是我不適合這條路嗎
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2021-1-8 09:03 | 顯示全部樓層
dcjdcj 發(fā)表于 2021-1-7 22:14
3位的我也懂了,非常謝謝你,還想請(qǐng)教一個(gè)問題:就有源蜂鳴器怎么實(shí)現(xiàn)檢查到按鍵按下響,長按就一直響直 ...

你下載的程序里,在主函數(shù)中不是有按鍵的監(jiān)察處理嗎?從按下到松開的整個(gè)過程,都有代碼。你只要在防抖動(dòng)檢查的Key==0的判斷之后,開啟聲音;在確認(rèn)松開之后(while(Key==0);)架上停止聲音的代碼不就可以了嗎?
if  (Key==0) {      // 檢查按鍵是否按下
    delayms(20);    // 防抖的延時(shí),防止因?yàn)楫惓8蓴_引起的誤觸發(fā)動(dòng)作
    if  (Key==0) {  // 在防抖之后,再次確認(rèn)按鍵是否真的被按下
        打開聲音();         // 按鍵被按下,開始播放聲音
        while(Kewy==0); // 直到按鍵松開后,才執(zhí)行“關(guān)閉聲音();”開始處的代碼
        關(guān)閉聲音();         // 按鍵已經(jīng)被松開,停止i播放聲音
        ...                      // 按鍵被按下后,執(zhí)行對(duì)應(yīng)的處理機(jī)能
    }
}
回復(fù)

使用道具 舉報(bào)

ID:566214 發(fā)表于 2021-1-8 19:01 | 顯示全部樓層
suncat0504 發(fā)表于 2021-1-8 09:03
你下載的程序里,在主函數(shù)中不是有按鍵的監(jiān)察處理嗎?從按下到松開的整個(gè)過程,都有代碼。你只要在防抖動(dòng) ...

我學(xué)的按鍵檢測(cè)是用狀態(tài)機(jī)的方式實(shí)現(xiàn)的,網(wǎng)上說判斷按鍵按下后,給一個(gè)標(biāo)志位,蜂鳴器用npn管驅(qū)動(dòng),給高就響,低就不響,又不能像LED燈一樣io口取反,給了1以后,多久給0,還是在按鍵松手后也給個(gè)標(biāo)志位?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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