【嵌入式系统课设】单个按键控制LED灯

这篇具有很好参考价值的文章主要介绍了【嵌入式系统课设】单个按键控制LED灯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

合工大嵌入式系统课程设计

设计要求:
  根据单个按键输入情况控制LED灯的不同显示效果。K1连续按下偶数次时,四个LED灯(LED1~LED4)按1秒(定时器中断实现)的间隔同时闪烁对应的次数,然后保持LED1和LED2常亮,LED3和LED4熄灭;K1连续按下奇数次时,四个灯按0.5秒(定时器中断实现)的间隔同时闪烁对应的次数,然后保持LED1和LED2熄灭,LED3和LED4常亮。K2按下时,四个灯按1秒(定时器中断实现)的间隔逐一点亮(同一个时刻只有个灯亮),并循环显示。K3按下时,四个灯按0.5秒(定时器中断实现)的间隔逐一点亮(同一个时刻只有一个灯亮),并循环显示。K4按下时,所有灯熄灭,系统进入初始状态。
  说明:程序需要区分连续按键与间隔时间按键。连续按键的间隔时间自行确定,合理即可示。

主要代码如下:
main.c

main.c:
#include "stdio.h"
#define GPKCON0 (*(volatile unsigned long *)0x7F008800)
#define GPKDAT (*(volatile unsigned long *)0x7F008808)

#define GPNCON (*(volatile unsigned long *)0x7F008830)
#define GPNDAT (*(volatile unsigned long *)0x7F008834)

#define GPFCON (*(volatile unsigned int *)0x7F0080A0)
#define GPFDAT (*(volatile unsigned int *)0x7F0080A4)

int COUNT;
void timer_init(unsigned long utimer, unsigned long uprescaler, unsigned long udivider, unsigned long utcntb, unsigned long utcmpb, int mode_x, int countk1_x);
void delay_short(volatile unsigned int n) {
    while (n--) {
    }
}
void delay(volatile unsigned int n) {
    while (n--) {
        delay_short(0x7ff);
    }

}
void buzzer_init(void)
{
    // set GPF14 as output
    GPFCON |= 1 << 28;
    GPFCON &= ~(1 << 29);
}

int main()
{

    int dat = 0;

    // 配置GPK4-7为输出功能
    GPKCON0 = 0x11110000;

    // 所有LED熄灭
    GPKDAT = 0x000000f0;

    // 配置GPN为输入功能
    GPNCON = 0;

    // 初始化buzzer
    buzzer_init();

    // 轮询的方式查询按键事件
    while (1)
    {
        dat = GPNDAT;
        if (dat & (1 << 0));
        else {
            // KEY1被按下
            // 设置定时器


            int countk1 = 0;
            int num = 1500000;

            while (num > 0)
            {

                //GPNDAT,低四位有效,哪位按下哪位为0
                if (!(GPNDAT & (1 << 0)))  //意思就是 若k1按下了 那么就进入if
                {
                    delay(10);
                    countk1++;             //按下一次 计数一次
                    num = 1500000;       //把倒计时还原
                    while (!(GPNDAT & (1 << 0))) { ; }
                }

                num--;


            }//while(num > 0)
            COUNT = countk1;
            if (countk1 % 2 == 1)
                timer_init(0, 65, 4, 31250, 0, 0, countk1);
            else if (countk1 % 2 == 0)
                timer_init(0, 65, 4, 62500, 0, 0, countk1);


            //if(GPNDAT & (1<<0))
            //{
            //	dat = 0xfd;
            //} 


        }
        if (dat & (1 << 1));
        else {
            // KEY2被按下
            // 设置定时器
            while (!(GPNDAT & (1 << 0))) { ; }
            int big = 0x6000000;
            while (big > 0)
                big--;
            timer_init(0, 65, 4, 62500, 0, 1, 0);

        }
        if (dat & (1 << 2));
        else
            // KEY3被按下
            // 设置定时器
        {
            while (!(GPNDAT & (1 << 0))) { ; }
            timer_init(0, 65, 4, 31250, 0, 2, 0);
        }

        if (dat & (1 << 3));
        else
            // KEY4被按下
            // 设置定时器
        {
            while (!(GPNDAT & (1 << 0))) { ; }
            int big = 0x6000000;
            while (big > 0)
                big--;
            timer_init(0, 65, 4, 31250, 0, 3, 0);

        }
    }
}

timer.c:

