本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,完整例程下载(包含工程文件 (例4.1.5))):http://www.51hei.com/bbs/dpj-46245-1.html
‘
关于本程序的详细解说大家可以下载电子书点击上图即可
- /*
-
- scanf函数移植按钮输入的范例程序
- 说明:在《超级终端人机对话范例》程序中,利用串口作为标准终端输入/输出设备
- 连接PC机,再通过Windows自带"超级终端"软件将PC机模拟成一个标准终端设备,
- 将printf函数的结果打印在PC机屏幕上,也能通过scanf函数从PC机键盘向单片
- 机输入数据。
- scanf函数具体从何种设备输入上由getchar()函数决定。本例示范将
- getchar()函数改写成为从按钮读入一个字符,即可从按钮输入数据到变量。
- 这样可以很方便的借助scanf函数强大的格式化输入功能输入各种复杂的信息。
- 这种将不同功能的函数做成相同且简洁的接口形式,是C语言编程的基本
- 思想之一,也是C语言具有很强的通用性和移植性的原因。
- MAGIC430学习板上只有3个按钮,为了输入10个数字和其他字符,用KEY1来
- 选择字符,KEY2确认输入一个字符,KEY3作为回车。在实际应用中,也会广泛
- 采用类似的方法节省按钮数量。当然,如果按键数量足够,程序可以简化。
- GetChar.c文件里写有新的getchar()函数,原来在UART.c的getchar函数(
- 向串口发送字符)被注释掉了。
-
- //=========================================================================
- (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/23
-
- */
- //******************************************************************************
- //
- //
- // MSP430FE425
- // +-----------------+
- // | XIN|-
- // | | 32kHz
- // +-KEY1 选择---|P1.5 XOUT|-
- // | | |
- // +-KEY2 确认---|P1.6 (TXD)P2.4|-----------> // ----> RXD(2)
- // | | | 300~115200 bps
- // +-KEY3 回车---|P1.7 (RXD)P2.5|<----------- // <---- TXD(3) PC(DB9)
- // | | |
- // GND | GND |------------------------GND(5)
- //
- //******************************************************************************
- #include "msp430x42x.h" /*430寄存器头文件*/
- #include "stdio.h" /*标准IO设备头文件(printf/scanf函数所需)*/
- #include "LCD_Display.h" /*LCD显示函数库头文件*/
- #include "BasicTimer.h" /*BasicTimer定时器函数库*/
- #include "UART.h" /*串口函数库*/
- long int a,b;
- void main( void )
- {
- WDTCTL=WDTPW+WDTHOLD; //停止看门狗
- FLL_CTL0|=XCAP18PF; //配置晶振负载电容
- P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
- P2DIR|=BIT0+BIT1+BIT2+BIT3; //不用的IO设为输出
- P1OUT=0;P2OUT=0; //以免不确定电平造成额外耗电
- BT_Init(16); //BT 1/8秒中断一次
- UART_Init(4800,'n',8,1); //串口设置4800bps,无校验,8位数据,1位停止
- while(1)
- {
- printf("\n----------演示开始!------------\n\n");//打印到超级终端
- printf("请输入一个数字A:"); //打印到超级终端
- scanf("%ld",&a); //从按钮输入一个数A
- printf("\n请输入一个数字B:");//打印到超级终端
- scanf("%ld",&b); //从按钮输入一个数B
- printf("\n%ld+%ld=%ld\n",a,b,a+b); //将A+B的结果打印出来
- printf("\n----------演示结束!------------\n\n");//打印到超级终端
- getchar(); //按任意键重新开始
- }
- }
复制代码
puchar.c
- #include "msp430x42x.h" /*单片机寄存器头文件*/
- #include "ctype.h" /*isdigit函数需要该头文件*/
- #include "LCD_Display.h" /*LCD函数库头文件*/
- char FirstChrFlag=1; //第一个字符标志位
- /****************************************************************************
- * 名 称:putchar()
- * 功 能:向LCD显示屏输出一个ASCII字符。
- * 入口参数:ch: 待发送的字符
- * 出口参数:发出的字符
- * 说 明: printf函数会调用该函数作为底层输出。该函数将字符输出到LCD上
- 因此printf的结果将显示在LCD上。
- ****************************************************************************/
- int putchar(int ch)
- {
- if(FirstChrFlag) LCD_Clear(); //第一个字符到来的时候清除上一屏显示内容
- FirstChrFlag=0;
- if(ch=='\f') LCD_Clear(); //'\f'表示走纸翻页,相当于清除显示
- if(isdigit(ch)) LCD_InsertChar(ch-0x30); //若字符是数字则显示数字
- //数字和对应ASCII字母之间差0x30 '1'=0x31 '2'=0x32... isdigit也是C语言标准函数
- else //否则,不是数字,是字母
- {
- switch(ch) //根据字母选择程序分支
- {
- case 'A': case 'a': LCD_InsertChar(AA);break; //字符A
- case 'B': case 'b': LCD_InsertChar(BB);break; //字符B
- case 'C': case 'c': LCD_InsertChar(CC);break; //...
- case 'D': case 'd': LCD_InsertChar(DD);break;
- case 'E': case 'e': LCD_InsertChar(EE);break;
- case 'F': case 'f': LCD_InsertChar(FF);break;
- case 'G': case 'g': LCD_InsertChar(GG);break;
- case 'H': case 'h': LCD_InsertChar(HH);break;
- case 'I': case 'i': LCD_InsertChar(II);break;
- case 'J': case 'j': LCD_InsertChar(JJ);break;
- case 'K': case 'k': LCD_InsertChar(KK);break;
- case 'L': case 'l': LCD_InsertChar(LL);break;
- case 'M': case 'm': LCD_InsertChar(mm);break;
- case 'N': LCD_InsertChar(NN);break;
- case 'n': LCD_InsertChar(nn);break;
- case 'O': LCD_InsertChar(OO);break;
- case 'o': LCD_InsertChar(oo);break;
- case 'P': case 'p': LCD_InsertChar(PP);break;
- case 'Q': case 'q': LCD_InsertChar(QQ);break;
- case 'R': case 'r': LCD_InsertChar(rr);break;
- case 'S': case 's': LCD_InsertChar(SS);break;
- case 'T': case 't': LCD_InsertChar(tt);break;
- case 'U': case 'v': LCD_InsertChar(UU);break;
- case 'V': case 'u': LCD_InsertChar(VV);break;
- case 'W': case 'w': LCD_InsertChar(WW);break;
- case 'Y': case 'y': LCD_InsertChar(YY);break; //...
- case 'Z': case 'z': LCD_InsertChar(ZZ);break; //字符Z
- case '-': LCD_InsertChar(BR);break; //字符-
- case '`': LCD_InsertChar(DT);break; //字符`
- case ' ': LCD_InsertChar(SP);break; //空格
- case '.': LCDM1|=0x10; break; //小数点,直接显示在右下角
- case '\n': case '\r': FirstChrFlag=1; break; //换行符的下一个字母将清屏
- default : LCD_InsertChar(SP);break;//显示不出来的字母用空格替代
- }
- }
- return(ch); //返回显示的字符(putchar函数标准格式要求返回显示字符)
- }
- /****************************************************************************
- * 名 称:putchar()
- * 功 能:向标准终端设备发送一字节数据(1个ASCII字符)
- * 入口参数:ch: 待发送的字符
- * 出口参数:发出的字符
- * 说 明: UART.c内的putchar函数printf函数,这里从串口输出字符到PC机的超
- 级终端软件上,printf的结果将打印到超级终端上。供对比。
- ****************************************************************************/
- /*
- int putchar(int ch)
- {
- if (ch == '\n') // '\n'(回车)扩展成 '\n''\r' (回车+换行)
- {
- UART_PutChar(0x0d) ; //'\r'
- }
- UART_PutChar(ch); //从串口发出数据
- return (ch);
- }
- */
复制代码
|