ARM小键盘、LED、BEEP驱动

来源:互联网 发布:java dao模式 编辑:程序博客网 时间:2024/06/05 09:06

第一次写驱动哦


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,cAREA swn_test, CODE, READONLY     export start     import Main start     mov sp, #0x0ff     bl Main          END



原创粉丝点击