3339|2

7007

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

MSP430单片机控制LCD12864显示文字 [复制链接]

#include  
#include "displaydata.h"
typedef unsigned char uchar;
typedef unsigned int  uint;

//控制位的宏定义
#define BIT(x)  (1 << (x))
#define RCLK_1    P3OUT |= BIT3
#define RCLK_0    P3OUT &= ~BIT3
#define cyCS      0    //P3.0,片选信号
#define cySID     1    //P3.1,串行数据  
#define cyCLK     2    //P3.2,同步时钟
#define cyPORT    P3OUT  
#define cyDDR     P3DIR
extern const unsigned char shuzi_table[];
uchar flag = 0;
void Send(unsigned char type,unsigned char transdata);
void Ini_Lcd(void);
void Clear_GDRAM(void);
void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
void Draw_PM(const unsigned char *ptr);
void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) ;
void Disp_SZ(unsigned char addr,unsigned char shuzi);



/*******************************************
函数名称:delay_Nus
功    能:延时N个us的时间
参    数:n--延时长度
返回值  :无
********************************************/
void delay_Nus(uint n)
{
    uchar i;
    for(i = n;i > 0;i--)
        _NOP();
}
/*******************************************
函数名称:delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void delay_1ms(void)
{
    uchar i;
    for(i = 150;i > 0;i--)     _NOP();
}  
/*******************************************
函数名称:delay_Nms
功    能:延时N个ms的时间
参    数:无
返回值  :无
********************************************/
void delay_Nms(uint n)
{
    uint i = 0;
     
    for(i = n;i > 0;i--)
        delay_1ms();
}
/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Ini_Lcd(void)
{   
    cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS);   //相应的位端口设置为输出
    delay_Nms(100);                 //延时等待液晶完成复位
    Send(0,0x30);  /*功能设置:一次送8位数据,基本指令集*/
    delay_Nus(72);
    Send(0,0x02);  /*DDRAM地址归位*/
    delay_Nus(72);
    Send(0,0x0c);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
    delay_Nus(72);
    Send(0,0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
    delay_Nus(72);
    Send(0,0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
    delay_Nus(72);      
}  
/*******************************************
函数名称:Send
功    能:MCU向液晶模块发送1一个字节的数据
参    数:type--数据类型,0--控制命令,1--显示数据
          transdata--发送的数据
返回值  :无
********************************************/
void Send(uchar type,uchar transdata)
{
    uchar firstbyte = 0xf8;
    uchar temp;
    uchar i,j = 3;

    if(type) firstbyte |= 0x02;
     
    cyPORT |= BIT(cyCS);            
    cyPORT &= ~BIT(cyCLK);      
    while(j > 0)
    {
        if(j == 3) temp = firstbyte;
        else if(j == 2) temp = transdata&0xf0;
        else  temp = (transdata << 4) & 0xf0;
         
        for(i = 8;i > 0;i--)
        {
            if(temp & 0x80) cyPORT |= BIT(cySID);
            else            cyPORT &= ~BIT(cySID);         
            cyPORT |= BIT(cyCLK);               
            temp <<= 1;
            cyPORT &= ~BIT(cyCLK);
        }
        //三个字节之间一定要有足够的延时,否则易出现时序问题
        if(j == 3) delay_Nus(600);
        else       delay_Nus(200);
         
        j--;
    }
     
    cyPORT &= ~BIT(cySID);      
    cyPORT &= ~BIT(cyCS);      
}
/*******************************************
函数名称:Clear_GDRAM
功    能:清除液晶GDRAM内部的随机数据
参    数:无
返回值  :无
********************************************/
void Clear_GDRAM(void)
{
    uchar i,j,k;
     
    Send(0,0x34);        //打开扩展指令集
    i = 0x80;            
    for(j = 0;j < 32;j++)
    {
        Send(0,i++);      
        Send(0,0x80);  
        for(k = 0;k < 16;k++)
        {
            Send(1,0x00);
        }
    }
    i = 0x80;
    for(j = 0;j < 32;j++)
    {
        Send(0,i++);      
        Send(0,0x88);      
        for(k = 0;k < 16;k++)
        {
            Send(1,0x00);
        }
    }   
    Send(0,0x30);        //回到基本指令集  
}
/*******************************************
函数名称:Disp_HZ
功    能:显示汉字程序
参    数:addr--显示位置的首地址
          pt--指向显示数据的指针
          num--显示数据的个数
返回值  :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
    uchar i;
         
    Send(0,addr);         
    for(i = 0;i < (num*2);i++)
       Send(1,*(pt++));
}
/*******************************************
函数名称:Draw_PM
功    能:在整个屏幕上画一个图片
参    数:ptr--指向保存图片位置的指针
返回值  :无
********************************************/
void Draw_PM(const uchar *ptr)
{
    uchar i,j,k;
     
    Send(0,0x34);        //打开扩展指令集
    i = 0x80;            
    for(j = 0;j < 32;j++)
    {
        Send(0,i++);      
        Send(0,0x80);  
        for(k = 0;k < 16;k++)
        {
            Send(1,*ptr++);
        }
    }
    i = 0x80;
    for(j = 0;j < 32;j++)
    {
        Send(0,i++);      
        Send(0,0x88);      
        for(k = 0;k < 16;k++)
        {
            Send(1,*ptr++);
        }
    }
    Send(0,0x36);               //打开绘图显示
    Send(0,0x30);               //回到基本指令集   
}
/*******************************************
函数名称:Draw_TX
功    能:在液晶上描绘一个16*16的图形
参    数:Yaddr--Y地址,
          Xaddr--X地址
          dp--指向保存图形数据的指针
返回值  :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
    uchar j;
    uchar k = 0;

    Send(0,0x34);           //使用扩展指令集,关闭绘图显示
    for(j = 0;j < 16;j++)
    {
        Send(0,Yaddr++);     //Y地址  
        Send(0,Xaddr);       //X地址
        Send(1,dp[k++]);     //送两个字节的显示数据
        Send(1,dp[k++]);               
    }
    Send(0,0x36);           //打开绘图显示
    Send(0,0x30);           //回到基本指令集模式
}
/*******************************************
函数名称:Disp_SZ
功    能:显示一个两位数字
参    数:addr--显示地址
          数字--显示的数字
返回值  :无
********************************************/
void Disp_SZ(uchar addr,uchar shuzi)
{
    uchar tmp0,tmp1;
     
    tmp0 = shuzi / 10;
    tmp1 = shuzi % 10;  
     
    Send(0,addr);
    Send(1,shuzi_table[tmp0]);
    Send(1,shuzi_table[tmp1]);
}
/************************主函数***********************/
void main(void)
{
    uchar i,j;
     
    WDTCTL = WDTPW + WDTHOLD;            //关闭看门狗
     
    TACTL = TASSEL_1 + MC_1;             //计数时钟ACLK, 增计数模式
    CCR0 = 32768 - 1;
    CCTL0 |= CCIE;                       //使能CCR0比较中断
    _EINT();
    Ini_Lcd();
    while(1){
              Disp_HZ(0x81,line1,6);
              Disp_HZ(0x8a,line2,4);
              flag = 0;
              while(flag < 3);                    //等待三秒钟
              Send(0,0x01);                       //清屏
              CCR0 = (32768 - 1) / 5;
              flag = 0;
              for(i = 0; i < 4; i++)
              {
                  Send(0, 0x0f);                  //打开游标
                  switch(i)
                  {
                  case 0: Send(0,0x81);break;
                  case 1: Send(0,0x91);break;
                  case 2: Send(0,0x89);break;
                  case 3: Send(0,0x99);break;
                  }
                  for(j = 0; j < 12; j++)
                  {
                      Send(1, shige[i*12 + j]);
                      if(j == 11)
                          Send(0, 0x0c);                    //关闭游标
                      flag = 0;
                      while(!flag);                         //等待1/5秒         
                  }   
               }
              CCR0 = 32768 - 1;
              flag = 0;
              while(flag < 2);                    //等待2秒钟
              Send(0,0x01);                       //清屏
              Draw_PM(school);                    //显示文字型画面            
              flag = 0;
              while(flag < 3);                    //等待三秒钟
              Draw_PM(QQ);                        //显示QQ形象
              flag = 0;
              while(flag < 3);                    //等待三秒钟
              Send(0,0x01);                       //清屏
              Disp_HZ(0x92,jieshu,4);             //结束文字   
   
    }
}
/*******************************************
函数名称:TimerA_ISR
功    能:定时器A的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
    flag++;   
}

最新回复

没有文件,白玩。。。。。。。  详情 回复 发表于 2015-10-4 20:46
 
点赞 关注

回复
举报

37

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
谢谢分享  
 
 

回复

168

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
没有文件,白玩。。。。。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表