到这里,正常的键盘程序结束,调用时只需加入Key.c,包含Key.h即可使用,先调用KeyInit后,就可以正常的读键了。这里不再细说。
scanf移植:scanf移植时,需要的是ASCII码字符型设备,利用ASCII码输入数据还必须要有回车键,只有这样,才能用scanf输入数据,这里为了输入数据错误时,可以退格修改,按键还有一个退格键。 键盘结构:
1 4 7 保留 2 5 8 0 3 6 9 保留 退格 保留 保留 回车 保留键用字符’\\0’,回车’\\n’退格’\\b’ 所以:KeyCode:
char KeyCode[] = \; /* 4*4,scanf移植*/ 在字符串里,\\0后面是数字时,必须用’\\000’否则,c语言编译器认为\\0和后面的数字组合为一个字符。
scanf的移植,需要实现getchar函数,这里和之前的getchar函数类似,把它放到了Getchar.c文件里,内容如下:
#include #include \ #define LINE_LENGTH 20 //行缓冲区大小,决定每行最多输入的字符数 /*标准终端设备中,特殊ASCII码定义,请勿修改*/ #define InBACKSP 0x08 //ASCII <-- (退格键) #define InDELETE 0x7F //ASCII (DEL 键) #define InEOL '\\r' //ASCII (回车键) #define InLF '\\n' //ASCII (回车) #define InSKIP '\\3' //ASCII control-C #define InEOF '\\x1A' //ASCII control-Z #define OutDELETE \\\x8\ //VT100 backspace and clear #define OutSKIP \ //^C and new line #define OutEOF \ //^Z and return EOF int getchar() { static char inBuffer[LINE_LENGTH + 2]; //Where to put chars static char ptr; //Pointer in buffer char c; while(1) { if(inBuffer[ptr]) //如果缓冲区有字符 return (inBuffer[ptr++]); //则逐个返回字符 ptr = 0; //直到发送完毕,缓冲区指针归零 while(1) //缓冲区没有字符,则等待字符输入 { c = ReadKey(); //等待接收一个字符==移植时关键 if(c == InEOF && !ptr) //==EOF== Ctrl+Z { //只有在未入其他字符时才有效 printf(OutEOF); //终端显示EOF符 return EOF; //返回 EOF(-1) } if(c==InDELETE || c==InBACKSP) //==退格或删除键== { if(ptr) //缓冲区有值 { ptr--; //从缓冲区移除一个字符 printf(OutDELETE); //同时显示也删掉一个字符 } } else if(c == InSKIP) //==取消键 Ctrl+C == { printf(OutSKIP); //终端显示跳至下一行 ptr = LINE_LENGTH + 1; //==0 结束符== break; } else if(c == InEOL||c == InLF) //== '\\r' 回车=='\\n'回车 { putchar(inBuffer[ptr++] = '\\n');//终端换行 inBuffer[ptr] = 0; //末尾添加结束符(NULL) ptr = 0; //指针清空 break; } else if(ptr < LINE_LENGTH) //== 正常字符 == { if(c >= ' ') //删除 0x20以下字符 { //存入缓冲区 putchar(inBuffer[ptr++] = c); } } else //缓冲区已满 { putchar('\\7'); //== 0x07 蜂鸣符,PC回响一声 } } } } 这里是支持退格等键的详细函数。 如果不需要支持退格,可以简化为:
int getchar() { return ReadKey(); } 要实现scanf调用,还需要设置,详细设置参考:MSP430程序库<四>printf和scanf函数移植;需要把库设置为CLIB;在Option-general option-library configuration里面。
这样,键盘的scanf移植完成,需要使用时,只需加入对stdio.h文件的包含,然后完成键盘的初始化即可。
?
使用示例:
这里,示例实现的是键盘和液晶的简单交互;键盘输入数据,液晶正常显示;就像c语言调试时键盘和屏幕一样;当然没有那个丰富啦。
液晶的部分,用的是原来实现的程序,在这里,为了支持输入错误时退格,对原来的printf函数加入了退格支持。具体参考:MSP430程序库<四>printf和scanf函数移植(已经更新)。
项目中接入液晶的c程序文件和printf的程序文件(Lcd12864.c、Printf.c),加入Lcd12864.h的文件包含;初始化液晶后,就可用printf向液晶输出要显示的内容了。 键盘:加入Key.c,包含Key.h,加入Getchar.c,程序中初始化键盘;然后设置所用的lib为CLIB,具体设置见:MSP430程序库<四>printf和scanf函数移植。之后就可以用键盘和液晶完成和430单片机简单的交互了。 详细参考示例工程和main.c。
#include #include #include \#include \ long a; void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ClkInit(); LcdInit(); KeyInit(); _EINT(); while(1) { printf(\请输入数字:\); scanf(\,&a); printf(\输入的数字是:%ld\,a); _NOP(); } } 这样,就可以用键盘向单片机输入数据,同时利用液晶可以很容易的知道数据输入的是否有问题。
键盘的程序库就到这里,有什么不足,欢迎讨论。