1. 程式人生 > >mini2440A 裸機程式設計:串列埠控制LED燈的亮滅

mini2440A 裸機程式設計:串列埠控制LED燈的亮滅

要求

在PC上傳送L11控制開發板led1亮,傳送L10控制開發板led1滅;

在PC上傳送L21控制開發板led2亮,傳送L20控制開發板led2滅;

在PC上傳送L31控制開發板led3亮,傳送L30控制開發板led3滅;

在PC上傳送L41控制開發板led4亮,傳送L40控制開發板led4滅;

PC使用串列埠助手傳送;

程式碼

#include <string.h>
#include <stdlib.h>

//0x50000020(L)
//0x50000023(B)
//(位元組) UART 通道0 傳送緩衝暫存器
#define UTXH0       (*(volatile unsigned int *)0x50000020)//UTXH0
#define UTRSTAT0 (*(volatile unsigned int *)0x50000010) //R UART 通道0 Tx/Rx 狀態暫存器 #define ULCON0 (*(volatile unsigned int *)0x50000000)// //R/W UART 通道0 線路控制暫存器 #define UCON0 (*(volatile unsigned int *)0x50000004)// //R/W UART channel 0 control register #define UBRDIV0 (*(volatile unsigned int *)0x50000028) // R/W 波特率分頻暫存器0 #define GPHCON (*(volatile unsigned int *)0x56000070) //R/W 配置埠H 的引腳
//URXH0 //0x50000024(L) //0x50000027(B) //W //(位元組) UART 通道0 接收緩衝暫存器 – #define URXH0 (*(volatile unsigned int *)0x50000024)//URXH0 //UFCON0 0x50000008 R/W UART 通道0 FIFO 控制暫存器 0x0 #define UFCON0 (*(volatile unsigned int *)0x50000008)//URXH0 //UMCON0 0x5000000C R/W UART 通道0 Modem 控制暫存器 0x0 #define UMCON0 (*(volatile unsigned int *)0x5000000c)//URXH0 //燈 //GPBCON 0x56000010 R/W 配置埠 B 的引腳
#define GPBCON (*(unsigned int *)0x56000010) //GPBDAT 0x56000014 R/W 埠 B 的資料暫存器 #define GPBDAT (*(unsigned int *)0x56000014) #define PCLK (50000000) #define BPS (115200) unsigned char buff[3]; char len = 0; void delay(int time) { int i; for(i=0; i<time; i++); } void uart0_init(void) { GPHCON = (2<<4) | (2<<6);//配置串列埠引腳功能 ULCON0 = 0x3;//設定串列埠0的資料位8,停止位1,校驗位無 UCON0 = (1<<2)|(1<<0);//使能傳送,接受模式 //UBRDIVn = (int)( UART 時鐘 / ( 波特率 × 16) ) –1 UFCON0 = 0; UMCON0 = 0; UBRDIV0 = PCLK/(BPS*16) -1; } void uart0_sendchar(unsigned char date) { UTXH0 = date; while((UTRSTAT0&0x04)==0); // UTXH0 = date; } char uart0_recvchar(void) { while((UTRSTAT0&0x01)==0); return URXH0; } void uart0_recvstring(char *ch,int len) { while(len--) { *ch = uart0_recvchar(); ch++; } *ch = '\0'; } void uart0_sendstring(char* string) { while(*string != 0) { uart0_sendchar(*string); string++; } } void led_init(void) { GPBCON = (1<<10)|(1<<12)|(1<<14)|(1<<16); GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); } void judge_led(char *recv) { if(strcmp(recv,"L10")==0) { GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); } else if(strcmp(recv,"L11")==0) { GPBDAT = (0<<5)|(1<<6)|(1<<7)|(1<<8); } else if(strcmp(recv,"L21")==0) { GPBDAT = (1<<5)|(0<<6)|(1<<7)|(1<<8); } else if(strcmp(recv,"L20")==0) { GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); } else if(strcmp(recv,"L31")==0) { GPBDAT = (1<<5)|(1<<6)|(0<<7)|(1<<8); } else if(strcmp(recv,"L30")==0) { GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); } else if(strcmp(recv,"L41")==0) { GPBDAT = (1<<5)|(1<<6)|(1<<7)|(0<<8); } else if(strcmp(recv,"L40")==0) { GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); } } int main(void) { char recv[4]={0}; uart0_init(); led_init(); while(1) { uart0_recvstring(recv,3); uart0_sendstring(recv); delay(0x2000); judge_led(recv); memset(recv,0,strlen(recv)+1); } }