| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 539 人关注过本帖
标题:8051的問題,可以的話請幫幫忙
只看楼主 加入收藏
kkdc0426
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-9-11
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
8051的問題,可以的話請幫幫忙
//檔名:CH7-2-1.C
//目的:P0接LED接正,P1接SW落地,按P1則P0閃爍,再按一次則滅
//未完成

#include <C8051F330.h>

void delay_1m(unsigned int dly);      //宣告delay_1m()函數

char one=0;
char zero=0;
unsigned char KeyTemp=0xff;
unsigned char KeyData=0xff;
unsigned int a = 0xff;

main()
{
    void KeyScan(void);                  //按鍵掃描函數
    PCA0MD &= ~0x40;                  //關看門狗
    XBR1 = 0x40;                      //Cossbar Enable
    P0MDOUT=0xff;                     //設定P0.0-7為高電位輸出
    while(1)
    {
        KeyScan();                    //掃描按鍵
        if(KeyData!=0xff)             //按下任何按鍵
        {
            P0^=KeyData;
            KeyData=0xff;
        }
    }
}

void KeyScan(void)
{
    unsigned char KeyStatus;
    P1=0xff;
    KeyStatus=~P1;
    if(KeyStatus!=0)
    {   
        one=0;
        if(KeyTemp!=KeyStatus)
        {
            KeyTemp=KeyStatus;
            zero=1;
        }  
        else
        {
            if(zero<5)
            {
                zero+=1;
                if(zero==5)
                KeyData=KeyTemp;
            }
        }
    }   
    one+=1;
    if(one==5)
    {
        zero=0;
        KeyTemp=0xff;
        KeyData=0xff;
    }
}
以上為我的程式,按p1.0,p0.0亮,按p1.1,p0.1亮,按p1.2,p0.2亮,再按一次p1.0,p0.0熄,再按一次p1.1,p0.1熄……

我想請問,我想改成按p1.0,p0.0閃爍,按p1.1,p0.1閃爍,按p1.2,p0.2閃爍,再按一次p1.0,p0.0熄,再按一次p1.1,p0.1熄……

不能使用計時器,因為這看的書,還沒 有教到計時器,會的請指點或教導一下,謝謝,自學8051卡住很久了

再麻煩會的朋友幫忙一下,這不是功課...是我自已買的書的習題
搜索更多相关主题的帖子: include void 
2012-09-11 14:44
kkdc0426
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-9-11
收藏
得分:0 
沒有好心人指點嗎...= =
2012-09-12 08:01
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:20 
我看你声明了延时函数但没有实现
void delay_1m(unsigned int dly);      //宣告delay_1m()函數
你可以自己实现,比如两层循环
for (i=0;i<10000;i++)
  for (j=0;j<10000;j++)
    ;        //空语句
这样,在闪烁的时候,亮一次,调用delay_1m,灭一次,再调用delay_1m,否则亮灭交替时间过短,频率过高就看不到闪烁了,
然后需要知道那个灯是按下闪烁状态还是关闭状态,就再声明一个状态变量
unsigned char led_state=0xFF;//全1表示时灯关闭,为0则表示灯打开(闪烁),初始化为全关

if(KeyData!=0xff)             //按下任何按鍵
{
    P0^=KeyData;
    KeyData=0xff;
}
这儿做更改
P0^=KeyData;
改成
led_state^=KeyData;
然后让程序检测led_state,哪一位为0则让灯闪烁,while循环如下:
while(1)
{
    KeyScan();                    //掃描按鍵
    if(KeyData!=0xff)             //按下任何按鍵
    {
        led_state^=KeyData;        //如果led_state=11010001,KeyDate=11101111,即按下P0.4按键,异或运算,相同出0不同出1,则结果为00111110,
                                   //由于定义0为开,需要取反,见下面
        led_data=~led_data;        //取反,依据上面假设,结果为11000001,成功将P0.4标记为开,
                                   //这个算法,其实可以支持多个按键同时按下的,学习了:)
        KeyData=0xff;
    }
    //没有任何按键按下则不对led_state状态做更改,但仍旧要做下面的操作,以达到闪烁的效果
    for (unsigned char i=0;i<8;i++)
    {
        if ((~led_state)&(0x01<<i)))        //如果led_state=11101011,取反为00010100,则当i=2时,0x01<<2=000001000,及i=4时,
                                            //0x01<<4=00010000,与值为真,表示标记灯开,进入
        {
            P0^=0x01<<i;                //如果P0=11001111,表示第P0.4,P0.5灯开,如果此时led_state=11001111,则i=4进来,P0^=0x01<<i后,
                                        //P0=11011111,同样i=5进来,P0=11111111,原本亮的4、5灯灭了,下一次如果led_state不变,
                                        //则,i=4时P0=11101111,i=5时p0=11001111,重新点亮4、5灯,这样就是闪烁了
        }
        else                        //其余led_state标记的关闭(位值为1)的灯,不管之前的状态,一律置为1,用或运算
        {
            P0|=0x01<<i;
         }
     }
    delay_1m();        //延迟
}
这里有一个问题,就是延时的问题,前面说了,如果不使用delay_1m(),则while循环速度很快,可能根本就看不到灯的闪烁,但如果加了delay_1m(),则因为while循环占用一定时间,检测按键有点延时,就是说,如果此时循环正在delay_1m函数中,你按下任何按键是不起作用的,除非你按下按键后按住等待一会儿。
由于你们还没有学中断计时,所以呢很遗憾只能这样了。如果学了中断计时,你就可以在中断计时中不断检测按键并改变led_state的值,而没有任何阻碍,主循环中就可以根据led_state的值来改变灯的状态了。这个更改我没有试验过,给你做个参考xixi
2012-09-13 10:27
kkdc0426
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-9-11
收藏
得分:0 
回复 3楼 stophin
可以再幫另一個忙嗎??
感謝不盡
https://bbs.bccn.net/viewthread.php?tid=381608&extra=page%3D1&frombbs=1
2012-09-18 11:11
快速回复:8051的問題,可以的話請幫幫忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017476 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved