嵌入式入门小工程

此代码基于s3c2440

1.点灯

cpp 复制代码
//led.c
void init_led(void)
{
	unsigned int t;
	t = GPBCON;
	t &= ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));
	t |= (1 << 10) | (1 << 12) | (1 << 14) | (1 << 16);
	GPBCON = t;	
}

void led_on(unsigned char n)
{
	unsigned int t;
	t = GPBDAT;
	t &= ~(0x0F << 5);
	n &= 0x0F;
	n ^= 0x0F;
	t |= (n << 5);
	GPBDAT = t;		
}
bash 复制代码
int main(void)
{	
    init_wdt();	//初始化看门狗
    init_led();	  //初始化led灯
	led_on(0);
    led_on(1);//led1点亮
}

2.走马灯

并初始化蜂鸣器,灯闪一次响一次,去时响,来时不响。

cpp 复制代码
//初始化蜂鸣器
void init_beep(void)
{
	unsigned int t;
	t = GPBCON;
	t &= ~(3 << 0);
	t |= (1 << 0);
	GPBCON = t;	
}
//打开蜂鸣器
void beep_on(void)
{
	GPBDAT |= (1 << 0);
}
//关闭蜂鸣器
void beep_off(void)
{
	GPBDAT &= ~(1 << 0);	
}

3.按下按键1,led1亮。以此类推

cs 复制代码
void init_key(void)
{
	GPGCON &= ~((3 << 0) | (3 << 6) | (3 << 10));
}

int key_pressed(void)
{
	if((GPGDAT & 0x01) == 0)
	{
		return 1;
	}
	else if((GPGDAT & 0x08) == 0)//	1000
	{
		return 2;
	}
	else if((GPGDAT & 0x20) == 0)  //10 0000
	{
		return 3;
	}
	return 0;
}
int main(void)
{
	unsigned char i;
	int n = 0;	
	int key;
	init_key();
	init_beep();
	init_wdt();
	init_led();
	led_on(0);
	while(1)
	{
	    init_beep();
	 	key = key_pressed();
		led_on(key);
		
	}
}

4.利用中断控制,按下按键1led1亮,按下按键2蜂鸣器响,按下按键3蜂鸣器关。

cs 复制代码
void init_wdt(void)
{
	WTCON &= ~(1 << 5);
}
void irq_handler(void)
{
    if (INTOFFSET == 5) // 检查外部中断号
    {
        if ((EINTPEND & (1 << 8)) != 0) // 按键一
        {
            led_on(1); // 点亮LED 1
           
        }
        else if ((EINTPEND & (1 << 11)) != 0) // 按键二
        {
            beep_on(); // 打开蜂鸣器
           
        }
        else if ((EINTPEND & (1 << 13)) != 0) // 按键三
        {
            beep_off(); // 关闭蜂鸣器
           
        }
		EINTPEND = EINTPEND;
    }
    SRCPND = SRCPND; // 清除源中断
    INTPND = INTPND; // 清除中断状态
}

void delay(unsigned int n)
{
    while (n--);
}


void init_key(void)
{
    unsigned int t;

    INTMOD &= ~(1 << 5); // 设置为外部中断模式
    INTMSK &= ~(1 << 5); // 允许外部中断5

    // 配置GPG引脚为外部中断输入
    t = GPGCON;
    t &= ~((3 << 0)|(3 << 6)|(3 << 10));
    t |= ((2 << 0)|(2 << 6)|(2 << 10)); 
    GPGCON = t;

    // 配置EXTINT1
    t = EXTINT1;
    t &= ~(0x0FFFFFF); // 清除配置
    t |= ((1 << 3)|(1 << 15)|(1 << 23)); // GPG3上升沿触发
    t |= ((2 << 0)|(2 << 12)|(2 << 20)); // GPG0上升沿触发
    EXTINT1 = t;

    // 解除中断屏蔽
    EINTMASK &= ~((1 << 8)|(1 << 11)|(1 << 13)); // 解除中断8屏蔽
    
}

int main(void)
{	
    init_wdt();	//初始化看门狗
    init_led();	  //初始化led灯
    init_beep();
    init_key();
	led_on(0);
    while (1)
    {
        delay(0xFFFF); // 主循环延迟
    }
}
相关推荐
欢乐熊嵌入式编程1 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川2 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
SY师弟4 小时前
51单片机基础部分——矩阵按键检测
嵌入式硬件·矩阵·51单片机
Lester_11015 小时前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos
阿超爱嵌入式6 小时前
STM32学习之I2C(理论篇)
stm32·嵌入式硬件·学习
三月雪落无痕8 小时前
altium designer2024绘制stm32过程笔记x`
笔记·嵌入式硬件
天天爱吃肉821810 小时前
新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
android·python·嵌入式硬件·汽车
章鱼哥嵌入式开发10 小时前
# STM32F103 SD卡读写程序
stm32·单片机
广药门徒12 小时前
定时器时钟来源可以从输入捕获引脚输入
单片机·嵌入式硬件
爱睡觉的王宇昊15 小时前
二、【ESP32开发全栈指南:ESP32 GPIO深度使用】
单片机·嵌入式硬件