找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2009|回复: 5
打印 上一主题 下一主题
收起左侧

求单片机程序 k1接在p3.1口 led接在p2口

[复制链接]
跳转到指定楼层
楼主
ID:190444 发表于 2017-4-18 17:23 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按一次K1,LED右移流水;再按一次K1,led左移流水。
哪位大神写一下C程序。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:190909 发表于 2017-4-18 17:36 | 只看该作者
采用按键扫描加移位函数
回复

使用道具 举报

板凳
ID:190909 发表于 2017-4-18 17:39 | 只看该作者
void main()
{
aa=0xfe;
while(1)
{
P1=aa;
delay(500);
aa=_crol_(aa,1);
}

差不多是这样吧,再加按键改一下,用左移位
回复

使用道具 举报

地板
ID:187614 发表于 2017-4-18 18:12 | 只看该作者
main()中的while(flag)中分别处理左流水和右流水
按键处理中flag=~flag
回复

使用道具 举报

5#
ID:47286 发表于 2017-4-18 18:50 | 只看该作者
你先看楼上的 用函数那个挺好 方便简单 我也写了一个 没用现成的函数 我是尽量不调用函数库 里边东西太多影响速度 不过你这学习练习的无所谓

sbit key=Px^x;                //定义按键所在端口
sbit led=Px;                //定义led所在端口

bit status=0;                //标记 按键触发

void main()
{
        led=0x01;                        //8个LED 第一个亮 0位 最右边
       
        while(1)                        //循环
        {
                if(key==1)                        //判断按键 如果按键按下
                {
                        Delay(20);                        //延时20ms        防抖
                        if(key==1)                        //如果 按键依旧按下
                        {
                                while(!key);                //等待按键松开
                                status=~status;                //按键标记取反
                        }
                }
               
                show();                                //调用 显示
        }
}

void show()                //显示
{
        if(status==0)                //如果 按键标记是0
        {
                if(num==1)                        //如果 计数器值为1 到1s (每1s换一位显示)
                {
                        num=0;                                //计数器num清零 重新计数
                        if(led==0x80)                //如果 led位值是1000 0000 左到头了
                        {
                                led=0x01;                        //赋值 led值为0000 0001 从最右侧开始
                        }
                        else                                //否则 即 led位不是0x80
                        {
                                led<<1;                                //左移1一位
                        }
                }
        }
       
        if(status==1)                //如果 按键标记是1
        {
                                                        //和上面一样 把判断和移位反过来就行了
        }
}

void Server_Time0() interrupt 1        //定时器服务程序
{
        TH0 = xx;                                                //重装初值 1s
        TL0 = xx;                                               
       
        num++;                                                        //计数器自加       
}
回复

使用道具 举报

6#
ID:151348 发表于 2017-4-18 20:08 | 只看该作者
自己改一下延时
#include <reg52.h>
#include <intrins.h>
sbit key = P3^0;

void delay(unsigned int n)
{
   unsigned char i;
        for(i=0;i<n;i++)
          ;
}

void main()
{

unsigned char aa =0xfe,returnFlag=1;
while(1)
{
        if(key==0)
        {
            delay(5);
            if(key==0)
            {
                 returnFlag=~returnFlag;
            }
        }

        if(returnFlag==1)
        {
                P1=aa;
                delay(100);
                aa=_crol_(aa,1);
        }
        if(returnFlag==0)
        {
                P1=aa;
                delay(100);
                aa=_cror_(aa,1);
        }
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表