#include "stdio.h"
#define GPKCON0             (*((volatile unsigned long *)0x7F008800))
#define GPKDATA                 (*((volatile unsigned long *)0x7F008808))
#define GPKDAT              (*((volatile unsigned long *)0x7F008808))
#define EINT0CON0           (*((volatile unsigned long *)0x7F008900))
#define EINT0MASK           (*((volatile unsigned long *)0x7F008920))
#define EINT0PEND           (*((volatile unsigned long *)0x7F008924))
#define PRIORITY            (*((volatile unsigned long *)0x7F008280))
#define SERVICE             (*((volatile unsigned long *)0x7F008284))
#define SERVICEPEND         (*((volatile unsigned long *)0x7F008288))
#define VIC0IRQSTATUS       (*((volatile unsigned long *)0x71200000))
#define VIC0FIQSTATUS       (*((volatile unsigned long *)0x71200004))
#define VIC0RAWINTR         (*((volatile unsigned long *)0x71200008))
#define VIC0INTSELECT       (*((volatile unsigned long *)0x7120000c))
#define VIC0INTENABLE       (*((volatile unsigned long *)0x71200010))
#define VIC0INTENCLEAR      (*((volatile unsigned long *)0x71200014))
#define VIC0PROTECTION      (*((volatile unsigned long *)0x71200020))
#define VIC0SWPRIORITYMASK  (*((volatile unsigned long *)0x71200024))
#define VIC0PRIORITYDAISY   (*((volatile unsigned long *)0x71200028))
#define VIC0ADDRESS         (*((volatile unsigned long *)0x71200f00))

#define     PWMTIMER_BASE           (0x7F006000)
#define     TCFG0       ( *((volatile unsigned long *)(PWMTIMER_BASE+0x00)) )
#define     TCFG1       ( *((volatile unsigned long *)(PWMTIMER_BASE+0x04)) )
#define     TCON        ( *((volatile unsigned long *)(PWMTIMER_BASE+0x08)) )
#define     TCNTB0      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x0C)) )
#define     TCMPB0      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x10)) )
#define     TCNTO0      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x14)) )
#define     TCNTB1      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x18)) )
#define     TCMPB1      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x1C)) )
#define     TCNTO1      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x20)) )
#define     TCNTB2      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x24)) )
#define     TCMPB2      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x28)) )
#define     TCNTO2      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x2C)) )
#define     TCNTB3      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x30)) )
#define     TCMPB3      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x34)) )
#define     TCNTO3      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x38)) )
#define     TCNTB4      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x3C)) )
#define     TCNTO4      ( *((volatile unsigned long *)(PWMTIMER_BASE+0x40)) )
#define     TINT_CSTAT  ( *((volatile unsigned long *)(PWMTIMER_BASE+0x44)) )

#define GPFCON (*(volatile unsigned int *)0x7F0080A0)
#define GPFDAT (*(volatile unsigned int *)0x7F0080A4)
typedef void (isr)(void);
extern void asm_timer_irq();
extern int COUNT;
int mode;
int count;
int countk1;
void irq_init(void)
{
    /* 在中断控制器里使能timer0中断 */
    VIC0INTENABLE |= (1 << 23);

    VIC0INTSELECT = 0;

    isr** isr_array = (isr**)(0x7120015C);

    isr_array[0] = (isr*)asm_timer_irq;

    /*将GPK4-GPK7配置为输出口*/
    GPKCON0 = 0x11110000;

    //熄灭四个LED灯
    GPKDATA = 0xff;

    // set GPF14 as output
    GPFCON |= 1 << 28;
    GPFCON &= ~(1 << 29);
}
// timer0中断的中断处理函数
void do_irq()
{
    // K1对应的操作
    if (mode == 0)
    {

        if (countk1 <= 0)
        {
            if (COUNT % 2 == 0)
                GPKDATA = 0xc0;
            else
                GPKDATA = 0x30;
            //GPKDATA=0xff;
        }
        else
        {
            int label = count % 2;
            switch (label)
            {
            case 0:
                // 四个LED灯全部熄灭
                GPKDATA = 0xff;
                break;
            case 1:
                // 四个LED灯全部亮起
                GPKDATA = 0x0;
                countk1 = countk1 - 1;
                break;
            default:break;
            }
            count++;
        }




    }
    // K2对应的操作
    if (mode == 1)
    {
        int label = count % 4;
        switch (label)
        {
        case 0:
            // LED1 亮起,LED2、LED3、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 4);
            break;
        case 1:
            // LED2 亮起,LED1、LED3、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 5);
            break;
        case 2:
            // LED3 亮起,LED1、LED2、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 6);
            break;
        case 3:
            // LED4 亮起,LED1、LED2、LED3熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 7);
            break;
        default:break;
        }
        // count加一
        count++;
    }
    // K3对应的操作
    if (mode == 2)
    {
        int label = count % 4;
        switch (label)
        {
        case 0:
            // LED1 亮起,LED2、LED3、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 4);
            break;
        case 1:
            // LED2 亮起,LED1、LED3、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 5);
            break;
        case 2:
            // LED3 亮起,LED1、LED2、LED4熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 6);
            break;
        case 3:
            // LED4 亮起,LED1、LED2、LED3熄灭
            GPKDATA = 0xff;
            GPKDAT &= ~(1 << 7);
            break;
        default:break;
        }
        // count加一
        count++;
    }
    // K4对应的操作
    if (mode == 3)
    {
        GPKDATA = 0xff;
    }

    unsigned long uTmp;
    //清timer0的中断状态寄存器
    uTmp = TINT_CSTAT;
    TINT_CSTAT = uTmp;
    VIC0ADDRESS = 0x0;
}

