国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【嵌入式系統(tǒng)課設(shè)】單個按鍵控制LED燈

這篇具有很好參考價值的文章主要介紹了【嵌入式系統(tǒng)課設(shè)】單個按鍵控制LED燈。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

合工大嵌入式系統(tǒng)課程設(shè)計

設(shè)計要求:
  根據(jù)單個按鍵輸入情況控制LED燈的不同顯示效果。K1連續(xù)按下偶數(shù)次時,四個LED燈(LED1~LED4)按1秒(定時器中斷實現(xiàn))的間隔同時閃爍對應的次數(shù),然后保持LED1和LED2常亮,LED3和LED4熄滅;K1連續(xù)按下奇數(shù)次時,四個燈按0.5秒(定時器中斷實現(xiàn))的間隔同時閃爍對應的次數(shù),然后保持LED1和LED2熄滅,LED3和LED4常亮。K2按下時,四個燈按1秒(定時器中斷實現(xiàn))的間隔逐一點亮(同一個時刻只有個燈亮),并循環(huán)顯示。K3按下時,四個燈按0.5秒(定時器中斷實現(xiàn))的間隔逐一點亮(同一個時刻只有一個燈亮),并循環(huán)顯示。K4按下時,所有燈熄滅,系統(tǒng)進入初始狀態(tài)。
  說明:程序需要區(qū)分連續(xù)按鍵與間隔時間按鍵。連續(xù)按鍵的間隔時間自行確定,合理即可示。

