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 }