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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
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 回帖助人的獎勵!

查看全部評分

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

使用道具 舉報

沙發(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、當BJ=1時,根據(jù)RJ的值,進行顯示的切換,切換完成后清除BJ=0。
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

6#
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ù)

使用道具 舉報

7#
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ù),然后反映在主程序中。當然有別的方法,而且可能更好
回復(fù)

使用道具 舉報

8#
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ù)

使用道具 舉報

9#
ID:341279 發(fā)表于 2018-5-30 12:00 | 只看該作者
感謝各位大佬!
回復(fù)

使用道具 舉報

10#
ID:275111 發(fā)表于 2018-5-30 16:36 | 只看該作者
karyboa 發(fā)表于 2018-5-30 11:33
請參考下靣程序看看,這也是 wulin 大神寫的;

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

使用道具 舉報

11#
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ù)

使用道具 舉報

12#
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ù)

使用道具 舉報

13#
ID:341548 發(fā)表于 2018-5-30 17:25 來自手機 | 只看該作者
感覺和我們最近做的實驗有點像…
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

15#
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ù)

使用道具 舉報

16#
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ù)

使用道具 舉報

17#
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ù)

使用道具 舉報

18#
ID:343067 發(fā)表于 2018-6-1 18:31 | 只看該作者
我也用到了這個模塊,感謝樓上各位大佬!!
回復(fù)

使用道具 舉報

19#
ID:642699 發(fā)表于 2019-11-18 16:12 | 只看該作者
感謝樓上各位大佬~
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费黄色片在线观看 | 成人在线观看黄 | 久久久久久国产 | 亚洲国产一区在线 | 中文字幕日韩在线观看 | 国产一区二区三区免费 | 国产一区二区三区在线 | 亚洲a视频 | 在线a视频网站 | 亚洲精品68久久久一区 | 夜夜草| 亚洲成人黄色 | 久久精品国产一区二区电影 | 国产一区 | 自拍偷拍欧美 | 午夜视频在线视频 | 欧美午夜在线 | 九九热热九九 | 国产精品久久久久久久久免费 | 视频一区二区三区中文字幕 | 一区二区中文字幕 | 国产精品久久 | 欧美欧美欧美 | 欧美精品一区在线发布 | 国产欧美精品一区二区色综合朱莉 | 欧美一级做性受免费大片免费 | h视频在线免费 | 免费观看www7722午夜电影 | 亚洲国产精品久久 | 成人av观看 | 成人欧美一区二区 | 成人欧美一区二区三区在线观看 | 午夜寂寞网站 | 蜜桃特黄a∨片免费观看 | 欧美亚洲国产一区二区三区 | 国产目拍亚洲精品99久久精品 | 欧美精品日韩精品 | aaa国产大片| 国产精品自拍一区 | 欧美视频三区 | 天堂久久久久久久 |