天嵌 ARM开发社区

 找回密码
 注册
查看: 2953|回复: 4

按键 LED显示数值

[复制链接]
紫叶轩的风 发表于 2010-7-22 22:04:57 | 显示全部楼层 |阅读模式
新手上路,发几个自己的程序,望指导!
实验要求:
TQ2440上有四个键命名为K1、K2、K3、K4。编写程序实现如下功能:
按下K1时LED灯从左至右逐次点亮(按一下点亮一个,不连击)
按下K2是LED灯从右至左逐次点亮(按一下点亮一个,不连击)
按下K3时LED灯计数0——15(按一下加1,一直按住不自加)
按下K4时灯全部熄灭,并且蜂鸣器有节奏的报警。(K1、K2、K3任何键一旦按下将停止报警)


程序如下:


#include <stdio.h>
#define rGPBCON    (*(volatile unsigned *)0x56000010)        //Port B control
#define rGPBDAT    (*(volatile unsigned *)0x56000014)        //Port B data
#define rGPFCON    (*(volatile unsigned *)0x56000050)        //Port F control
#define rGPFDAT    (*(volatile unsigned *)0x56000054)        //Port F data

void delay(int NUM)
{
        int j;
        while(NUM--)
          for(j=0;j<2000;j++) ;
}


void speaker()
{
        int j;
    rGPBCON =(rGPBCON & 0x00)|0x01;
            for(j=0;j<3;j++)
     {
              rGPBDAT=0x1;             //蜂鸣器高电平
                   delay(200);
                   rGPBDAT=0;              //蜂鸣器低电平
                   delay(200);
         }
}


void key1()                      //LED灯从左至右逐次点亮。
{
        int DAT;
        DAT=(rGPBDAT&0x1e0);
        switch(DAT)
        {
                case 0x0e0:rGPBDAT=0x160;break;
                case 0x160:rGPBDAT=0x1a0;break;
                case 0x1a0:rGPBDAT=0x1c0;break;
                case 0x1c0:rGPBDAT=0x0e0;break;
                default   :rGPBDAT=0x0e0;break;
        }
}


void key2()                     //LED灯从右至左逐次点亮。
{
        int DAT;
        DAT=rGPBDAT&0x1e0;
        switch(DAT)
        {
                case 0x1c0:rGPBDAT=0x1a0;break;
                case 0x1a0:rGPBDAT=0x160;break;
                case 0x160:rGPBDAT=0x0e0;break;
                case 0x0e0:rGPBDAT=0x1c0;break;
                default   :rGPBDAT=0x1c0;break;
        }
}


void key3()                   //LED灯计数0--15。
{
         if(rGPBDAT&0x1e0==0x1e0)
                  rGPBDAT=0xfe10;
             else rGPBDAT-=0x20;
               delay(100);     
}


void key4()                  //灯全部熄灭,并且蜂鸣器有节奏的报警。
{
        rGPBDAT=0x1e0;
        while((rGPFDAT&0x16)==0x16)
        {
                speaker();
                rGPBCON=0x15400;
        }
}


void key_ch()
{
        while(1)
        {
                if((rGPFDAT&0x2)==0)
                        {
                                delay(100);
                                if((rGPFDAT&0x2)==0)
                                 {
                                        for(;;)
                                   {
                                         if((rGPFDAT&0x2)!=0)
                                         break;
                                   }
                                    key1();
                                 }
                        }
                       
                if((rGPFDAT&0x10)==0)
                        {
                                delay(100);
                                if((rGPFDAT&0x10)==0)
                                {
                                        for(;;)
                                        {
                                                if((rGPFDAT&0x10)!=0)
                                                break;
                                        }
                                        key2();
                                }
                        }
                if((rGPFDAT&0x4)==0)
                        {
                                delay(2);
                                if((rGPFDAT&0x4)==0)
                                {
                                        for(;;)
                                        {
                                                if((rGPFDAT&0x4)!=0)
                                                break;
                                        }
                                key3();
                                }
                        }
                if((rGPFDAT&0x1)==0)
                        {
                                delay(100);
                                if((rGPFDAT&0x1)==0)
                                {
                                        for(;;)
                                        {
                                                if((rGPFDAT&0x1)!=0)
                                                break;
                                        }
                                        key4();
                           }
                        }
    }
}
int main()
{
        rGPBCON=0x15400;
        rGPFCON=0x000;
        key_ch();
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
guoyin 发表于 2010-7-29 22:22:29 | 显示全部楼层
裸机版的,不错!
亚瑟王 发表于 2010-8-2 19:09:10 | 显示全部楼层
给你加精了,赞一个。
yuyukaka789 发表于 2010-8-21 23:01:59 | 显示全部楼层
你不是用中断做的?查询做的,用中断做更好些,不过也还不错啦
记事本 发表于 2011-12-12 21:40:55 | 显示全部楼层
哈哈 顶一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 20:44 , Processed in 1.031244 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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