1 void main() 2 { 3 init(); //引脚初始化 4 bark(); //响一下,提示用户 5 welcome(); //欢迎 6 7 while(1) 8 { 9 prompt(); //命令提示符 10 11 //接收一条命令 12 getcommand(rbuf, sizeof(rbuf)); 13 14 switch(rbuff){ 15 case "": prompt(); break; 16 case "?": showhelp(); 17 case "help": showhelp(); break; 18 case "led run": led(&rbuf, sizeof(rbuf)); break; 19 case "bark": bark(); break; 20 default: break; 21 } 22 } 23 } 24 25 void getcommand(char* rbuf, int size) 26 { 27 int i = 0; 28 29 while((rbuf != '\n') && (i <= size)){ 30 while(URTSTAT0 & 0X01); //等待缓冲区接收到数据 31 rbuf[i] = URXH0; 32 i++; 33 } 34 rbuff[i-1] = '\0'; 35 } 36 37 static void delay(char t) 38 { 39 int i, j; 40 for(; t > 0; t--) 41 for(i = 0; i < 512; i++) 42 for(i = 0; i < 256; i++); 43 } 44 static void sendbyte(char c) 45 { 46 while(!(UTXH0 & 0X40)); 47 UTXH0 = c; 48 } 49 50 void print(char* s, int size) 51 { 52 int i; 53 54 for(i = 0; i < size; i++) 55 sendbyte(s[i]); 56 } 57 58 static void init(void) 59 { 60 //设置 GPB 0 5 6 8 10 为输出且上拉 61 GPBCON = 0XDDD7FD; 62 GPBPUD &= 0X000; 63 ULCON0 &= 0X00; 64 ULCON0 |= 0X03; 65 UCON0 = 0X0805; //PCLK & POLL 66 UBRDIV0 =0X1A; //波特率115200 67 } 68 static void prompt(void) 69 { 70 sendbyte('>'); 71 } 72 73 static void welcome(void) 74 { 75 char welcome[] = "\nWelcome!\n 76 You are using a simple shell,\n 77 type ? or help for the first time.\n"; 78 print(&welcome, sizeof(welcome)); 79 } 80 81 static void showhelp(void) 82 { 83 char help[] = "You can use these command in our shell:\n 84 ?\nhelp\n 85 led run\n 86 bark\n"; 87 print(&help, sizeof(help)); 88 } 89 90 static void bark(void) 91 { 92 GPBDAT |= 0X01; 93 delay(1); 94 GPBDAT &= 0X00; 95 } 96 97 /* 98 * 下面这个函数有必要解释一下,它将一个字符串 99 * 转化成字符串数组,用在带参数的命令输入中。 100 * 101 * 实现的过程是: 102 * 1.令 i 指向带空格的字符串第一个字符; 103 * 2.令 j 指向 i,并由 j 扫描一个连贯的字符串; 104 * 3.令 i 移动到 j 扫描到的连贯字符串末尾,跳到第二步; 105 * 4.直到 j 扫描到字符串结束符。 106 * 107 * 细节: 108 * 1.扫描后产生的字符串都没有结束符,需要添加。 109 * 2.注意 i += (j + 1) 这一句表示跳过扫描到的字符串 110 * 和空格符移动指针到下一个字符串 111 */ 112 static int getargv(char* dest[], char* src) 113 { 114 int i, j; 115 for(i = 0; src[i] != '\0'; i += (j + 1)){ 116 for(j = i; src[j] != ('0' || '\0'); j++){ 117 dest[i][j] = src[i+j]; 118 } 119 dest[i][j] = '\0'; 120 } 121 return 0; 122 } 123 124 void led(char* s, int size) 125 { 126 int ret; 127 //char help = "Usage: led [type] [num ...]\n"; 128 char* argv[10]; 129 ret = getargv(&argv, &s); 130 if(ret != -1){ 131 switch(argv[1]){ 132 case "run": ledrun(); break; 133 default: break; 134 } 135 } 136 }