UART 控制 LED 花樣變化
//有提示的 UART 傳輸,LED 花樣變化 // project name:/ch09/uart_2
#include "SPCE061A.h"
void UART_Init();
char UART_getch();
void UART_putch(char);
void UART_sendstring(char *);
void UART_sendstring_no_linefeed(char *);
void Init_A_Port();
void main() {
unsigned int data;
char *p0 = "========= SPCE061A 串列傳輸實習 =========";
char *p1 = "按 1 , LED 全亮";
char *p2 = "按 2 , LED 全滅";
char *p3 = "按 3 , LED 奇數亮";
char *p4 = "按其他 , 左半邊亮";
char *p5 = "請輸入==> ";
UART_Init();
Init_A_Port();
UART_sendstring(p0);
UART_sendstring(p1);
UART_sendstring(p2);
UART_sendstring(p3);
UART_sendstring(p4);
UART_sendstring_no_linefeed(p5);
while(1) {
data=UART_getch(); //讀出接收的資料
UART_putch(data); // echo 回去發射端 UART_putch(0x08);
switch (data) {
case '1': *P_IOA_Data=0x0000; //點亮 LED break;
case '2': *P_IOA_Data=0xffff; //熄滅 LED break;
case '3': *P_IOA_Data=0xAAAA; //間隔 LED
break;
default : *P_IOA_Data=0xF0F0; //4 暗 4 亮 }
} //while } // main
//===================================================
void UART_sendstring(char *str) //送出字串,跳行 {
char *p,ch;
p = str;
while ( *p ) {
ch = *p;
UART_putch(ch);
p++;
}
UART_putch(0x0a);
UART_putch(0x0d);
}
//===============================================
void UART_sendstring_no_linefeed(char *str) //不跳行 {
char *p,ch;
p = str;
while ( *p ) {
ch = *p;
UART_putch(ch);
p++;
}
UART_putch(0x08);
}
//===============================================
void UART_Init() {
char ch;
// 注意: 特殊接腳時仍須設定 GPIO 暫存器, 否則可能因被強迫 pull-high/low 而不動作
*P_IOB_Dir=0x0400; // IOB10=output(TX), IOB7=input(RX)
*P_IOB_Attrib=0x0480; // IOB10=not invert, IOB7=float
*P_UART_Command1=0x20; // UART reset, 無同位元
*P_UART_BaudScalarHigh=0x05; // Baud=9600bps *P_UART_BaudScalarLow=0x00;
*P_UART_Command2=0x00C0; // 致能 RX/TX
ch = *P_UART_Data; // 清除緩衝區 }
//===================================================
char UART_getch() {
while( ! (*P_UART_Command2 & 0x0080)) { //等待接收完畢 *P_Watchdog_Clear=C_WDTCLR;
}
return *P_UART_Data;
}
//===================================================
void UART_putch(char ch) {
while( !( *P_UART_Command2 & 0x0040)) { //等待前一次發射完畢 *P_Watchdog_Clear=C_WDTCLR;
}
*P_UART_Data = ch;
}
//===================================================
void Init_A_Port() {
*P_IOA_Dir=0xffff; //IOA0~IOA7 初始化為輸出 *P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
}