×
嵌入式 > 技术百科 > 详情

1602控制forMSP430

发布时间:2020-09-11 发布时间:
|
  1. /***************************************************************** 
  2. //文件名   :1602.h 
  3. //描述        :该头文件定义与1602有关的各种接口、函数,适用于MSP430F149 
  4. //编写人   :小邪@清水 
  5. //版本号   :1.00 
  6. *****************************************************************/  
  7.   
  8. #include   
  9. #include "1602.h"  
  10. #define uchar unsigned char   
  11. #define uint unsigned int    
  12.   
  13. uchar NUM[] = {"0123456789."};  
  14.   
  15. /***************************************************************** 
  16. //关于1602的一些宏定义 
  17. //注意:除第三个外都要根据实际使用IO口更改 
  18. *****************************************************************/  
  19. #define DataDir     P4DIR  
  20. #define DataPort    P4OUT                 
  21. #define Busy        0x80  
  22. #define CtrlDir     P3DIR  
  23. #define CLR_RS      P3OUT&=~BIT0;                               //RS = P3.0   
  24. #define SET_RS      P3OUT|=BIT0;      
  25. #define CLR_RW      P3OUT&=~BIT1;                               //RW = P3.1  
  26. #define SET_RW      P3OUT|=BIT1;      
  27. #define CLR_EN      P3OUT&=~BIT2;                               //EN = P3.2   
  28. #define SET_EN      P3OUT|=BIT2;      
  29.   
  30. /************************************************************************* 
  31. //名称    : delay 
  32. //参数    : 无 
  33. //返回值:无 
  34. //功能    : 延时 5 ms的时间 
  35. *************************************************************************/  
  36. void Delay5ms(void)  
  37. {   
  38.     uint i=40000;  
  39.     while (i != 0)  
  40.     {  
  41.         i--;  
  42.     }  
  43. }  
  44.   
  45. /************************************************************************* 
  46. //名称    :WaitForEnable 
  47. //参数    :无  
  48. //返回值:无 
  49. //功能    :等待直到1602完成当前操作 
  50. *************************************************************************/  
  51. void WaitForEnable(void)   
  52. {  
  53.     P4DIR &= 0x00;  //将P4口切换为输入状态  
  54.   
  55.     CLR_RS;  
  56.     SET_RW;  
  57.     _NOP();  
  58.     SET_EN;   
  59.     _NOP();  
  60.     _NOP();  
  61.       
  62.     while((P4IN & Busy)!=0);  //检测忙标志  
  63.   
  64.     CLR_EN;  
  65.   
  66.     P4DIR |= 0xFF;  //将P4口切换为输出状态  
  67. }     
  68.   
  69. /************************************************************************* 
  70. //名称    :WriteCommand 
  71. //参数    :cmd--命令,chk--是否判忙的标志,1:判忙,0:不判 
  72. //返回值:无 
  73. //功能    :向1602写指令 
  74. *************************************************************************/  
  75. void WriteCommand(uchar cmd,uchar chk)   
  76. {  
  77.   
  78.     if (chk) WaitForEnable();   // 检测忙信号  
  79.       
  80.     CLR_RS;   
  81.     CLR_RW;   
  82.     _NOP();  
  83.   
  84.     DataPort = cmd;             //将命令字写入数据端口   
  85.     _NOP();                   
  86.       
  87.     SET_EN;                     //产生使能脉冲信号  
  88.     _NOP();  
  89.     _NOP();  
  90.     CLR_EN;           
  91. }  
  92.   
  93. /************************************************************************* 
  94. //名称    :WriteData 
  95. //参数    :unsigned char Data 
  96. //返回值:无 
  97. //功能    :向1602写入数据 
  98. *************************************************************************/  
  99. void WriteData( uchar data )   
  100. {  
  101.     WaitForEnable();        //等待液晶不忙  
  102.   
  103.     SET_RS;  
  104.     CLR_RW;   
  105.     _NOP();  
  106.   
  107.     DataPort = data;        //将显示数据写入数据端口  
  108.     _NOP();  
  109.   
  110.     SET_EN;                 //产生使能脉冲信号  
  111.     _NOP();   
  112.     _NOP();   
  113.     CLR_EN;       
  114. }  
  115.   [page]
  116. /************************************************************************* 
  117. //名称    :LocateXY 
  118. //参数    :unsigned char x,unsigned char y 
  119. //返回值:无 
  120. //功能    :确定1602写入数据的位置,X为行坐标,Y为列坐标(都从0开始) 
  121. *************************************************************************/  
  122. void LocateXY(uchar x,uchar y)   
  123. {  
  124.     uchar temp;  
  125.   
  126.     temp = x&0x0f;  
  127.     y &= 0x01;  
  128.     if(y)   temp |= 0x40;  //如果在第2行  
  129.     temp |= 0x80;  
  130.   
  131.     WriteCommand(temp,1);  
  132. }  
  133.   
  134. /************************************************************************* 
  135. //名称    :LcdInit 
  136. //参数    :无 
  137. //返回值:无 
  138. //功能    :1602初始化 
  139. *************************************************************************/  
  140. void LcdInit(void)   
  141. {  
  142.     CtrlDir |= 0x07;                 //控制线端口设为输出状态   
  143.     DataDir |= 0xFF;                 //数据端口设为输出状态  
  144.     
  145.     WriteCommand(0x38, 0);      //规定的复位操作  
  146.     Delay5ms();  
  147.     WriteCommand(0x38, 0);        
  148.     Delay5ms();  
  149.     WriteCommand(0x38, 0);  
  150.     Delay5ms();  
  151.   
  152.     WriteCommand(0x38, 1);      //显示模式设置  
  153.     WriteCommand(0x08, 1);      //显示关闭  
  154.     WriteCommand(0x01, 1);      //显示清屏  
  155.     WriteCommand(0x06, 1);      //写字符时整体不移动  
  156.     WriteCommand(0x0c, 1);      //显示开,不开游标,不闪烁  
  157. }  
  158.   
  159. /************************************************************************* 
  160. //名称    :WriteStr 
  161. //参数    :待写入数组的首地址,unsigned int n,unsigned char x,unsigned char y 
  162. //返回值:无 
  163. //功能    :在给定位置显示一个数组,长度为l 
  164. *************************************************************************/  
  165. void WriteStr(uchar *a,uint l,uchar x,uchar y)  
  166. {  
  167.     uchar i;  
  168.     LocateXY(x,y);  
  169.     for(i = 0;i 
  170.         WriteData(a[i]);  
  171. }  
  172.   
  173. /************************************************************************* 
  174. //名称    :WriteNum 
  175. //参数    :待写入数字,unsigned char x,unsigned char y 
  176. //返回值:无 
  177. //功能    :在给定位置显示一个数字(不超过5位且小于65536) 
  178. *************************************************************************/  
  179. void WriteNum(uint n,uchar x,uchar y)  
  180. {  
  181.     uchar five,four,three,two,one;  
  182.     LocateXY(x,y);  
  183.     if((n >= 10000)&&(n <= 65535))  
  184.     {  
  185.         five = n / 10000;  
  186.         four = (n % 10000) / 1000;  
  187.         three = ((n - five * 10000) % 1000) / 100;  
  188.         two = ((n - five * 10000) % 1000 - three * 100 ) / 10;  
  189.         one = ((n - five * 10000) % 1000 - three * 100 ) % 10;  
  190.         WriteData(NUM[five]);  
  191.         WriteData(NUM[four]);  
  192.         WriteData(NUM[three]);  
  193.         WriteData(NUM[two]);  
  194.         WriteData(NUM[one]);  
  195.     }  
  196.     if((n >= 1000)&&(n <= 9999))  
  197.     {  
  198.         four = n / 1000;  
  199.         three = (n % 1000) / 100;  
  200.         two = (n % 1000 - three * 100 ) / 10;  
  201.         one = (n % 1000 - three * 100 ) % 10;  
  202.         WriteData(NUM[four]);  
  203.         WriteData(NUM[three]);  
  204.         WriteData(NUM[two]);  
  205.         WriteData(NUM[one]);  
  206.     }  
  207.     if((n >= 100)&&(n <= 999))  
  208.     {  
  209.         three = n / 100;  
  210.         two = (n - three * 100 ) / 10;  
  211.         one = (n - three * 100 ) % 10;  
  212.         WriteData(NUM[three]);  
  213.         WriteData(NUM[two]);  
  214.         WriteData(NUM[one]);  
  215.     }  
  216.     if((n >= 10)&&(n <= 99))  
  217.     {  
  218.         two = n / 10;  
  219.         one = n % 10;  
  220.         WriteData(NUM[two]);  
  221.         WriteData(NUM[one]);  
  222.     }  
  223.     if((n > 0)&&(n <= 9))WriteData(NUM[n]);  
  224. }  
  225.   
  226. /************************************************************************* 
  227. //名称    :WriteFloat 
  228. //参数    :待写入浮点数,unsigned char x,unsigned char y 
  229. //返回值:无 
  230. //功能    :在给定位置显示一个浮点数(整数部分和小数部分都不超过两位) 
  231. *************************************************************************/  
  232. void WriteFloat(float n,uchar x,uchar y)  
  233. {  
  234.     uint Integer,Decimal;                                           //Integer用于存放整数部分,Decimal用于存放小数部分  
  235.     Integer = (uint)(n/1);  
  236.     Decimal = (uint)(n * 100 - Integer * 100);  
  237.     WriteNum(Integer,x,y);  
  238.     WriteData(NUM[10]);  
  239.     WriteNum(Decimal,x+3,y);  
  240. }  
  241.  




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
洪荒之力+无比专注=国内首款机器人离线编程软件