找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

38譯碼器兩個級聯(lián)單片機程序求分析

查看數(shù): 6916 | 評論數(shù): 37 | 收藏 2
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2021-2-27 19:18

正文摘要:

關(guān)于兩個譯碼器級聯(lián)   切換是沒問題了可是切換的那個端口S4不知道在哪里控制它怎么切換有一個接線圖 單片機源程序如下: void HC138_GPIO_InIt()S {     S1=0;     S2=0; &nbs ...

回復(fù)

ID:232366 發(fā)表于 2021-3-3 22:25
帖子沉的好快
ID:232366 發(fā)表于 2021-3-3 18:48
人人學(xué)會單片機 發(fā)表于 2021-2-27 21:24
你這個很簡單  把 S1 S2 S3 S4 當作一個字節(jié)的低4位 就行了
取值范圍就是
0   0   0   0  0   0   0   0 ...

我現(xiàn)在明白您這幾行數(shù)字什么意思了  再次感謝您提供思路  小弟感激不盡
ID:232366 發(fā)表于 2021-3-2 12:40
人人學(xué)會單片機 發(fā)表于 2021-3-1 17:28
兩個138級聯(lián) 就等于一個154 所以叫你先去研究154怎么編程

哦哦明白了感謝提出建議
ID:390416 發(fā)表于 2021-3-1 17:28
SHANWAZI 發(fā)表于 2021-3-1 17:08
看過了里面有兩個138貌似也一樣可以級聯(lián) 我是重在學(xué)習(xí)硬件的的編程不是為了方便154確實是方便編程我是想 ...

兩個138級聯(lián) 就等于一個154 所以叫你先去研究154怎么編程
ID:232366 發(fā)表于 2021-3-1 17:10
wulin 發(fā)表于 2021-3-1 10:29
相同的功能可以用不同的代碼實現(xiàn),只要遵循簡潔、高效、易讀的原則,可任意發(fā)揮。貌似你這程序是用兩個13 ...

是的  138 四個  595三個    太感謝提供思路我已經(jīng)弄明白了對IO口與和或保持不變和改變后不影響其他的IO空的編程方法了 前面是絞盡腦汁怎么想都沒想明白小弟無以回報
ID:232366 發(fā)表于 2021-3-1 17:08
人人學(xué)會單片機 發(fā)表于 2021-3-1 10:42
都說了 先去研究一下 74HC154的芯片

看過了里面有兩個138貌似也一樣可以級聯(lián) 我是重在學(xué)習(xí)硬件的的編程不是為了方便154確實是方便編程我是想多了解一些和多學(xué)習(xí)一下
ID:390416 發(fā)表于 2021-3-1 10:42
都說了 先去研究一下 74HC154的芯片
ID:232366 發(fā)表于 2021-3-1 10:38
我用38譯碼器進行列掃描  595送數(shù)據(jù)的
ID:232366 發(fā)表于 2021-3-1 10:37
是的  138 四個  595三個    太感謝提供思路我已經(jīng)弄明白了對IO口與和或保持不變和改變后不影響其他的IO空的編程方法了 前面是絞盡腦汁怎么想都沒想明白小弟無以回報
ID:213173 發(fā)表于 2021-3-1 10:29
SHANWAZI 發(fā)表于 2021-3-1 10:13
非常感謝您耐心回復(fù)

static uint8 i=0;

相同的功能可以用不同的代碼實現(xiàn),只要遵循簡潔、高效、易讀的原則,可任意發(fā)揮。貌似你這程序是用兩個138和兩個595驅(qū)動16*16點陣。如果采用上述方法只需要7個I/O口就能完成。
ID:232366 發(fā)表于 2021-3-1 10:13
wulin 發(fā)表于 2021-3-1 08:24
這種控制方式低4位重新賦值前必須先清0,否則要出錯
        uint8 i;
        for(i=0;i

非常感謝您耐心回復(fù)

static uint8 i=0;
        P2&=0XF0;
        P2|=LedBuff;
        Delay100ms();
        i++;
        i=i%16;

請看這樣方法是不是可行  先與保持高四位  清零低四位
重新賦值按位或
ID:213173 發(fā)表于 2021-3-1 08:24
SHANWAZI 發(fā)表于 2021-2-28 22:26
那么是不是可以這樣理解呢比如p2口原本的數(shù)據(jù)

1111-0110按位與1111-0000

這種控制方式低4位重新賦值前必須先清0,否則要出錯
        uint8 i;
        for(i=0;i<16;i++)
        {
                P2&=0x00
                P2|=ledBuff;
                delay(200);
        }
如果再使用sbit LED=P2^7;
主函數(shù)中操作LED=0;上述代碼與此互不干擾
ID:232366 發(fā)表于 2021-2-28 22:27
wulin 發(fā)表于 2021-2-28 17:06
當然可以另外使用sbit定義獨立操作。高位按位與f不等于置1,而是原來是1還是1,原來是0還是0。
P2&=0xf0 ...

不好意思回復(fù)晚了
ID:232366 發(fā)表于 2021-2-28 22:26
wulin 發(fā)表于 2021-2-28 17:06
當然可以另外使用sbit定義獨立操作。高位按位與f不等于置1,而是原來是1還是1,原來是0還是0。
P2&=0xf0 ...

那么是不是可以這樣理解呢比如p2口原本的數(shù)據(jù)

1111-0110按位與1111-0000
結(jié)果為1111-0000我又去查了查資料按位與是0與任何數(shù)都為0只有1與1才為1這樣的話就應(yīng)了這個把高四位保持而低四位全部清理因為高四位數(shù)都為1與數(shù)高四也為1得出1與1結(jié)果還為1而低四位全部和0相與結(jié)果全部為零從而清零目的高四位不變   
如果我的點陣的行掃描使用38譯碼器級聯(lián)那么上面的s1s2s3s4對應(yīng)為P2口低四位我定義一個數(shù)組uint8  ledBuff[]={0x0f,0xfd……};
利用for循環(huán)依次取出對應(yīng)數(shù)據(jù)因為只用到低四位高八位沒有用  而在for循環(huán)進行時P2的高四位就會被賦值為1111  在上述中按位與操作
當?shù)谝淮蝔or循環(huán)獲取第一零個數(shù)組元素元素時
P2=P2&ledBuff[0];
那么是不是這樣  
1111-0000
1111-0000<按位與的值
結(jié)果為1111-0000
當for循環(huán)獲取第一個元素時
P2=P2&ledBuff[1];
是不是這樣
1111-1101
1111-0000<按位與的值
結(jié)果為1111-0000
那么這樣的話是不是每次只是保持高四位不變
而低四位每次都清零好像不是這個效果  低四位一直清零譯碼器豈不是一直在一個狀態(tài)
或者是這樣的
每次進入for
先對P2&=0xf0;先對低四位清零高四位不變
然后再給P2=ledBuff[1];賦一次新的值
這里發(fā)送段碼>忽略
這里延時>忽略
退出進入下一個循環(huán)


如果再使用sbit  LED=P2^7;
主函數(shù)中LED=0;會受控嗎?



不知道我這樣理解的思路對不對有問題還請指正初學(xué)者嘛 得多舉一反三(抱拳)







ID:213173 發(fā)表于 2021-2-28 17:06
SHANWAZI 發(fā)表于 2021-2-28 15:48
高位按位與置1了  高四位的還能使用sbit就行定義操作嗎?

當然可以另外使用sbit定義獨立操作。高位按位與f不等于置1,而是原來是1還是1,原來是0還是0。
P2&=0xf0;
1010 1010 原來狀態(tài)
1111 0000 按位與
-------------
1010 0000 結(jié)果高4位不變,低4位清0
ID:232366 發(fā)表于 2021-2-28 15:48
wulin 發(fā)表于 2021-2-28 14:13
給你的示例已經(jīng)非常清楚的說明字節(jié)高低位分開控制互不干擾,你還理解不了,無語了。

高位按位與置1了  高四位的還能使用sbit就行定義操作嗎?   
ID:232366 發(fā)表于 2021-2-28 15:08
zmc5354 發(fā)表于 2021-2-28 13:13
P2=Hc138改p2=i;就可以

上面我是用了數(shù)組賦值改P2for循環(huán)依次取出數(shù)組給P2低四位或者是高四位一一對應(yīng)38譯碼器的輸入和級聯(lián)使能
ID:232366 發(fā)表于 2021-2-28 14:21
wulin 發(fā)表于 2021-2-28 14:13
給你的示例已經(jīng)非常清楚的說明字節(jié)高低位分開控制互不干擾,你還理解不了,無語了。

有點卡殼沒理解透徹    尷尬
ID:213173 發(fā)表于 2021-2-28 14:13
SHANWAZI 發(fā)表于 2021-2-28 11:12
會影響高四位的工作這樣一來用一個字節(jié)高八位也會受影響尷尬

給你的示例已經(jīng)非常清楚的說明字節(jié)高低位分開控制互不干擾,你還理解不了,無語了。
ID:66757 發(fā)表于 2021-2-28 13:13
P2=Hc138改p2=i;就可以
ID:232366 發(fā)表于 2021-2-28 12:22
KongQuan 發(fā)表于 2021-2-28 11:37
第一片138設(shè)計為低使能,第二片設(shè)計為高使能,這樣就可以一要IO控制兩個138了,另外三個IO做譯碼控制?措 ...

分步使能其實可以達到效果但是實際編程的時候就實現(xiàn)不了
ID:822755 發(fā)表于 2021-2-28 11:37
第一片138設(shè)計為低使能,第二片設(shè)計為高使能,這樣就可以一要IO控制兩個138了,另外三個IO做譯碼控制。看電路,先看看芯片手冊。
ID:232366 發(fā)表于 2021-2-28 11:14
楊雪飛 發(fā)表于 2021-2-28 08:45
用4個IO口控制S1 S2 S3 S4,三個口的時候控制一片138,可以表示八種狀態(tài),也就是2的3次方,四位就可以表 ...

原理我也認證分析過  就是在編程思路上卡殼無從下手最后用數(shù)組這種本辦法但是這樣的話就高八位和第八位都用到低四位工作時高八位也受影響
ID:232366 發(fā)表于 2021-2-28 11:12
wulin 發(fā)表于 2021-2-28 06:30
給你一個簡單的示例程序就很容易理解了

會影響高四位的工作這樣一來用一個字節(jié)高八位也會受影響尷尬
ID:232366 發(fā)表于 2021-2-28 11:11
wulin 發(fā)表于 2021-2-28 06:30
給你一個簡單的示例程序就很容易理解了

無奈用了個笨辦法
uint8 code HC138[16]=
{
    0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,
    0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,

};

void HC138_Drive()
{
   
    uint8 i;
    for(i=0;i<16;i++)
    {
        P2=HC138;
        delay(200);
    }
ID:97554 發(fā)表于 2021-2-28 08:45
SHANWAZI 發(fā)表于 2021-2-27 23:34
我先去看看資料去先

用4個IO口控制S1 S2 S3 S4,三個口的時候控制一片138,可以表示八種狀態(tài),也就是2的3次方,四位就可以表示2的4次方數(shù),也就是16個狀態(tài)。就是7樓的電路。你的程序里S4直接給了0,需要把S4接入IO口,那么4個IO口給高低電平就可以表示16種狀態(tài)了
ID:213173 發(fā)表于 2021-2-28 06:30

給你一個簡單的示例程序就很容易理解了


  1. //P0控制數(shù)碼管筆段,P2低4位通過級聯(lián)138控制數(shù)碼管位
  2. #include <reg52.h>

  3. unsigned char code table[]={//共陰數(shù)碼管段碼"0~f"
  4.                 0x3f,0x06,0x5b,0x4f,
  5.                 0x66,0x6d,0x7d,0x07,
  6.                 0x7f,0x6f,0x77,0x7c,
  7.                 0x39,0x5e,0x79,0x71};

  8. unsigned char i;        //計數(shù)變量

  9. void delay(unsigned int k)//ms延時
  10. {
  11.         unsigned int i,j;
  12.         for(i=k;i>0;i--)
  13.                 for(j=110;j>0;j--);
  14. }

  15. void main()
  16. {       
  17.         while(1)
  18.         {
  19.                 P0=0x00;                //數(shù)碼管消隱
  20.                 P2&=0xf0;        //數(shù)碼管位碼清0,不影響P2高4位狀態(tài)
  21.                 P2|=i;                //賦值位碼,不影響P2高4位狀態(tài)
  22.                 P0=table[i];//賦值段碼,i=0~15
  23.                 i=++i%16;        //0~15循環(huán)計數(shù)
  24.                 delay(1);        //延時1ms,控制數(shù)碼管動態(tài)顯示速度
  25.         }
  26. }
復(fù)制代碼



ID:232366 發(fā)表于 2021-2-27 23:34
hefq 發(fā)表于 2021-2-27 22:36
把s4也當作數(shù)據(jù)

我先去看看資料去先
ID:232366 發(fā)表于 2021-2-27 23:33
hefq 發(fā)表于 2021-2-27 22:38
前面加一片,可以級聯(lián)更多,理論上可以無限級聯(lián)

兩個都沒弄明白重新的控制無限級聯(lián)更加是一片空白只是對我個人說尷尬
ID:605142 發(fā)表于 2021-2-27 22:38

前面加一片,可以級聯(lián)更多,理論上可以無限級聯(lián)
ID:605142 發(fā)表于 2021-2-27 22:36
把s4也當作數(shù)據(jù)
ID:232366 發(fā)表于 2021-2-27 21:55
人人學(xué)會單片機 發(fā)表于 2021-2-27 21:40
兩個138譯碼器 組合起來 就可以當作一個 74HC154譯碼器了  祁緒電子

我始終沒弄明白應(yīng)該在哪里來切換它  當?shù)谝淮蔚谝粋138循環(huán)完到Q7之后  切換到第二個138來S循環(huán)
前面敲很多次代碼就是沒實現(xiàn)
ID:390416 發(fā)表于 2021-2-27 21:40
兩個138譯碼器 組合起來 就可以當作一個 74HC154譯碼器了  祁緒電子
ID:390416 發(fā)表于 2021-2-27 21:36

把四個IO口當作一起的就行了  程序里面只控制了8行 所以只有S1S2S3
   
ID:232366 發(fā)表于 2021-2-27 21:31
人人學(xué)會單片機 發(fā)表于 2021-2-27 21:24
你這個很簡單  把 S1 S2 S3 S4 當作一個字節(jié)的低4位 就行了
取值范圍就是
0   0   0   0  0   0   0   0 ...

沒明白啥您意思
ID:390416 發(fā)表于 2021-2-27 21:24
你這個很簡單  把 S1 S2 S3 S4 當作一個字節(jié)的低4位 就行了
取值范圍就是
0   0   0   0  0   0   0   0=0
0   0   0   0  S4 S3 S2 S1=X
0   0   0   0  1   1   1   1=15
這樣就可以控制16行了  

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

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

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