单片机
返回首页

12864控制forMSP430

2015-09-17 来源:eefocus

 
  1. /***************************************************************** 
  2. //文件名   :12864.c 
  3. //描述        :该文件定义与12864有关的各种接口、函数,适用于MSP430F149 
  4. //编写人   :小邪@清水 
  5. //版本号   :2.01 
  6. *****************************************************************/  
  7.   
  8. #include   
  9. #include '12864.h'  
  10. #define uchar unsigned char   
  11. #define uint unsigned int   
  12.   
  13. #define BIT(x)  (1 << (x))  
  14. unsigned char NUM[] = {'0123456789.'};  
  15. uchar Address[4][8] = {  
  16.         {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87},  
  17.         {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97},  
  18.         {0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f},  
  19.         {0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}  
  20.         };  
  21.   
  22. /***************************************************************** 
  23. //关于12864的一些宏定义 
  24. //注意:各项数据都要根据实际使用IO口更改 
  25. *****************************************************************/  
  26. #define CS      0                                               //CS  = P3.0  
  27. #define SID     1                                               //SID = P3.1    
  28. #define CLK     2                                               //CLK = P3.2  
  29. #define PORT    P3OUT    
  30. #define DIR     P3DIR  
  31.   
  32. /************************************************************************* 
  33. //名称    : delay_Nus 
  34. //参数    : 延时的时间n 
  35. //返回值: 无 
  36. //功能    : 延时 n Ns的时间 
  37. *************************************************************************/  
  38. void delay_Nus(uint n)  
  39. {  
  40.     uchar i;  
  41.     for(i = n;i > 0;i--)  
  42.         _NOP();  
  43. }  
  44.   
  45. /************************************************************************* 
  46. //名称    : delay_1ms 
  47. //参数    : 无 
  48. //返回值: 无 
  49. //功能    : 延时 1 ms的时间 
  50. *************************************************************************/   
  51. void delay_1ms(void)  
  52. {  
  53.     uchar i;  
  54.     for(i = 150;i > 0;i--)     _NOP();  
  55. }   
  56.   
  57. /************************************************************************* 
  58. //名称    : delay_Nms 
  59. //参数    : 延时的时间n 
  60. //返回值: 无 
  61. //功能    : 延时 1 ms的时间 
  62. *************************************************************************/  
  63. void delay_Nms(uint n)  
  64. {  
  65.     uint i = 0;  
  66.       
  67.     for(i = n;i > 0;i--)  
  68.         delay_1ms();  
  69. }  
  70.   
  71. /************************************************************************* 
  72. //名称    : LcdInit 
  73. //参数    : 无 
  74. //返回值: 无 
  75. //功能    : 初始化12864 
  76. *************************************************************************/  
  77. void LcdInit(void)  
  78. {     
  79.     DIR |= BIT(CLK) + BIT(SID) + BIT(CS);                               //相应的位端口设置为输出  
  80.     delay_Nms(100);                                                     //延时等待液晶完成复位  
  81.     Send(0,0x30);                                                       //功能设置:一次送8位数据,基本指令集  
  82.     delay_Nus(72);  
  83.     Send(0,0x02);                                                       //DDRAM地址归位  
  84.     delay_Nus(72);  
  85.     Send(0,0x0c);                                                       //显示设定:开显示,不显示光标,不做当前显示位反白闪动  
  86.     delay_Nus(72);  
  87.     Send(0,0x01);                                                       //清屏,将DDRAM的位址计数器调整为“00H”  
  88.     delay_Nus(72);  
  89.     Send(0,0x06);                                                       //功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1  
  90.     delay_Nus(72);        
  91. }    
  92.   
  93. /************************************************************************* 
  94. //名称    : Send 
  95. //参数    : 数据类型type:0--控制命令,1--显示数据,transdata--发送的数据 
  96. //返回值: 无 
  97. //功能    : 向12864发送一个字节的数据,可用于控制可用于显示 
  98. *************************************************************************/  
  99. void Send(uchar type,uchar transdata)  
  100. {  
  101.     uchar firstbyte = 0xf8;  
  102.     uchar temp;  
  103.     uchar i,j = 3;  
  104.     if(type) firstbyte |= 0x02;  
  105.     PORT |=  BIT(CS);             
  106.     PORT &= ~BIT(CLK);        
  107.     while(j > 0)  
  108.     {  
  109.         if(j == 3) temp = firstbyte;  
  110.         else if(j == 2) temp = transdata&0xf0;  
  111.         else  temp = (transdata << 4) & 0xf0;  
  112.         for(i = 8;i > 0;i--)  
  113.         {  
  114.             if(temp & 0x80) PORT |=  BIT(SID);   
  115.             else        PORT &= ~BIT(SID);            
  116.             PORT |= BIT(CLK);                 
  117.             temp <<= 1;  
  118.             PORT &= ~BIT(CLK);  
  119.         }                                                               //三个字节之间一定要有足够的延时,否则易出现时序问题  
  120.         if(j == 3) delay_Nus(600);   
  121.         else       delay_Nus(200);  
  122.         j--;  
  123.     }   
  124.     PORT &= ~BIT(SID);         
  125.     PORT &= ~BIT(CS);         
  126. }  
  127.   
  128. /************************************************************************* 
  129. //名称    : Clear_GDRAM 
  130. //参数    : 数据类型type:0--控制命令,1--显示数据,transdata--发送的数据 
  131. //返回值: 无 
  132. //功能    : 向12864发送一个字节的数据,可用于控制可用于显示 
  133. *************************************************************************/  
  134. void Clear_GDRAM(void)  
  135. {  
  136.     uchar i,j,k;  
  137.     Send(0,0x34);                                                       //打开扩展指令集  
  138.     i = 0x80;              
  139.     for(j = 0;j < 32;j++)  
  140.     {  
  141.         Send(0,i++);         
  142.         Send(0,0x80);    
  143.         for(k = 0;k < 16;k++)  
  144.         {  
  145.             Send(1,0x00);   
  146.         }  
  147.     }  
  148.     i = 0x80;  
  149.     for(j = 0;j < 32;j++)  
  150.     {  
  151.         Send(0,i++);         
  152.         Send(0,0x88);        
  153.         for(k = 0;k < 16;k++)  
  154.         {  
  155.             Send(1,0x00);   
  156.         }   
  157.     }     
  158.     Send(0,0x30);                                                       //回到基本指令集     
  159. }  
  160.   
  161. /************************************************************************* 
  162. //名称    : WriteStr 
  163. //参数    : 显示的地址addr,待显示数据的指针,显示长度 
  164. //返回值: 无 
  165. //功能    : 在12864指定位置上显示字符串,包括汉字 
  166.           可以显示ASCII码表上字符,但长度应该减半 
  167. *************************************************************************/  
  168. void WriteStr(uchar addr,const uchar * pt,uchar num)  
  169. {  
  170.     uchar i;  
  171.     Send(0,addr);            
  172.     for(i = 0;i < (num*2);i++)   
  173.        Send(1,*(pt++));   
  174. }   
  175.   
  176. /************************************************************************* 
  177. //名称    : DrawPic 
  178. //参数    : 待显示图片的指针 
  179. //返回值: 无 
  180. //功能    : 在整个屏幕上画一个图片 
  181. *************************************************************************/  
  182. void DrawPic(const uchar *ptr)  
  183. {  
  184.     uchar i,j,k;  
  185.     Send(0,0x34);                                                       //打开扩展指令集  
  186.     i = 0x80;              
  187.     for(j = 0;j < 32;j++)  
  188.     {  
  189.         Send(0,i++);         
  190.         Send(0,0x80);    
  191.         for(k = 0;k < 16;k++)  
  192.         {  
  193.             Send(1,*ptr++);   
  194.         }  
  195.     }  
  196.     i = 0x80;  
  197.     for(j = 0;j < 32;j++)  
  198.     {  
  199.         Send(0,i++);         
  200.         Send(0,0x88);        
  201.         for(k = 0;k < 16;k++)  
  202.         {  
  203.             Send(1,*ptr++);   
  204.         }   
  205.     }  
  206.     Send(0,0x36);                                                       //打开绘图显示  
  207.     Send(0,0x30);                                                       //回到基本指令集     
  208. }  
  209.   
  210. /************************************************************************* 
  211. //名称    : Draw1Pic 
  212. //参数    : Yaddr--Y地址,Xaddr--X地址 
  213. //返回值: 无 
  214. //功能    : 在液晶上描绘一个16*16的图形 
  215. *************************************************************************/  
  216. void Draw1Pic(uchar Yaddr,uchar Xaddr,const uchar * dp)   
  217. {  
  218.     uchar j;  
  219.     uchar k = 0;  
  220.     Send(0,0x34);                                                       //使用扩展指令集,关闭绘图显示  
  221.     for(j = 0;j < 16;j++)  
  222.     {  
  223.         Send(0,Yaddr++);                                                //Y地址    
  224.         Send(0,Xaddr);                                                  //X地址  
  225.         Send(1,dp[k++]);                                                //送两个字节的显示数据   
  226.         Send(1,dp[k++]);                  
  227.     }  
  228.     Send(0,0x36);                                                       //打开绘图显示  
  229.     Send(0,0x30);                                                       //回到基本指令集模式  
  230. }  
  231.   
  232. /************************************************************************* 
  233. //名称    : LocateXY 
  234. //参数    : 待写入地址,横坐标X,纵坐标Y(从0开始) 
  235. //返回值: 无 
  236. //功能    : 12864指针指向指定位置 
  237. *************************************************************************/  
  238. void LocateXY(uchar X,uchar Y)  
  239. {  
  240.     Send(0,Address[Y][X]);  
  241. }  
  242.   
  243. /************************************************************************* 
  244. //名称    : WriteNum 
  245. //参数    : 待写入数字Num,横坐标X,纵坐标Y(从0开始) 
  246. //返回值: 无 
  247. //功能    : 在指定位置显示一个数字(不超过5位且小于65536) 
  248. *************************************************************************/  
  249. void WriteNum(uint n,uchar x,uchar y)  
  250. {  
  251.     uchar five,four,three,two,one;  
  252.     LocateXY(x,y);  
  253.     if((n >= 10000)&&(n <= 65535))  
  254.     {  
  255.         five = n / 10000;  
  256.         four = (n % 10000) / 1000;  
  257.         three = ((n - five * 10000) % 1000) / 100;  
  258.         two = ((n - five * 10000) % 1000 - three * 100 ) / 10;  
  259.         one = ((n - five * 10000) % 1000 - three * 100 ) % 10;  
  260.         Send(1,NUM[five]);  
  261.         Send(1,NUM[four]);  
  262.         Send(1,NUM[three]);  
  263.         Send(1,NUM[two]);  
  264.         Send(1,NUM[one]);  
  265.     }  
  266.     if((n >= 1000)&&(n <= 9999))  
  267.     {  
  268.         four = n / 1000;  
  269.         three = (n % 1000) / 100;  
  270.         two = (n % 1000 - three * 100 ) / 10;  
  271.         one = (n % 1000 - three * 100 ) % 10;  
  272.         Send(1,NUM[four]);  
  273.         Send(1,NUM[three]);  
  274.         Send(1,NUM[two]);  
  275.         Send(1,NUM[one]);  
  276.     }  
  277.     if((n >= 100)&&(n <= 999))  
  278.     {  
  279.         three = n / 100;  
  280.         two = (n - three * 100 ) / 10;  
  281.         one = (n - three * 100 ) % 10;  
  282.         Send(1,NUM[three]);  
  283.         Send(1,NUM[two]);  
  284.         Send(1,NUM[one]);  
  285.     }  
  286.     if((n >= 10)&&(n <= 99))  
  287.     {  
  288.         two = n / 10;  
  289.         one = n % 10;  
  290.         Send(1,NUM[two]);  
  291.         Send(1,NUM[one]);  
  292.     }  
  293.     if((n >= 0)&&(n <= 9))Send(1,NUM[n]);  
  294. }  
  295.   
  296. /************************************************************************* 
  297. //名称    :WriteFloat 
  298. //参数    :待写入浮点数,unsigned char x,unsigned char y 
  299. //返回值:无 
  300. //功能    :在给定位置显示一个浮点数(整数部分和小数部分都不超过两位) 
  301. *************************************************************************/  
  302. void WriteFloat(float n,uchar x,uchar y)  
  303. {  
  304.     uint Integer,Decimal;                                           //Integer用于存放整数部分,Decimal用于存放小数部分  
  305.     Integer = (uint)(n/1);  
  306.     Decimal = (uint)(n * 100 - Integer * 100);  
  307.         if(Integer<10)  
  308.         {  
  309.           LocateXY(x,y);  
  310.           Send(1,' ');  
  311.           WriteNum(Integer,x+1,y);  
  312.         }  
  313.         if(Integer>=10)WriteNum(Integer,x,y);  
  314.     Send(1,NUM[10]);  
  315.     WriteNum(Decimal,x+2,y);  
  316. }  
  317.   
  318. /************************************************************************* 
  319. //名称    :WriteArrary 
  320. //参数    :待写入数组,数组长度,unsigned char x,unsigned char y 
  321. //返回值:无 
  322. //功能    :在给定位置显示一个数组 
  323. *************************************************************************/  
  324. void WriteArrary(uint *a,uint n,uchar x,uchar y)  
  325. {  
  326.   uchar i;  
  327.   LocateXY(x,y);  
  328.   for(i = 0;i < n;i ++)  
  329.   {  
  330.     a[i] = a[i] + '0';  
  331.     Send(1,a[i]);  
  332.   }  
  333. }  
  334.  

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 简洁的过零调功器电路设计与分析

  • 单稳态控制电路设计与分析

  • 光控电路设计与分析

  • 永不缺相启动运行的电动机控制电路

  • 开关电源的基本组成及工作原理

  • MT3608构成3.7V转12V的升压电路图

    相关电子头条文章