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

设计要求:
  根据单个按键输入情况控制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 outputGPFCON |= 1 << 28;GPFCON &= ~(1 << 29);
}int main()
{int dat = 0;// 配置GPK4-7为输出功能GPKCON0 = 0x11110000;// 所有LED熄灭GPKDAT = 0x000000f0;// 配置GPN为输入功能GPNCON = 0;// 初始化buzzerbuzzer_init();// 轮询的方式查询按键事件while (1){dat = GPNDAT;if (dat & (1 << 0));else {// KEY1被按下// 设置定时器int countk1 = 0;int num = 1500000;while (num > 0){//GPNDAT,低四位有效,哪位按下哪位为0if (!(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 outputGPFCON |= 1 << 28;GPFCON &= ~(1 << 29);
}
// timer0中断的中断处理函数
void do_irq()
{// K1对应的操作if (mode == 0){if (countk1 <= 0){if (COUNT % 2 == 0)GPKDATA = 0xc0;elseGPKDATA = 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//设置预分频系数为66temp0 = TCFG0;temp0 = (temp0 & (~(0xff00ff))) | (uprescaler << 0);TCFG0 = temp0;// 16分频temp0 = TCFG1;temp0 = (temp0 & (~(0xf << 4 * utimer)) & (~(1 << 20))) | (udivider << 4 * utimer);TCFG1 = temp0;// 1s = 62500hzTCNTB0 = utcntb;TCMPB0 = utcmpb;// 手动更新TCON |= 1 << 1;// 清手动更新位TCON &= ~(1 << 1);// 自动加载和启动timer0TCON |= (1 << 0) | (1 << 3);// 使能timer0中断temp0 = TINT_CSTAT;temp0 = (temp0 & (~(1 << utimer))) | (1 << (utimer));TINT_CSTAT = temp0;
}

结果:

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

  1. 嵌入式系统开发设计——按键控制LED灯实现

    一.实验目的 掌握STM32固件库的使用方法: 掌握基于库函数模板的开发方法: 掌握基于固件库进行GPIO端口编程的方法: 4.规范编程格式. 二.实验内容 1.查阅STM32-V5开发板按键.LED ...

  2. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

  3. 记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯

    文章目录 前言 一.准备工作 二.点亮一盏LED灯 1.配置工程 2.代码实现 3.程序烧录注意 三.按键控制LED灯 1.配置工程 2.代码实现 按键控制 按键进阶1: 按键进阶2 3.基于自己理解 ...

  4. 【tiny4412】按键控制led灯亮灭

    前言:使用友善之臂tiny4412进行嵌入式学习,对于初学者而言并不是一件轻松事情,即使该平台已经存在很多年,网上也有很多分享,但由于官方文档相对还是不够全面,导致很多初学者遇到问题不知如何下手,如果 ...

  5. FPGA-02FPGA按键控制LED灯

    按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等特点,在家电.数码产品.玩具等方面有广泛的应用.本章我们将介绍如何使用按键控制多个LED的亮灭. 本章包括以下几个 ...

  6. FPGA(1)基础入门 -- 按键控制led灯

    目录 效果说明 1.配置输入输出变量 2.变量赋值 3.配置引脚(输入输出变量) 代码 效果说明 key1按键按下,led1被点亮. key2按键按下,led2被点亮. 1.配置输入输出变量 inpu ...

  7. 基于Verilog的按键控制LED灯

    按键控制LED灯 原理图 程序设计 `timescale 1ns / 1psmodule key_led( input sys_clk, input sys_rst_n, input [3:0] ke ...

  8. 51单片机实现独立按键控制LED灯

    本节博客主要实现以下效果: 3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include <REGX51.H>void m ...

  9. 米思齐按键控制LED灯

    按键控制LED灯实验2 代码如下: volatile int BUTTON; volatile int LED; volatile boolean state; void setup(){ pinMo ...

最新文章

  1. 十大开源的.NET用户界面框架 让GUI设计不再犯难
  2. C语言sopc蜂鸣器按键弹奏中音,基于sopc 蜂鸣器
  3. 《人脸识别原理及算法——动态人脸识别系统研究》—1章1.2节人脸识别相关学科的进展...
  4. leetcode 128. Longest Consecutive Sequence | 128. 最长连续序列(Java)
  5. Mac 安装redis
  6. 57张PPT彻底搞清楚区块链技术。。
  7. 收集小型机snap日志文件步骤
  8. canvas画出闪瞎眼的简单图形
  9. 搭建 lepus 监控
  10. 域控制器中五个角色基础(必记)
  11. 网络游戏外挂编写原理
  12. 命名实体识别python_命名实体识别的两种方法
  13. 优化器optimizer,BGD、SGD、MBGD、NAG、AdaGrad、Adadelta、RMSProp、Adam
  14. Spark Stage级调度_大数据培训
  15. 1.3 计算机网络的功能
  16. seo之我们网站的用户都是哪些人
  17. 地下水监测系统的构成,优势是什么?
  18. 你能写出正确的网址吗?
  19. 弹性方法计算连续梁板内力_连续梁板按塑性法内力计算课件
  20. ubuntu刷新自己dns

热门文章

  1. PCI-E×16、PCI-E×4
  2. SKB buff 数据结构
  3. 2002工程勘察设计收费标准_【海外要闻】海外事业部系列培训报道四——工程勘察设计收费标准(2002年修订版)交流探讨...
  4. 3Dgame_homework7
  5. c#如何上传大文件到服务器,asp.net(C#)中上传大文件的几中常见应用方法
  6. 达内java学习day13+day14
  7. webservice mysql配置文件_在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库...
  8. 《计算机是怎么跑起来的》读书笔记
  9. 撕心裂肺的爱情(我就不信你不哭)
  10. cogs 2051. 王者之剑