找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8710|回复: 2
收起左侧

MSP430F4XX系列LCD显示通用驱动程序

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

关于本程序的详细解说大家可以下载电子书点击上图即可
  1. /*
  2.                
  3.                   MSP430F4XX系列LCD显示通用驱动程序


  4.   说明:该驱动程序库包含了常用的LCD显示功能,如显示数字、字母等
  5.         可以作为各种程序的底层驱动使用。
  6.         要使用该库函数,需要将本文件(LCD_Display.c)添加进工程,并在
  7.         需要调用显示函数的文件开头处包含"LCD_Display.h"


  8.   (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/02
  9.   
  10. */
  11. //
  12. //
  13. //                  MSP430F4XX
  14. //               +---------------+         Digital Number
  15. //               |               |         左8+ 7654321右
  16. //               |               |    +----------------------+
  17. //               |A0+      S0-S15|--->|   SoftBaugh LCD_048  |
  18. //               |A0-   COM0-COM3|--->|   7.1Digit,4-Mux LCD |
  19. //               |P2.0           |    +----------------------+
  20. //               |P2.1           |
  21. //               |VRef    R03-R33|<---LCD Voltage Ladder Rs
  22. //               |               |
  23. //               |       XIN/XOUT|<---32.768KHz Watch Crystal
  24. //               |               |
  25. //               +---------------+

  26. #include "msp430x42x.h"

  27. /*宏定义,数码管a-g各段对应的比特,更换硬件只用改动以下8行*/
  28. #define d       0x01                            //  AAAA
  29. #define g       0x02                            // F    B
  30. #define b       0x04                            // F    B
  31. #define a       0x08                            //  GGGG
  32. #define DOTSEG  0x10                            // E    C
  33. #define e       0x20                            // E    C
  34. #define f       0x40                            //  DDDD
  35. #define c       0x80
  36. #define NEGSEG  0x02  
  37. /*用宏定义自动生成段码表,很好的写法,值得学习*/
  38. /*更换硬件无需重写段码表*/
  39. const char LCD_Tab[] = {
  40.   a + b + c + d + e + f,                        // Displays "0"
  41.   b + c,                                        // Displays "1"
  42.   a + b + d + e + g,                            // Displays "2"
  43.   a + b + c + d + g,                            // Displays "3"
  44.   b + c + f + g,                                // Displays "4"
  45.   a + c + d + f +g,                             // Displays "5"
  46.   a + c + d + e + f + g,                        // Displays "6"
  47.   a + b + c,                                    // Displays "7"
  48.   a + b + c + d + e + f + g,                    // Displays "8"
  49.   a + b + c + d + f + g,                        // Displays "9"
  50.   a + b + c + e + f + g,                        // Displays "A"
  51.   c + d + e + f + g,                            // Displays "B"  
  52.   a + d + e + f,                                // Displays "C"
  53.   b + c + d + e + g,                               // Displays "D"
  54.   a + d + e + f + g,                            // Displays "E"
  55.   a + e + f + g,                                // Displays "F"
  56.   a + c + d + e + f,                            // Displays "G"
  57.   b + c + e + f + g,                            // Displays "H"  
  58.   e + f,                                        // Displays "I"
  59.   b + c + d + e,                                    // Displays "J"
  60.   b + d + e + f + g,                            // Displays "K"
  61.   d + e + f,                                    // Displays "L"  
  62.   a + c + e + g,                                    // Displays "M"
  63.   a + b + c + e + f,                            // Displays "N"   
  64.   c + e + g,                                    // Displays "n"
  65.   c + d + e + g,                                    // Displays "o"
  66.   a + b + c + d + e + f,                        // Displays "O"
  67.   a + b + e + f + g,                            // Displays "P"
  68.   a + b + c + f + g,                            // Displays "Q"
  69.   e + g,                                        // Displays "r"
  70.   a + c + d + f +g,                             // Displays "S"
  71.   d + e + f + g,                                    // Displays "t"
  72.   a + e + f ,                                    // Displays "T"
  73.   b + c + d + e + f,                            // Displays "U"
  74.   c + d + e,                                    // Displays "v"
  75.   b + d + f + g,                                    // Displays "W"
  76.   b + c + d + f + g,                            // Displays "Y"
  77.   a + b + d + e + g,                            // Displays "Z"
  78.   g,                                            // Displays "-"
  79.   b,                                            // Displays "'"  
  80.   0                                                    // Displays " "
  81. };
  82. #undef a
  83. #undef b
  84. #undef c
  85. #undef d
  86. #undef e
  87. #undef f
  88. #undef g

  89. #define AA 10
  90. #define BB AA+1
  91. #define CC BB+1
  92. #define DD CC+1
  93. #define EE DD+1
  94. #define FF EE+1
  95. #define GG FF+1
  96. #define HH GG+1
  97. #define II HH+1
  98. #define JJ II+1
  99. #define KK JJ+1
  100. #define LL KK+1
  101. #define mm LL+1
  102. #define NN mm+1
  103. #define nn NN+1
  104. #define oo nn+1
  105. #define OO oo+1
  106. #define PP OO+1
  107. #define QQ PP+1
  108. #define rr QQ+1
  109. #define SS rr+1
  110. #define tt SS+1
  111. #define TT tt+1
  112. #define UU TT+1
  113. #define VV UU+1
  114. #define WW VV+1
  115. #define YY WW+1
  116. #define ZZ YY+1
  117. #define BR ZZ+1     /*   -  */
  118. #define DT BR+1     /*   '  */
  119. #define SP DT+1     /* 空白 */

  120. /****************************************************************************
  121. * 名    称:LCD_Init()
  122. * 功    能:初始化LCD显示屏。
  123. * 入口参数:无
  124. * 出口参数:无
  125. * 说    明: 在主程序LCD操作之前,需要调用该函数设置LCD参数。
  126. ****************************************************************************/
  127. void LCD_Init()
  128. { char i;
  129.   char *pLCD = (char *)&LCDM1;                  // 取LCDM1寄存器(最低位)的地址
  130.   for (i = 0; i < 8; i++)                       // Clear LCD memory
  131.   *pLCD++ = 0;                                  // 清屏
  132.   LCDCTL  = LCDSG0_1 + LCD4MUX + LCDON;         // LCD模式:4mux LCD, segs0-15
  133.   BTCTL  |= BT_fLCD_DIV64;                      // 设置 LCD 刷新率
  134.   /*刷新率越慢功耗越低,但速度太慢LCD会闪烁*/
  135. }

  136. /****************************************************************************
  137. * 名    称:LCD_DisplayLongDecimal()
  138. * 功    能:在LCD上显示一个带有小数点的长数据。
  139. * 入口参数:Number:显示数值  (-999999~9999999)
  140.             DOT   :小数点位数(0~3)
  141. * 出口参数:无
  142. * 范    例: LCD_DisplayDecimal( 123456,2); 显示结果: 1234.56 (2位小数)
  143.             LCD_DisplayDecimal(-123456,1); 显示结果:-12345.6 (1位小数)
  144. * 说    明: 该函数能够显示满屏7位数字,但执行时间较长,耗电大。
  145. ****************************************************************************/
  146. void LCD_DisplayLongDecimal( long int Number, char DOT)
  147. {
  148.   char Neg;
  149.   char i;unsigned char temp;
  150.   char *pLCD = (char *)&LCDM1;
  151.   char PolarLocate;
  152.   char DispBuff[8];

  153.   if(Number<0) {Number=-Number; Neg=1;}  //处理负数
  154.   else          Neg=0;
  155.   for(i=0;i<7;i++)                       //拆分数字
  156.    {
  157.      DispBuff[i]=Number%10;
  158.      Number/=10;
  159.    }
  160.   for(i=6;i>DOT;i--)                     //消隐无效"0"
  161.    {
  162.      if (DispBuff[i]==0) DispBuff[i]=SP;   
  163.      else break;
  164.    }
  165.   PolarLocate=i+1;    // 负号显示在第一个有效数字左边  
  166.   if(DOT>3) DOT=255;  // 无效的小数点不显示
  167.   if(DOT<1) DOT=255;  // LCD048段码中只有123位数字有小数点
  168.   for(i=0;i<7;i++)
  169.     {
  170.       temp=LCD_Tab[DispBuff[i]]; //查表
  171.       if (DOT==i)            temp|=DOTSEG;//显示小数点
  172.       if ((PolarLocate==i)&&(Neg))   temp|=NEGSEG;//负号
  173.       pLCD[i]=temp; //写入显存
  174.     }
  175. }
  176. /****************************************************************************
  177. * 名    称:LCD_DisplayDecimal()
  178. * 功    能:在LCD上显示一个带有小数点的短整型数据。
  179. * 入口参数:Number:显示数值  (-32768~32767)
  180.             DOT   :小数点位数(0~3)
  181. * 出口参数:无
  182. * 范    例: LCD_DisplayDecimal( 12345,2); 显示结果: 123.45 (2位小数)
  183.             LCD_DisplayDecimal(-12345,1); 显示结果:-1234.5 (1位小数)
  184. * 说    明: 该函数显示数值范围小,但执行时间短,耗电小。
  185. ****************************************************************************/
  186. void LCD_DisplayDecimal( int Number, char DOT)
  187. {
  188.   char Neg;
  189.   char i;unsigned char temp;
  190.   char *pLCD = (char *)&LCDM1;
  191.   char PolarLocate;
  192.   char DispBuff[8];

  193.   if(Number<0) {Number=-Number; Neg=1;}  //处理负数
  194.   else          Neg=0;
  195.   for(i=0;i<7;i++)                       //拆分数字
  196.    {
  197.      DispBuff[i]=Number%10;
  198.      Number/=10;
  199.    }
  200.   for(i=6;i>DOT;i--)                     //消隐无效"0"
  201.    {
  202.      if (DispBuff[i]==0) DispBuff[i]=SP;   
  203.      else break;
  204.    }
  205.   PolarLocate=i+1;    // 负号显示在第一个有效数字左边  
  206.   if(DOT>3) DOT=255;  // 无效的小数点不显示
  207.   if(DOT<1) DOT=255;  // LCD048段码中只有123位数字有小数点
  208.   for(i=0;i<7;i++)
  209.     {
  210.       temp=LCD_Tab[DispBuff[i]]; //查表
  211.       if (DOT==i)            temp|=DOTSEG;//显示小数点
  212.       if ((PolarLocate==i)&&(Neg))   temp|=NEGSEG;//负号
  213.       pLCD[i]=temp; //写入显存
  214.     }
  215. }

  216. /****************************************************************************
  217. * 名    称:LCD_DisplayLongNumber()
  218. * 功    能:在LCD上显示一个长整数。
  219. * 入口参数:Number:显示数值  (-999999~9999999)
  220. * 出口参数:无
  221. * 范    例: LCD_DisplayNumber( 123456); 显示结果: 123456
  222.             LCD_DisplayNumber(-123456); 显示结果:-123456
  223. * 说    明: 该函数能够显示满屏7位数字,但执行时间较长,耗电大。
  224. ****************************************************************************/
  225. void LCD_DisplayLongNumber(long int Number)
  226. {
  227.    LCD_DisplayLongDecimal(Number,0) ;//整数没有小数点
  228. }
  229. /****************************************************************************
  230. * 名    称:LCD_DisplayNumber()
  231. * 功    能:在LCD上显示一个短整数。
  232. * 入口参数:Number:显示数值  (-32768~32767)
  233. * 出口参数:无
  234. * 范    例: LCD_DisplayNumber( 12345); 显示结果: 12345
  235.             LCD_DisplayNumber(-12345); 显示结果:-12345
  236. ****************************************************************************/
  237. void LCD_DisplayNumber(int Number)
  238. {
  239.    LCD_DisplayDecimal(Number,0) ;//整数没有小数点
  240. }
  241. /****************************************************************************
  242. * 名    称:LCD_DisplayChar()
  243. * 功    能:在LCD上显示一个字符。
  244. * 入口参数:ch      :显示内容  可显示字母请参考LCD_Display.h中的宏定义
  245.             Location:显示位置  从左至右对应76543210
  246. * 出口参数:无
  247. * 说    明: 调用该函数不影响LCD其他位的显示。但显示数字的函数会覆盖该函数的结
  248.             果,因此该函数要在显示数据函数之后调用。
  249. * 范    例: LCD_DisplayChar(AA,4);
  250.             LCD_DisplayChar(PP,5);
  251.             LCD_DisplayChar(2 ,6); 显示结果: 2PAXXXX
  252. ****************************************************************************/
  253. void LCD_DisplayChar(char ch,char Location)
  254. {
  255.    char *pLCD = (char *)&LCDM1;
  256.    pLCD[Location]=LCD_Tab[ch];
  257. }
  258. /****************************************************************************
  259. * 名    称:LCD_InsertChar()
  260. * 功    能:在LCD最右端插入一个字符。
  261. * 入口参数:ch      :插入字符  可显示字母请参考LCD_Display.h中的宏定义
  262. * 出口参数:无
  263. * 说    明: 调用该函数后,LCD所有已显示字符左移一位,新的字符插入在最右端一位。
  264.             该函数可以实现滚屏动画效果,或用于在数据后面显示单位。
  265. * 范    例: LCD_DisplayDecimal(1234,1);
  266.             LCD_InsertChar(PP);
  267.             LCD_InsertChar(FF);显示结果: 123.4PF
  268.             
  269. ****************************************************************************/
  270. void LCD_InsertChar(char ch)
  271. {  char i;
  272.    char *pLCD = (char *)&LCDM1;
  273.    for(i=6;i>=1;i--) pLCD[i]=pLCD[i-1];
  274.    pLCD[0]=LCD_Tab[ch];
  275. }
  276. /****************************************************************************
  277. * 名    称:LCD_ON()
  278. * 功    能:开启LCD显示
  279. * 入口参数:无
  280. * 出口参数:无
  281. * 说    明: 调用该函数将开启LCD显示。开启后LCD仍显示最后一次显示内容
  282. ****************************************************************************/
  283. void LCD_ON()
  284. {
  285.    LCDCTL  |= LCDON;
  286. }
  287. /****************************************************************************
  288. * 名    称:LCD_ON()
  289. * 功    能:关闭LCD显示
  290. * 入口参数:无
  291. * 出口参数:无
  292. * 说    明: 调用该函数将关闭LCD显示,可节省3~5uA电流。该函数不清除显示内容。
  293. ****************************************************************************/
  294. void LCD_OFF()
  295. {
  296.    LCDCTL  &=~ LCDON;
  297. }

  298. /****************************************************************************
  299. * 名    称:LCD_Clear()
  300. * 功    能: 清除LCD显示
  301. * 入口参数:无
  302. * 出口参数:无
  303. * 说    明: 调用该函数将LCD显示清除,但并不关闭LCD模块。
  304. ****************************************************************************/
  305. void LCD_Clear()
  306. { char i;
  307.   char *pLCD = (char *)&LCDM1;     // 取LCDM1寄存器(最低位)的地址
  308.   for (i = 0; i < 8; i++)          // Clear LCD memory
  309.   {
  310.     *pLCD++ = 0;                    //清屏
  311.   }
  312. }
复制代码



回复

使用道具 举报

ID:874711 发表于 2021-1-7 11:19 | 显示全部楼层
你好,头文件还有么,能否发一份
回复

使用道具 举报

ID:957828 发表于 2021-7-31 10:25 | 显示全部楼层
请问能移植到msp432上吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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