找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3176|回复: 0
收起左侧

MSP430单片机scanf函数移植按钮输入的范例程序

[复制链接]
ID:108615 发表于 2016-3-14 18:42 | 显示全部楼层 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,完整例程下载(包含工程文件 (例4.1.5))):http://www.51hei.com/bbs/dpj-46245-1.html

关于本程序的详细解说大家可以下载电子书点击上图即可
  1. /*
  2.                
  3.                       scanf函数移植按钮输入的范例程序

  4.   说明:在《超级终端人机对话范例》程序中,利用串口作为标准终端输入/输出设备
  5.         连接PC机,再通过Windows自带"超级终端"软件将PC机模拟成一个标准终端设备,
  6.         将printf函数的结果打印在PC机屏幕上,也能通过scanf函数从PC机键盘向单片
  7.         机输入数据。
  8.             scanf函数具体从何种设备输入上由getchar()函数决定。本例示范将
  9.         getchar()函数改写成为从按钮读入一个字符,即可从按钮输入数据到变量。
  10.         这样可以很方便的借助scanf函数强大的格式化输入功能输入各种复杂的信息。
  11.             这种将不同功能的函数做成相同且简洁的接口形式,是C语言编程的基本
  12.         思想之一,也是C语言具有很强的通用性和移植性的原因。
  13.             MAGIC430学习板上只有3个按钮,为了输入10个数字和其他字符,用KEY1来
  14.         选择字符,KEY2确认输入一个字符,KEY3作为回车。在实际应用中,也会广泛
  15.         采用类似的方法节省按钮数量。当然,如果按键数量足够,程序可以简化。
  16.             GetChar.c文件里写有新的getchar()函数,原来在UART.c的getchar函数(
  17.         向串口发送字符)被注释掉了。
  18.             

  19. //=========================================================================


  20.   (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/23
  21.   
  22. */
  23. //******************************************************************************
  24. //                        
  25. //
  26. //                MSP430FE425
  27. //                +-----------------+
  28. //                |              XIN|-
  29. //                |                 | 32kHz
  30. //  +-KEY1 选择---|P1.5         XOUT|-
  31. //  |             |                 |
  32. //  +-KEY2 确认---|P1.6    (TXD)P2.4|----------->  //  ----> RXD(2)
  33. //  |             |                 | 300~115200 bps            
  34. //  +-KEY3 回车---|P1.7    (RXD)P2.5|<-----------  //  <---- TXD(3)  PC(DB9)
  35. //  |             |                 |
  36. // GND            |             GND |------------------------GND(5)
  37. //
  38. //******************************************************************************
  39. #include "msp430x42x.h"    /*430寄存器头文件*/
  40. #include "stdio.h"         /*标准IO设备头文件(printf/scanf函数所需)*/
  41. #include "LCD_Display.h"   /*LCD显示函数库头文件*/
  42. #include "BasicTimer.h"    /*BasicTimer定时器函数库*/
  43. #include "UART.h"          /*串口函数库*/

  44. long int a,b;
  45. void main( void )
  46. {
  47.   WDTCTL=WDTPW+WDTHOLD;  //停止看门狗
  48.   FLL_CTL0|=XCAP18PF;          //配置晶振负载电容
  49.   P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
  50.   P2DIR|=BIT0+BIT1+BIT2+BIT3;       //不用的IO设为输出
  51.   P1OUT=0;P2OUT=0;                  //以免不确定电平造成额外耗电
  52.   BT_Init(16);                       //BT 1/8秒中断一次
  53.   UART_Init(4800,'n',8,1);          //串口设置4800bps,无校验,8位数据,1位停止
  54.    while(1)
  55.    {
  56.      printf("\n----------演示开始!------------\n\n");//打印到超级终端
  57.      printf("请输入一个数字A:");  //打印到超级终端     
  58.      scanf("%ld",&a);             //从按钮输入一个数A
  59.      printf("\n请输入一个数字B:");//打印到超级终端     
  60.      scanf("%ld",&b);             //从按钮输入一个数B
  61.      printf("\n%ld+%ld=%ld\n",a,b,a+b); //将A+B的结果打印出来
  62.      printf("\n----------演示结束!------------\n\n");//打印到超级终端
  63.      getchar();                  //按任意键重新开始
  64.    }
  65. }
复制代码

