找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多功能按键 标志位flag一直弄不好,求大神帮忙!

[复制链接]
跳转到指定楼层
楼主
ID:299904 发表于 2018-4-2 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键按下给低电平   怎么正确使用 k1_flag 来实现k1键按下保持低电平同时进入功能菜单


uchar   k1_flag = 0;


void keyscan()//菜单键按下扫描函数定义
{
k1=1;
k2=1;//
k3=1;//
k4=1;//
//判断菜单键k1是否按下
if(k1==0)
{
  delay(5);
  
  if(k1==0)
  {
   while(!k1);//松手检测
   k1_num++;//记录菜单键k1是第几次按下,而判断是调节秒、分还是时。
   if(k1_num==1 )//指示调节秒
   {   
       EX0=0;//关闭外部中断0,使时间走动停止,准备调时间
    ds1307_write_date(0xd0,0,0x80|b_second);
    lcd_write_com(0x80+0x40+12);//数据指针和光标移动秒出
    lcd_write_com(0x0f);//使光标显示,并光标处字符格符闪烁,用来提示用户此时可以调节是秒,是分还是时。
   }
   if(k1_num==2)//指示调节分
   {
    lcd_write_com(0x80+0x40+9);//数据指针和光标移动分出
   }
   if(k1_num==3)//指示调节时
   {
    lcd_write_com(0x80+0x40+6);//数据指针和光标移动时出
   }
   if(k1_num==4)//退出时间调节菜单
   {
    k1_num=0;//菜单键k0按下清零
    lcd_write_com(0x0c);//恢复到时钟走动状态,即光标不显示,不闪烁
    //将所调的时间转换成bcd码
    b_second=dectobcd(second);
    b_minute=dectobcd(minute);
    b_hour=dectobcd(hour);
    //将所调的时间向时钟写入
    ds1307_write_date(0xd0,2,b_hour);
    ds1307_write_date(0xd0,1,b_minute);
    ds1307_write_date(0xd0,0,b_second);
    EX0=1;//开外部中断0,时间开始继续走动
   }
   
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:305386 发表于 2018-7-15 16:11 | 只看该作者
flag其实就是个变量而已,只是它的中文意思就是标志,在实际使用中方便好记才这么定义。声明这个变量之后,因为程序要实现的功能很多,为了区分各个程序段实现什么功能就用标志位的值,使用if语句判断进入功能实现程序,当然flag的值由你来决定。比如我用DA转换器实现LED的由亮到灭和由灭到亮的循环过程,先使flag初值为0,然后如果flag为0就先由亮到灭,当灭完了就程序设定flag为1,再写如果flag为1,则由灭到亮,亮完了又设定flag为0。这里就使用了标志变量来标志功能的状态。
学会灵活变通在程序中应用好标志位可以使程序更灵活。
希望我的回答能帮助到你。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:323217 发表于 2018-7-15 17:28 | 只看该作者
楼上正解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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