// 初始化timer
void timer_init(unsigned long utimer, unsigned long uprescaler, unsigned long udivider, unsigned long utcntb, unsigned long utcmpb, int mode_x, int countk1_x)
{
    unsigned long temp0;
    // 设置mode值,用于判断执行哪一种操作
    mode = mode_x;
    countk1 = countk1_x;
    // 定时器的输入时钟 = PCLK / ( {prescaler value + 1} ) / {divider value} = PCLK/(65+1)/16=62500hz

    //设置预分频系数为66
    temp0 = TCFG0;
    temp0 = (temp0 & (~(0xff00ff))) | (uprescaler << 0);
    TCFG0 = temp0;

    // 16分频
    temp0 = TCFG1;
    temp0 = (temp0 & (~(0xf << 4 * utimer)) & (~(1 << 20))) | (udivider << 4 * utimer);
    TCFG1 = temp0;

    // 1s = 62500hz
    TCNTB0 = utcntb;
    TCMPB0 = utcmpb;

    // 手动更新
    TCON |= 1 << 1;

    // 清手动更新位
    TCON &= ~(1 << 1);

    // 自动加载和启动timer0
    TCON |= (1 << 0) | (1 << 3);

    // 使能timer0中断
    temp0 = TINT_CSTAT;
    temp0 = (temp0 & (~(1 << utimer))) | (1 << (utimer));
    TINT_CSTAT = temp0;
}



结果:
嵌入式按键控制led灯,计算机基础,单片机,嵌入式硬件
嵌入式按键控制led灯,计算机基础,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-519664.html

到了这里,关于【嵌入式系统课设】单个按键控制LED灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【速成】蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

    一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中,即可完成整个嵌入式系统的设计。因此,尽

    2024年02月09日
    浏览(66)
  • 速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

    一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中,即可完成整个嵌入式系统的设计。因此,尽

    2024年02月12日
    浏览(44)
  • 【小黑嵌入式系统第七课】PSoC® 5LP 开发套件(CY8CKIT-050B )——PSoC® 5LP主芯片、I/O系统、GPIO控制LED流水灯的实现

    上一课: 【小黑嵌入式系统第六课】嵌入式系统软件设计基础——C语言简述、程序涉及规范、多任务程序设计、状态机建模(FSM)、模块化设计、事件触发、时间触发 下一课: 【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator下载、创建项目、单片机中的hel

    2024年02月06日
    浏览(65)
  • 【嵌入式系统应用开发】FPGA——HLS入门实践之led灯闪烁

    HLS(High Level Synthesis) :一款高层次综合工具。 能够将 C/C++ 或者 system C 等高级语言转化为 RTL (底层硬件描述语言)电路,降低开发时间。 提供了常见的库(例如图像处理相关的 OpenCv 库和其 它的数学库)。 可以创建IP并通过例化或者使用 BlockDesign 的方式应用到项目中。 转化原

    2024年02月05日
    浏览(67)
  • 【嵌入式系统与入门】Day02 Arduino 按键、蜂鸣器与湿温度传感器

    目的:控制电动机或其他电气设备运行,常用来 连通或断开 ,控制电路 原理:K1、K2、K3、K4【开关量】与数字引脚相连,通过对按键操作,展现为电平的高低 不按的情况,K1连接R1,与VCC相连,表现为高电平 按下键时,K1直接与GND相连,表现为低电平 k1被按下时,看窗口监视

    2023年04月22日
    浏览(73)
  • 基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)

            我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。         官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,使用“Ctrl+c”的组合键来退出autoboot。本

    2024年02月10日
    浏览(58)
  • 嵌入式学习---ARM中断控制系统

    硬件中断处理是实时系统设计的最重要、最关键的问题。 程序不断地查询各设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如一个温控系统中可以使用查询方式不断检测温度的变化。 特点:实现简单;但 CPU利用率很低 ,不适合多任务的

    2024年02月03日
    浏览(78)
  • 嵌入式51单片机04-矩阵按键系列

    一、矩阵按键基础知识 矩阵按键工作原理 : 逐行扫描 :通过高四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断低四位数据中哪一位为零来判断哪一个按键被按下。 逐列扫描 :通过低四位轮流输出低电平来

    2024年02月07日
    浏览(65)
  • 【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world(点亮一个led)

    上一课: 【小黑嵌入式系统第七课】PSoC® 5LP 开发套件(CY8CKIT-050B )——PSoC® 5LP主芯片、I/O系统、GPIO控制LED流水灯的实现 下一课: 【小黑嵌入式系统第九课】PSoC 5LP第一个实验——LED、字符型LCD显示实验 本课程主要介绍了 PSoC® 5LP, 一个基于 ARM® Cortex®-M3 的可编程片上系

    2024年02月03日
    浏览(62)
  • 分享一款嵌入式开源按键框架代码工程MultiButton

    MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块。 Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只有两个文件: (1)可无限扩展按键; (2)按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让按键业务逻辑更清晰。 通

    2024年04月15日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包