puchar.c
  1. #include "msp430x42x.h"  /*单片机寄存器头文件*/
  2. #include "ctype.h"       /*isdigit函数需要该头文件*/
  3. #include "LCD_Display.h" /*LCD函数库头文件*/
  4. char  FirstChrFlag=1;  //第一个字符标志位


  5. /****************************************************************************
  6. * 名    称:putchar()
  7. * 功    能:向LCD显示屏输出一个ASCII字符。
  8. * 入口参数:ch: 待发送的字符  
  9. * 出口参数:发出的字符
  10. * 说    明: printf函数会调用该函数作为底层输出。该函数将字符输出到LCD上
  11.             因此printf的结果将显示在LCD上。
  12. ****************************************************************************/
  13. int putchar(int ch)
  14. {
  15. if(FirstChrFlag) LCD_Clear(); //第一个字符到来的时候清除上一屏显示内容
  16. FirstChrFlag=0;
  17. if(ch=='\f')     LCD_Clear(); //'\f'表示走纸翻页,相当于清除显示
  18. if(isdigit(ch))  LCD_InsertChar(ch-0x30); //若字符是数字则显示数字
  19. //数字和对应ASCII字母之间差0x30   '1'=0x31 '2'=0x32... isdigit也是C语言标准函数
  20. else             //否则,不是数字,是字母
  21. {
  22.     switch(ch)    //根据字母选择程序分支
  23.     {
  24.       case 'A': case 'a':  LCD_InsertChar(AA);break;  //字符A
  25.       case 'B': case 'b':  LCD_InsertChar(BB);break;  //字符B
  26.       case 'C': case 'c':  LCD_InsertChar(CC);break;  //...
  27.       case 'D': case 'd':  LCD_InsertChar(DD);break;  
  28.       case 'E': case 'e':  LCD_InsertChar(EE);break;
  29.       case 'F': case 'f':  LCD_InsertChar(FF);break;
  30.       case 'G': case 'g':  LCD_InsertChar(GG);break;
  31.       case 'H': case 'h':  LCD_InsertChar(HH);break;
  32.       case 'I': case 'i':  LCD_InsertChar(II);break;
  33.       case 'J': case 'j':  LCD_InsertChar(JJ);break;
  34.       case 'K': case 'k':  LCD_InsertChar(KK);break;
  35.       case 'L': case 'l':  LCD_InsertChar(LL);break;
  36.       case 'M': case 'm':  LCD_InsertChar(mm);break;
  37.       case 'N':            LCD_InsertChar(NN);break;
  38.       case 'n':            LCD_InsertChar(nn);break;
  39.       case 'O':            LCD_InsertChar(OO);break;
  40.       case 'o':            LCD_InsertChar(oo);break;
  41.       case 'P': case 'p':  LCD_InsertChar(PP);break;
  42.       case 'Q': case 'q':  LCD_InsertChar(QQ);break;
  43.       case 'R': case 'r':  LCD_InsertChar(rr);break;
  44.       case 'S': case 's':  LCD_InsertChar(SS);break;
  45.       case 'T': case 't':  LCD_InsertChar(tt);break;
  46.       case 'U': case 'v':  LCD_InsertChar(UU);break;
  47.       case 'V': case 'u':  LCD_InsertChar(VV);break;
  48.       case 'W': case 'w':  LCD_InsertChar(WW);break;
  49.       case 'Y': case 'y':  LCD_InsertChar(YY);break;  //...
  50.       case 'Z': case 'z':  LCD_InsertChar(ZZ);break;  //字符Z
  51.       case '-':            LCD_InsertChar(BR);break;  //字符-
  52.       case '`':            LCD_InsertChar(DT);break;  //字符`
  53.       case ' ':            LCD_InsertChar(SP);break;  //空格
  54.       case '.':            LCDM1|=0x10;       break;  //小数点,直接显示在右下角
  55.       case '\n': case '\r':  FirstChrFlag=1;  break;  //换行符的下一个字母将清屏
  56.       default :            LCD_InsertChar(SP);break;//显示不出来的字母用空格替代
  57.       }
  58.   }
  59. return(ch);  //返回显示的字符(putchar函数标准格式要求返回显示字符)
  60. }

  61. /****************************************************************************
  62. * 名    称:putchar()
  63. * 功    能:向标准终端设备发送一字节数据(1个ASCII字符)
  64. * 入口参数:ch: 待发送的字符  
  65. * 出口参数:发出的字符
  66. * 说    明: UART.c内的putchar函数printf函数,这里从串口输出字符到PC机的超
  67.             级终端软件上,printf的结果将打印到超级终端上。供对比。
  68. ****************************************************************************/
  69. /*
  70. int putchar(int ch)
  71. {
  72.   if (ch == '\n')        //  '\n'(回车)扩展成 '\n''\r' (回车+换行)
  73.   {
  74.     UART_PutChar(0x0d) ; //'\r'
  75.   }
  76.   UART_PutChar(ch);      //从串口发出数据  
  77.   return (ch);
  78. }
  79. */
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表