第一次写驱动哦
main.c
#define CPLD_LED (*(volatile unsigned char *)0x20800000)
#define GPBCON (*(volatile unsigned int *)0x56000010)
#define GPBDAT (*(volatile unsigned int *)0x56000014)
#define WTCON (*(volatile unsigned int *)0x53000000)
#define GPFCON (*(volatile unsigned int *)0x56000050)
#define GPFDAT (*(volatile unsigned int *)0x56000054)
#define SEG (*(volatile unsigned char *)0x20800010)
int key_init(void)
{
/* GPB8 output */
GPBCON |= 1<<16;
GPBCON &= ~(1<<17);
/* GPB9 output */
GPBCON |= 1<<18;
GPBCON &= ~(1<<19);
return 0;
}
int key_num(void)
{
/* scan first column */
GPBDAT &= ~(1<<8);
GPBDAT |= 1<<9;
if ((GPFDAT & (1<<0)) == 0)
return 1;
if((GPFDAT & (1<<2)) == 0)
return 3;
/* scan second column */
GPBDAT |= 1<<8;
GPBDAT &= ~(1<<9);
if ((GPFDAT & (1<<0)) == 0)
return 2;
if((GPFDAT & (1<<2)) == 0)
return 4;
return 0;
}
int led_on(int num)
{
CPLD_LED |= 1<<num;
return 0;
}
int led_off_all(void)
{
CPLD_LED &= 0x0;
return 0;
}
void beep_on(void)
{
GPBDAT |= 1<<0;
}
void beep_off(void)
{
GDPDAT &= ~(1<<0);
}
void seg_show(void)
{
if((GDPDAT &= (1<<0)) == 1)
{
SEG = 0x7f;
}else{
SEG = 0x3f;
}
}
void my_sleep(void)
{
int i ,j;
for(i = 0; i < 100; i++)
for(j = 0; j < 1000; j++ )
}
int Main(void)
{
int key;
GPBCON = 0x1;
GPBDAT = 0x0;
WTCON = 0x0;
CPLD_LED = 0xf;
key_init();
while (1)
{
key = key_num();
switch(key)
{
case 1:led_on(0);
beep_on();
break;
case 2:led_on(1);
beep_off();
break;
case 3:led_on(2);
beep_on();
my_sleep();
beep_off();
break;
case 4:led_on(3);
seg_show();
break;
default:
led_off_all();
}
}
return 0;
}
stat,c
AREA swn_test, CODE, READONLY
export start
import Main
start
mov sp, #0x0ff
bl Main
END
本文介绍了一个简单的嵌入式系统编程实例,通过编写驱动程序实现LED灯控制及按键扫描功能。文中详细展示了如何定义寄存器地址、初始化GPIO口、读取按键状态以及控制LED灯亮灭等关键步骤。
7552

被折叠的 条评论
为什么被折叠?



