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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于單片機跑馬燈的問題(不簡單)

  [復(fù)制鏈接]
ID:275111 發(fā)表于 2018-5-29 16:22 | 顯示全部樓層 |閱讀模式
求助。問題如下,實現(xiàn)跑馬燈,但是MCU的口是這樣的。從左向右,P31 P00 P01 P02 P03 P06 P07 P34.
要求是這樣的,第一下按鍵:P02 P03亮;然后P01 P06亮;P00 P07亮;P31 P34亮。(每一對燈依次亮,每次只有一對燈亮)
                     第二下按鍵:反向;
                     第三下按鍵:同時閃爍;
                     地四下按鍵:全滅。

高人指點,特別有2點,我很困惑解決不了,1,兩個IO口拼成一個8bit的,怎么處理?
                                                           2,怎么調(diào)節(jié)燈閃爍的速度;(我試了delay,循環(huán)等方法都不好)

請高手寫程序出來,我好學(xué)習(xí),調(diào)試。非常感謝。

評分

參與人數(shù) 1黑幣 +3 收起 理由
Yshysh + 3 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:329253 發(fā)表于 2018-5-29 17:52 來自觸屏版 | 顯示全部樓層
不是你說的兩個IO口拼成八位的數(shù),這個程序應(yīng)該是用中斷處理比較好
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-5-29 19:36 | 顯示全部樓層
這是兩個問題;
1.由異組端口映射到一個8位變量,操作這個變量就是操作相應(yīng)端口。可以查找我在此區(qū)的回帖。異組端口組成矩陣鍵盤的讀寫操作
2.由按鍵控制的花樣流水燈。
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2018-5-29 22:39 | 顯示全部樓層
很簡單,要點:
1、做一個1-4的計數(shù)器RJ,每次按鍵讓RJ+1,再用RJ決定顯示的四個方式。
2、用T0作為改變顯示狀態(tài)的時鐘,做一個調(diào)整器RT,用RT決定T0的中斷時間,改變RT的大小,就達成了調(diào)速的目的。
3、每次T0中斷后置一個標記BJ=1。
4、當(dāng)BJ=1時,根據(jù)RJ的值,進行顯示的切換,切換完成后清除BJ=0。
回復(fù)

使用道具 舉報

ID:216258 發(fā)表于 2018-5-30 08:58 | 顯示全部樓層
請參考下靣的帖子,樓主的問題跟這個類似,這是我當(dāng)初發(fā)問的問題,也是 wulin 大神回復(fù)指導(dǎo)的帖子,
不過蠻亂的,請直接看 wulin 大神 寫的程序,
(如有不懂請請教 wulin 大神,我也是菜鳥級的,只是每天會進論壇看看別人寫的程序)

http://www.zg4o1577.cn/bbs/dpj-93120-1.html
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-5-30 10:45 | 顯示全部樓層
wulin 發(fā)表于 2018-5-29 19:36
這是兩個問題;
1.由異組端口映射到一個8位變量,操作這個變量就是操作相應(yīng)端口。可以查找我在此區(qū)的回帖 ...

非常感謝高人指導(dǎo)。但是現(xiàn)在有一個問題,就是我現(xiàn)在用的這款單片機51的,自己帶庫,P31 P00 P01 P02 P03 P06 P07 P34 這些是它自己定義過的,要求必須用這些來寫,而且最好是能對它們“像一個端口”一樣操作,我考慮了“位段”但是具體操作及其失敗,我也不會定義結(jié)構(gòu)。第二個問題是,跑馬燈要循環(huán)的,這個要怎么實現(xiàn)?
我是小白,如果有弱智的問題,請高人明確指出,千萬別覺的問題簡單,非常感謝。
回復(fù)

使用道具 舉報

