12864控制forMSP430

发布者:脑电狂潮最新更新时间:2015-09-17 来源: eefocus关键字:MSP430 手机看文章 扫描二维码
随时随地手机看文章
 
  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.   [page]
  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.  

关键字:MSP430 引用地址:12864控制forMSP430

上一篇:MSP430学习笔记(1)看门狗
下一篇:1602控制forMSP430

推荐阅读最新更新时间:2024-03-16 14:32

MSP430F5438 I2C学习笔记——AT24C02
0.前言 对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题,但是总感觉没有充分发挥MCU内部的硬件资源。查阅了所有关于MSP430F5系列的图书,没有关于硬件I2C的应用代码,自己通过调试摸索,把经验总结之后和大家分享,希望大家喜欢。同时,I2C的使用可以分为等待法和中断法,从理解的角度来说等待法思路清晰易于上手,从功耗的角度出发,中断法可以灵活的进入低功耗模式,但是不易理解。本文先从等待法入手。 MSP430F5系列的硬件I2C使用大致会有以下问题: 【I2C地址设定】一般情况下
[单片机]
<font color='red'>MSP430</font>F5438 I2C学习笔记——AT24C02
MSP430单片机实践篇---数字型LCD-1602显示
/************************************************** * * LCD1602显示 * cpu:AVRmega16 * * 描述:4线数据宽度,操作Lcd1602 * 在LCD1602屏幕上第一行显示 * 第二行显示 13652037001 * 如果没有显示请按复位键,并多试几次 * * 时间:2008年1月5日调试成功(出现问题主要是因为LCD第3脚V0的2K接地电阻没有接好) * * 硬件电路:MSP430F135核心实验板-I型 * 硬件连接: * * MSP430与LCD连接信息 * LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU * PIN1 --
[单片机]
12864显示屏菜单程序
/*34864中文字库*/ // 单片机 的连接 //******************************************************* //p3= 数据口 //p4--控制口 //p4.0= rs //p4.1= r/w //p4.2= e //p4.4= psb //p4.5= rst //******************************************************* //库函数 //******************************************************* #include MSP 430x22x4.h #define ke
[单片机]
单片机 MSP430 G2553 launchpad LCD1602 显示 连线
情节提示:一定要看到最后。 一般无特殊计划 买的LCD1602显示屏是5V版本的,不是3.3特殊版本,这时候怎么连线。 下图画正方形的2个孔,上面是5V,下面是板子的GND。下图右上角的VCC是3.3V. 接线方式: 成功: 最终我单片机烧毁了,无法下载程序进去了,因为LCD1602输出了5V电压,而MSP430单片机是3.3V单片机,有的引脚兼容不了。 所以建议买3.3V的LCD1602显示屏或者买OLED显示屏。
[单片机]
单片机 <font color='red'>MSP430</font> G2553 launchpad LCD1602 显示 连线
MSP430F44X单片机SPI接口驱动C语言程序
#include msp430x44x.h char MST_Data=0X00,SLV_Data=0XFF; void Init(void); void main(void) { unsigned int i; WDTCTL=WDTPW+WDTHOLD; Init(); _EINT(); P3OUT&=~0X020; P3OUT|=0X020; i=50000; do(i--); while(i!=0); while(1) { TXBUF0=MST_Data; LPM0;
[单片机]
msp430定时器A自动溢出
/*********************************************************** 定时器A自动溢出 简述:利用Timer_A 直接计数产生溢出,然后中断处理。 ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz 例程:*/ //******************************************************* #include msp430x14x.h void main(void) { WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器 P3DIR |=
[单片机]
msp430单片机GPIO基础理解
单片机的端口可以通过方向寄存器PxDIR来设置输出(1)还是输入(0) 可以通过输入寄存器PxIN来查看输入端口引脚的电平,尝用来判断按键是否按下。 也可通过PxIE,PxIES,PxIFG实现按键中断,按下某键后执行一段中断程序。 可通过输出寄存器PxOUT来写入输出,常用来控制数码管显示和指示灯等输出设备显示。 PxOUT |= BIT0;//不影响x端口其他引脚而设置x.0引脚输出1 PxOUT &= ~BIT0;//不影响x端口其他引脚而设置x.0引脚输出0 BIT0等价于0x01 0000 0001 BIT7等价于1000 0000 if(!(PxIN & BIT0))判断x.0引脚是否按下 定时器要设置时钟源,捕获/比
[单片机]
低成本模拟前端的可编程计量器件【德州仪器】
2011 年 4 月 8 日,北京讯 日前,德州仪器 (TI) 宣布针对计量与智能电网应用推出 MSP430AFE2xx 系列计量模拟前端 (AFE) 超低功耗 16 位微控制器。低成本 MSP430AFE 系列是 TI 领先的嵌入式处理产品系列的一部分,可提供业界首批多种通信接口支持的可编程单相位计量器件。该系列微控制器支持电表、家庭自动化、辅助计量以及节能系统等计量应用的系统分区,可实现高度灵活的独立高质量测量。MSP430AFE 系列建立在 16 位 RISC 架构基础之上,支持 12MHz 系统频率,系统速度是同类竞争器件的 3 倍,从而可提高功能性。3 个支持防篡改功能的独立 24 位Σ-Δ 转换器可帮助该系列
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved