msp430之lcd12864驱动

并行驱动代码:

#include "msp430g2553.h"
#define uint unsigned int
#define uchar unsigned char  

/*****************************************
 RS--->>P2.0
 RW--->>P2.1
 E---->>P2.2
 PSB-->>P2.3
 PAUSE>>P2.4
 RES-->>P2.5
******************************************/
#define DataPort P1OUT        //MCU P2<------> LCM  

/*
void DelayMs(uint x)
{
    uint a,b;
    for(a=0;a<x;a++)
      for(b=0;b<1000;b++);
}
*/  

void DelayUs2x(unsigned char t)
{
 while(--t);
}  

void DelayMs(unsigned char t)
{  

 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}  

void DelayUs(uint x)
{
    uint a,b;
    for(a=0;a<x;a++)
      for(b=0;b<2;b++);
}
//检测忙位
void Check_Busy()
{
    P2OUT&=0xFE;     //RS=0
    P2OUT |=0x02;    //RW=1
    P2OUT |=0x04;    //E=1
    DataPort=0xFF;   //
    P1DIR=0x00;     //数据端口设为输入状态
    while((P2IN&0x80)==0x80);//忙则等待
    P1DIR=0xFF;    //数据端口还原为输出状态
    P2OUT&=0xFB;
}  

/*---------------------写命令------------------------*/
void Write_Cmd(unsigned char Cmd)
{
    Check_Busy();
    P2OUT&=0xFE;   //RS=0;
    P2OUT&=0xFD;  //RW=0;
    P2OUT |=0x04;  //E=1;
    DataPort=Cmd;
    DelayUs(5);
    P2OUT&=0xFB;  //E=0;
    DelayUs(5);
}
/*------------------------------------------------
                    写数据
------------------------------------------------*/
void Write_Data(unsigned char Data)
{
    Check_Busy();
    P2OUT |=0x01;     //RS=1;
    P2OUT&=0xFD;      //RW=0;
    P2OUT |=0x04;      //E=1;
    DataPort=Data;
    DelayUs(5);
    P2OUT&=0xFB;      //E=0;
    DelayUs(5);
}  

void Init_ST7920()
{
   DelayMs(40);           //大于40MS的延时程序
   P2OUT |=0x08;         //PSB=1;  设置为8BIT并口工作模式
   DelayMs(1);            //延时
   P2OUT&=0xDF;           //RES=0;  复位
   DelayMs(1);            //延时
   P2OUT |=0x20;          //RES=1;    复位置高
   DelayMs(10);
   Write_Cmd(0x30);       //选择基本指令集
   DelayUs(50);         //延时大于100us
   Write_Cmd(0x30);       //选择8bit数据流
   DelayUs(20);         //延时大于37us
   Write_Cmd(0x0c);       //开显示(无游标、不反白)
   DelayUs(50);         //延时大于100us
   Write_Cmd(0x01);       //清除显示,并且设定地址指针为00H
   DelayMs(15);           //延时大于10ms
   Write_Cmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
   DelayUs(50);         //延时大于100us
}  

/*------------------------------------------------
                   显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
------------------------------------------------*/
void LCD_PutString(unsigned char x,unsigned char y,char *s)
{
 switch(y)
     {
      case 1: Write_Cmd(0x80+x);break;
      case 2: Write_Cmd(0x90+x);break;
      case 3: Write_Cmd(0x88+x);break;
      case 4: Write_Cmd(0x98+x);break;
      default:break;
     }
 while(*s>0)
   {
      Write_Data(*s);
      s++;
      DelayUs(100);  //
   }
}  

int main(void)
{  

    char* string1="12864LCD Demo";
    char* string2="Demo for Msp430";
    char* string3="Launch pad G2553";
    char* string4="电控》微电》哈哈》";
    WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
    P1DIR=0xFF;//配置P1为输出,作为数据端口
    P2DIR=0xFF;//配置P2为输出,作为控制端口
    Init_ST7920();
    while(1)
    {  

        LCD_PutString(0,1,string1);
        DelayUs(20);
        LCD_PutString(0,2,string2);
        DelayUs(20);
        LCD_PutString(0,3,string3);
        DelayUs(20);
        LCD_PutString(0,4,string4);
        DelayUs(20);
    }
} 

串行驱动代码:

#include  "msp430g2553.h"  

#define CS1 P1OUT |=0x01
#define CS0 P1OUT &=0x01
#define SID1 P1OUT |=0x02
#define SID0 P1OUT &=~0x02
#define SCLK1 P1OUT |=0x04
#define SCLK0 P1OUT &=~0x04  

void DelayUs2x(unsigned char t)
{
 while(--t);
}  

void delay_1ms(unsigned char t)
{  

 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}  

void sendbyte(unsigned char zdata)
{
    unsigned int i;  

    for(i=0; i<8; i++)
    {
        if((zdata << i) & 0x80)
        {
            SID1;
        }
        else
        {
            SID0;
        }
        SCLK0;
        SCLK1;
    }
}  

void write_com(unsigned char cmdcode)
{
    CS1;
    sendbyte(0xf8);   //1 1 1 1 RS RW 0   写操作RW=0 11111000写数据 11111010写指令
    sendbyte(cmdcode & 0xf0);
    sendbyte((cmdcode << 4) & 0xf0);
    delay_1ms(1);
    CS0;
}  