主要代碼如下:
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被按下
            // 設(shè)置定時器


            int countk1 = 0;
            int num = 1500000;

            while (num > 0)
            {

                //GPNDAT,低四位有效,哪位按下哪位為0
                if (!(GPNDAT & (1 << 0)))  //意思就是 若k1按下了 那么就進入if
                {
                    delay(10);
                    countk1++;             //按下一次 計數(shù)一次
                    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被按下
            // 設(shè)置定時器
            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被按下
            // 設(shè)置定時器
        {
            while (!(GPNDAT & (1 << 0))) { ; }
            timer_init(0, 65, 4, 31250, 0, 2, 0);
        }

        if (dat & (1 << 3));
        else
            // KEY4被按下
            // 設(shè)置定時器
        {
            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中斷的中斷處理函數(shù)
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的中斷狀態(tài)寄存器
    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;
    // 設(shè)置mode值,用于判斷執(zhí)行哪一種操作
    mode = mode_x;
    countk1 = countk1_x;
    // 定時器的輸入時鐘 = PCLK / ( {prescaler value + 1} ) / {divider value} = PCLK/(65+1)/16=62500hz

    //設(shè)置預分頻系數(shù)為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;
}



結(jié)果:
嵌入式按鍵控制led燈,計算機基礎(chǔ),單片機,嵌入式硬件
嵌入式按鍵控制led燈,計算機基礎(chǔ),單片機,嵌入式硬件文章來源地址http://www.zghlxwxcb.cn/news/detail-519664.html

到了這里,關(guān)于【嵌入式系統(tǒng)課設(shè)】單個按鍵控制LED燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【速成】藍橋杯嵌入式省一教程:(五)用按鍵和屏幕實現(xiàn)嵌入式交互系統(tǒng)

    【速成】藍橋杯嵌入式省一教程:(五)用按鍵和屏幕實現(xiàn)嵌入式交互系統(tǒng)

    一個完整的嵌入式系統(tǒng),包括任務執(zhí)行部分和人機交互部分。在前四節(jié)中,我們已經(jīng)講解了LED、LCD和按鍵,用這三者就能夠?qū)崿F(xiàn)一個人機交互系統(tǒng),也即搭建整個嵌入式系統(tǒng)的框架。在后續(xù),只要將各個功能加入到這個交互系統(tǒng)中,即可完成整個嵌入式系統(tǒng)的設(shè)計。因此,盡

    2024年02月09日
    瀏覽(40)
  • 速通藍橋杯嵌入式省一教程:(五)用按鍵和屏幕實現(xiàn)嵌入式交互系統(tǒng)

    速通藍橋杯嵌入式省一教程:(五)用按鍵和屏幕實現(xiàn)嵌入式交互系統(tǒng)

    一個完整的嵌入式系統(tǒng),包括任務執(zhí)行部分和人機交互部分。在前四節(jié)中,我們已經(jīng)講解了LED、LCD和按鍵,用這三者就能夠?qū)崿F(xiàn)一個人機交互系統(tǒng),也即搭建整個嵌入式系統(tǒng)的框架。在后續(xù),只要將各個功能加入到這個交互系統(tǒng)中,即可完成整個嵌入式系統(tǒng)的設(shè)計。因此,盡

    2024年02月12日
    瀏覽(18)
  • 【小黑嵌入式系統(tǒng)第七課】PSoC? 5LP 開發(fā)套件(CY8CKIT-050B )——PSoC? 5LP主芯片、I/O系統(tǒng)、GPIO控制LED流水燈的實現(xiàn)

    【小黑嵌入式系統(tǒng)第七課】PSoC? 5LP 開發(fā)套件(CY8CKIT-050B )——PSoC? 5LP主芯片、I/O系統(tǒng)、GPIO控制LED流水燈的實現(xiàn)

    上一課: 【小黑嵌入式系統(tǒng)第六課】嵌入式系統(tǒng)軟件設(shè)計基礎(chǔ)——C語言簡述、程序涉及規(guī)范、多任務程序設(shè)計、狀態(tài)機建模(FSM)、模塊化設(shè)計、事件觸發(fā)、時間觸發(fā) 下一課: 【小黑嵌入式系統(tǒng)第八課】初識PSoC Creator?開發(fā)——關(guān)于PSoC Creator下載、創(chuàng)建項目、單片機中的hel

    2024年02月06日
    瀏覽(42)
  • 【嵌入式系統(tǒng)應用開發(fā)】FPGA——HLS入門實踐之led燈閃爍

    【嵌入式系統(tǒng)應用開發(fā)】FPGA——HLS入門實踐之led燈閃爍

    HLS(High Level Synthesis) :一款高層次綜合工具。 能夠?qū)?C/C++ 或者 system C 等高級語言轉(zhuǎn)化為 RTL (底層硬件描述語言)電路,降低開發(fā)時間。 提供了常見的庫(例如圖像處理相關(guān)的 OpenCv 庫和其 它的數(shù)學庫)。 可以創(chuàng)建IP并通過例化或者使用 BlockDesign 的方式應用到項目中。 轉(zhuǎn)化原

    2024年02月05日
    瀏覽(29)
  • 【嵌入式系統(tǒng)與入門】Day02 Arduino 按鍵、蜂鳴器與濕溫度傳感器

    【嵌入式系統(tǒng)與入門】Day02 Arduino 按鍵、蜂鳴器與濕溫度傳感器

    目的:控制電動機或其他電氣設(shè)備運行,常用來 連通或斷開 ,控制電路 原理:K1、K2、K3、K4【開關(guān)量】與數(shù)字引腳相連,通過對按鍵操作,展現(xiàn)為電平的高低 不按的情況,K1連接R1,與VCC相連,表現(xiàn)為高電平 按下鍵時,K1直接與GND相連,表現(xiàn)為低電平 k1被按下時,看窗口監(jiān)視

    2023年04月22日
    瀏覽(36)
  • 基于RK3588的嵌入式linux系統(tǒng)開發(fā)(五)——uboot優(yōu)化修改(按任意按鍵停止autoboot)

    基于RK3588的嵌入式linux系統(tǒng)開發(fā)(五)——uboot優(yōu)化修改(按任意按鍵停止autoboot)

    ????????我們通常情況下,芯片進入uboot后,會根據(jù)設(shè)置的bootdelay時間進行倒數(shù)計數(shù)。這時候在終端按任意鍵,即可退出autoboot,進入uboot的命令行模式。 ????????官方提供的uboot源碼中,為了防止調(diào)試串口干擾導致不能進入系統(tǒng),使用“Ctrl+c”的組合鍵來退出autoboot。本

    2024年02月10日
    瀏覽(17)
  • 嵌入式學習---ARM中斷控制系統(tǒng)

    嵌入式學習---ARM中斷控制系統(tǒng)

    硬件中斷處理是實時系統(tǒng)設(shè)計的最重要、最關(guān)鍵的問題。 程序不斷地查詢各設(shè)備的狀態(tài),并做出相應的反應。該方式實現(xiàn)比較簡單,常用在比較單一的系統(tǒng)中,比如一個溫控系統(tǒng)中可以使用查詢方式不斷檢測溫度的變化。 特點:實現(xiàn)簡單;但 CPU利用率很低 ,不適合多任務的

    2024年02月03日
    瀏覽(55)
  • 嵌入式51單片機04-矩陣按鍵系列

    嵌入式51單片機04-矩陣按鍵系列

    一、矩陣按鍵基礎(chǔ)知識 矩陣按鍵工作原理 : 逐行掃描 :通過高四位輪流輸出低電平來對矩陣鍵盤進行掃描,當?shù)退奈唤邮盏降臄?shù)據(jù)不全為1的時候,說明有按鍵按下,然后通過判斷低四位數(shù)據(jù)中哪一位為零來判斷哪一個按鍵被按下。 逐列掃描 :通過低四位輪流輸出低電平來

    2024年02月07日
    瀏覽(49)
  • 【小黑嵌入式系統(tǒng)第八課】初識PSoC Creator?開發(fā)——關(guān)于PSoC Creator&下載、創(chuàng)建項目、單片機中的hello world(點亮一個led)

    【小黑嵌入式系統(tǒng)第八課】初識PSoC Creator?開發(fā)——關(guān)于PSoC Creator&下載、創(chuàng)建項目、單片機中的hello world(點亮一個led)

    上一課: 【小黑嵌入式系統(tǒng)第七課】PSoC? 5LP 開發(fā)套件(CY8CKIT-050B )——PSoC? 5LP主芯片、I/O系統(tǒng)、GPIO控制LED流水燈的實現(xiàn) 下一課: 【小黑嵌入式系統(tǒng)第九課】PSoC 5LP第一個實驗——LED、字符型LCD顯示實驗 本課程主要介紹了 PSoC? 5LP, 一個基于 ARM? Cortex?-M3 的可編程片上系

    2024年02月03日
    瀏覽(26)
  • 分享一款嵌入式開源按鍵框架代碼工程MultiButton

    分享一款嵌入式開源按鍵框架代碼工程MultiButton

    MultiButton 是一個小巧簡單易用的事件驅(qū)動型按鍵驅(qū)動模塊。 Github地址:https://github.com/0x1abin/MultiButton 這個項目非常精簡,只有兩個文件: (1)可無限擴展按鍵; (2)按鍵事件的回調(diào)異步處理方式可以簡化程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓按鍵業(yè)務邏輯更清晰。 通

    2024年04月15日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包