ID:195836 發(fā)表于 2018-5-30 11:33 | 顯示全部樓層
P31 P00 P01 P02 P03 P06 P07 P34這八個口是吧,那就是P0跟P3口咯
首先是P02,P03亮,此時P0=0x06,P3=0x00
然后P01,P06亮,此時P0=0x42,P3=0x00
然后P00,P07亮,此時P0=0x81,P3=0x00
然后P31,P34亮,此時P0=0x00,P3=0x12
這不就ok了嗎是吧,你就在循環(huán)中,每次把數(shù)組a賦給P0口,數(shù)組b賦給P3口,一次操作這兩個口就ok了吧

至于改變閃爍速度,簡單的方法就是按鍵觸發(fā)中斷,中斷改變定時參數(shù),然后反映在主程序中。當(dāng)然有別的方法,而且可能更好
回復(fù)

使用道具 舉報

ID:216258 發(fā)表于 2018-5-30 11:33 | 顯示全部樓層
請參考下靣程序看看,這也是 wulin 大神寫的;


這是不同端口組合8位流水燈演示程序
#include <AT89X52.H>
#include <intrins.h>
#define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
#define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar

sbit code0=P2^0;        
sbit code1=P2^1;
sbit code2=P2^2;
sbit code3=P3^0;
sbit code4=P3^1;
sbit code5=P3^2;        
sbit code6=P1^0;
sbit code7=P1^1;        

uchar Cnt50ms=0;                        //中斷計時變量
uchar LED=0xfe;                        //8個發(fā)光管列陣

void Timer0Init()                //50毫秒@12.000MHz
{
        TMOD= 0x01;                //設(shè)置定時器模式
        TL0 = 0xB0;                //設(shè)置定時初值
        TH0 = 0x3C;                //設(shè)置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        EA=1;                                //開總中斷
        ET0=1;                        //開定時器0中斷        
}

void PX(uchar i)                                        //寫入8位數(shù)據(jù)
{   
    code0=i&0x01;i>>=1;        
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}

void main()
{
        PX(LED);
        Timer0Init();
        while(1)
        {
                if(Cnt50ms>=20)//1秒        
                {
                        Cnt50ms=0;
                        PX(LED=_crol_(LED,1));//循環(huán)左移1位
                }
        }
}
void timer0() interrupt        1
{
        TL0 = 0xB0;                //設(shè)置定時初值
        TH0 = 0x3C;                //設(shè)置定時初值
        Cnt50ms++;                //中斷變量Cnt50ms自+1
}

回復(fù)

使用道具 舉報

ID:341279 發(fā)表于 2018-5-30 12:00 | 顯示全部樓層
感謝各位大佬!
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-5-30 16:36 | 顯示全部樓層
karyboa 發(fā)表于 2018-5-30 11:33
請參考下靣程序看看,這也是 wulin 大神寫的;

我擦哩。好。
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-5-30 16:37 | 顯示全部樓層
struct Port_MakeUp
{
  volatile char P31:1;       
  volatile char P00:1;       
  volatile char P01:1;                          
  volatile char P02:1;       
  volatile char P03:1;       
  volatile char P06:1;       
  volatile char P07:1;       
  volatile char P34:1;                                                         
};
typedef struct Port_MakeUp LED;
這是我的想法。但是下一步怎么試都不靈,是不是這個方法有問題?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-5-30 17:18 | 顯示全部樓層
tianqi911 發(fā)表于 2018-5-30 10:45
非常感謝高人指導(dǎo)。但是現(xiàn)在有一個問題,就是我現(xiàn)在用的這款單片機51的,自己帶庫,P31 P00 P01 P02 P03  ...

給你寫了參考程序,按鍵端口按你的實際電路重新定義。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
  