void write_data(unsigned char Dispdata)
{
    CS1;
    sendbyte(0xfa);
    sendbyte(Dispdata & 0xf0);
    sendbyte((Dispdata << 4) & 0xf0);
    delay_1ms(1);
    CS0;
}  

void Put_String(unsigned int x,unsigned int y,unsigned char* s)
{
     switch(y)
     {
      case 1: write_com(0x80+x);break;
      case 2: write_com(0x90+x);break;
      case 3: write_com(0x88+x);break;
      case 4: write_com(0x98+x);break;
      default:break;
     }
    while(*s>0)
   {
      write_data(*s);
      s++;
      DelayUs2x(50);
   }
}  

void lcdinit()
{
    delay_1ms(200);
    write_com(0x30);  //功能设定:基本指令集
    delay_1ms(20);
    write_com(0x0c);  //显示状态:整体显示,游标关
    delay_1ms(20);
    write_com(0x01);  //清空显示
    delay_1ms(200);
}  

int main( void )
{  

    WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
    P1DIR=0xFF;
    P1OUT=0x00;
    lcdinit();
    while(1)
    {  

       Put_String(1,1,"speed");           

    }  

}  
时间: 2024-10-05 11:02:09

msp430之lcd12864驱动的相关文章

基于51的俄罗斯方块

//variable.h 定义该程序用到的全局变量 #ifndef _VARIABLE_H #define _VARIABLE_H #define GAME_BOARD_WIDTH 50 #define GAME_BOARD_HEIGHT 64 #define PIXEL_PER_CUBE_X 5//4 #define PIXEL_PER_CUBE_Y 4//3 #define NEXT_CUBES_SHOW_POS_X 11 #define NEXT_CUBES_SHOW_POS_Y 9 #d

(原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)

1.Abstract     做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比0~99%范围内,二者均可调.抄下指标以后,回到实验室,细细分析以后,决定用MCU来实现一下,毕竟只分析,无实际结果也不是一个好的交代. 2.Content   2.1 理论分析     归根结底来说,是一个时序逻辑,即PWM输出波形是随着时间的推移而变化.用时序图的方式解释更明晰些. FIG2.1

不带字库LCD12864操作源程序(仅支持串口方式)

/*************************************************** LCD:晶联讯电子 JLX12864G-086-PN(不带字库 驱动IC-UC1701X) 仅支持串行驱动方式 ***************************************************/ //========c12864.h============================================= #ifndef _C12864_H_ #defi

msp430学习笔记-IO及低功耗

引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还可以直接利用P口的输入输出寄存器,直接对外进行通信.因为所有的IO口都是和其他外设复用的,因此在用端口前都要用功能选择寄存器选定所用的功能是外设还是P口,还要在方向寄存器中确定是输入还是输出 MSP430F149的端口功能 端口 功能 P1,P2 I/O,中断功能,其他片内外设功能 P3,P4,P5

emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】

? emWin for 12864 并口移植 源代码下载:RTX_emWin5.24_Keil_VS2008-20141122.zip ? 硬件环境: CPU: stm32f103ve LCD:st7920控制器 12864 并口 ? 软件环境: Keil MDK4.74 VS2008 emWin5.24 ? 使用rtx操作系统 ? ? 1.实现emWin5.24在keil 和vs2008同一代码的工程,vs2008目录实现在FMC的官方模拟器上的模拟,Keil目录实现在stm32f103ve

MSP430G2553 Launchpad 硬件I2C驱动

一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A和USCI_B,其中USCI_A支持UART/IrDA/LIN/SPI通讯,USCI_B支持I2C/SPI通讯.MSP430G2553带有一个USCI_A和一个USCI_B,硬件I2C对应的管脚为P1.6(UCB0SCL)和P1.7(UCB0SDA). 由于Launchpad上P1.6连接到了LED

基于basys2驱动LCDQC12864B的verilog设计图片显示

前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在玩这个了,多看看关于FPGA方面的书籍,比做这个单片机做的东西价值强多了.现在想来确实,自从学习FPGA以来,看过的书没有多少,只是想做个什么了,就在网上找找例程,照抄下来,把算法推理一遍,下个板子实现了,便以为自己会了懂了,要是自己在写一个便问题百出.那么菜鸟始终是菜鸟.自己根本没有掌握FPGA的设计思想和优势,

MSP430 G2553 低功耗模式LPMx

MSP430除了正常运行时的active模式外,还支持五种低功耗模式(Low-power mode),分别为LPM0.LPM1.LPM2.LPM3.LPM4,由状态寄存器中的CPUOFF.OSCOFF.SCG0.SCG1比特位设置. 六种模式对应的时钟状态为: 其中,LPM3.LPM4比较常用,对低功耗的贡献也最大.LPM3模式关闭了DCO.CPU,从而MCLK.SMCLK无法工作,ACLK(来源为LFXT1或VLO)可以正常工作并用于系统的定时唤醒.LPM4模式下所有内部时钟信号都关闭,系统只

MSP430 G2553 计时/计数器 Timer_A

MSP430G2553包含了两个16-bit Timer_A计时/计数器.本文简单介绍了Timer_A的功能和寄存器使用,本文及后续的随笔部分参考了"Scientific Instrument Using the TI MSP430"博客.该博客的MSP430教程文章非常好,建议对MSP430感兴趣的人FQ阅读. 一.介绍 Timer_A可实现的功能有 - multiple compare:判断计时器时间是否到达设定条件,触发事件 - multiple capture:捕获某个事件发生