sbit code0=P3^1;         //定義發(fā)光管端口      
sbit code1=P0^0;
sbit code2=P0^1;
sbit code3=P0^2;
sbit code4=P0^3;
sbit code5=P0^6;        
sbit code6=P0^7;
sbit code7=P3^4;        
sbit key=P3^7;                //定義按鍵端口
uchar code table1[]={0xe7,0xdb,0xbd,0x7e};//花樣跑馬燈數(shù)組       
uchar code table2[]={0x7e,0xbd,0xdb,0xe7};
uchar code table3[]={0x00,0xff,0x00,0xff};
uchar Cnt50ms=0;                        //中斷計時變量
uchar KeySec=0;                                                        //鍵值變量(花樣選擇)       
uchar j=0;                                                                //流水順序變量

void Timer0Init()                //50毫秒@12.000MHz
{
        TMOD= 0x01;                //設(shè)置定時器模式
        TL0 = 0xB0;                //設(shè)置定時初值
        TH0 = 0x3C;                //設(shè)置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        EA=1;                                //開總中斷
        ET0=1;                        //開定時器0中斷        
}

void PX(uchar i)               //寫8位數(shù)據(jù)函數(shù)
{   
    code0=i&0x01;i>>=1;        
    code1=i&0x01;i>>=1;
    code2=i&0x01;i>>=1;
    code3=i&0x01;i>>=1;
    code4=i&0x01;i>>=1;
    code5=i&0x01;i>>=1;
    code6=i&0x01;i>>=1;
    code7=i&0x01;
}

void keyscan()       
{
        static uchar count=0;        //計數(shù)變量                       
        static bit key_sign;                //按鍵狀態(tài)標志
        if(!key)                                        //檢測輸入如果為0
        {
                count++;                                        //計數(shù)延時消抖
                if((count>=200)&&(key_sign==0))
                {                       
                        key_sign=1;                //按鍵狀態(tài)標志置1,防止重復(fù)響應(yīng)
                        j=0;                                //流水順序變量清0
                        KeySec++;                //鍵值變量自+1
                        if(KeySec>=4)
                                KeySec=0;
                }
        }
        else
        {
                count=0;                                //計數(shù)變量清0
                key_sign=0;
        }
}

void main()
{
        Timer0Init();
        while(1)
        {
                keyscan();
                if(Cnt50ms>=10)//0.5秒        
                {
                        Cnt50ms=0;
                        switch(KeySec)
                        {
                                case 0: PX(0xff); break;
                                case 1: PX(table1[j]); break;
                                case 2: PX(table2[j]); break;
                                case 3: PX(table3[j]); break;
                        }
                        j++;                //流水順序變量自+1
                        if(j>=4)
                                j=0;
                }
        }
}
void timer0() interrupt        1
{
        TL0 = 0xB0;                //設(shè)置定時初值
        TH0 = 0x3C;                //設(shè)置定時初值
        Cnt50ms++;                //中斷變量Cnt50ms自+1
}
回復(fù)

使用道具 舉報

ID:341548 發(fā)表于 2018-5-30 17:25 來自觸屏版 | 顯示全部樓層
感覺和我們最近做的實驗有點像…
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-5-31 09:47 | 顯示全部樓層
wulin 發(fā)表于 2018-5-30 17:18
給你寫了參考程序,按鍵端口按你的實際電路重新定義。
#include
#define uint unsigned int

謝謝。就像把它們弄到一起去,搞的像一個端口那樣操作。那個函數(shù)PX的方法寫的太贊了。
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-5-31 11:42 | 顯示全部樓層
wulin 發(fā)表于 2018-5-30 17:18
給你寫了參考程序,按鍵端口按你的實際電路重新定義。
#include
#define uint unsigned int

高人,有2個問題求助。
1,是您寫的PX()能不能簡單寫幾句注釋,就幾句就行;我看不太懂,(我用的國產(chǎn)的這個51單片機,不能調(diào)試,我只能看結(jié)果);
2,是一個超級弱智的問題,sbit P37 = P3^7;      sfr P3 = 0xb0;我怎么異或也實現(xiàn)不了單獨取第7位的功能,0b1011_0000^0b0000_0111=0b1011_0111=0xb7.這是咋回事?不是應(yīng)該是只有第7位是1,其他都是0才對嗎?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-5-31 17:21 | 顯示全部樓層
tianqi911 發(fā)表于 2018-5-31 11:42
高人,有2個問題求助。
1,是您寫的PX()能不能簡單寫幾句注釋,就幾句就行;我看不太懂,(我用的國產(chǎn) ...

1.這樣寫比較容易理解sbit LED0=P3^1;         //定義發(fā)光管端口      
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^6;        
sbit LED6=P0^7;
sbit LED7=P3^4;

void PX(uchar i)//寫8位數(shù)據(jù)函數(shù),假設(shè)此時參數(shù)i=0xaa,1010 1010
{   
    LED0=i&0x01;//10101010按位與00000001得0,賦值LED0
        i>>=1;                //右移后高位補0,i的值已變化為01010101
    LED1=i&0x01;//01010101按位與00000001得1,賦值LED1
        i>>=1;                //右移后高位補0,i的值已變化為00101010
    LED2=i&0x01;//00101010按位與00000001得0,賦值LED2
        i>>=1;                //右移后高位補0,i的值已變化為00010101
    LED3=i&0x01;//以下以此類推,8位數(shù)據(jù)逐位賦值LED0~LED7,
        i>>=1;
    LED4=i&0x01;
        i>>=1;
    LED5=i&0x01;
        i>>=1;
    LED6=i&0x01;
        i>>=1;
    LED7=i&0x01;
}

2.由于關(guān)鍵詞sfr sbit的存在,其后面的等式含義不同 。
sfr P3 = 0xb0;                是P3寄存器地址定義。
sbit P37 = P3^7;    是自定義名稱指向P3寄存器地址的最高位而不是異或運算。
回復(fù)

使用道具 舉報

ID:275111 發(fā)表于 2018-6-1 16:04 | 顯示全部樓層
wulin 發(fā)表于 2018-5-31 17:21
1.這樣寫比較容易理解sbit LED0=P3^1;         //定義發(fā)光管端口      
sbit LED1=P0^0;
sbit LED2=P0^1;

高人。我已經(jīng)用了2個月了,但是這個基本的知識我都一直算不明白,很痛苦。你一句話就搞定了。非常感謝。
回復(fù)

使用道具 舉報

ID:343067 發(fā)表于 2018-6-1 18:31 | 顯示全部樓層
我也用到了這個模塊,感謝樓上各位大佬!!
回復(fù)

使用道具 舉報

ID:642699 發(fā)表于 2019-11-18 16:12 | 顯示全部樓層
感謝樓上各位大佬~
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 2021天天躁夜夜看 | www.日韩欧美| 亚洲天堂成人在线视频 | 亚洲一区二区三区在线 | 啪啪毛片 | 国产美女精品视频免费观看 | 国产精品一区二区在线观看 | 亚洲综合一区二区三区 | 黄色大片在线视频 | 免费观看一级毛片视频 | 蜜桃av人人夜夜澡人人爽 | 亚洲国产精品视频一区 | 国产成人精品999在线观看 | 一区二区三区精品视频 | 亚洲成人免费视频在线观看 | 国产精品久久国产精品99 gif | 日本三级精品 | 日本特黄a级高清免费大片 国产精品久久性 | 国产黄视频在线播放 | 天天干,夜夜操 | 精品乱码一区二区 | 成人在线中文字幕 | 日本啊v在线| 一区二区福利视频 | 欧美午夜视频 | 黄色片在线免费看 | 亚洲视频一区在线 | 91麻豆精品一区二区三区 | 久草精品在线 | 在线视频国产一区 | 久久亚洲国产精品 | 欧美a区| 久久久久久久久久久久久久国产 | 综合色导航 | 91黄在线观看 | 免费a v网站| 日韩三级精品 | 成人在线播放 | 日韩一区二区av | 国内自拍偷拍视频 | 欧美日韩高清在线观看 |