搜索
bottom↓
回复: 17

请教430_5438 ks0108_12864

[复制链接]

出0入0汤圆

发表于 2011-3-31 14:57:38 | 显示全部楼层 |阅读模式
请教用430驱动12864(金鹏OCM12864-3_ks0108)
调试两天了,一直驱动不起来,现把程序贴上,请教高人指点迷津
#include"msp430x54x.h"

#define uint  unsigned  int
#define uchar unsigned char

//LED配置
#define   LED1       (1<<0)
#define   LED1_H     P1DIR|= LED1,P1OUT|= LED1
#define   LED1_L     P1DIR|= LED1,P1OUT&= ~LED1


//KS0108配置引脚
#define   KS0108_RET       (1<<6)
#define   KS0108_RET_H     P5DIR|= KS0108_RET,P5OUT|= KS0108_RET
#define   KS0108_RET_L     P5DIR|= KS0108_RET,P5OUT&= ~KS0108_RET

#define   KS0108_RW       (1<<4)
#define   KS0108_RW_H     P5DIR|= KS0108_RW,P5OUT|= KS0108_RW
#define   KS0108_RW_L     P5DIR|= KS0108_RW,P5OUT&= ~KS0108_RW

#define   KS0108_EN       (1<<5)
#define   KS0108_EN_H     P5DIR|= KS0108_EN,P5OUT|= KS0108_EN
#define   KS0108_EN_L     P5DIR|= KS0108_EN,P5OUT&= ~KS0108_EN


#define   KS0108_CS1       (1<<4)
#define   KS0108_CS1_H     P9DIR|= KS0108_CS1,P9OUT|= KS0108_CS1
#define   KS0108_CS1_L     P9DIR|= KS0108_CS1,P9OUT&= ~KS0108_CS1

#define   KS0108_CS2       (1<<5)
#define   KS0108_CS2_H     P9DIR|= KS0108_CS2,P9OUT|= KS0108_CS2
#define   KS0108_CS2_L     P9DIR|= KS0108_CS2,P9OUT&= ~KS0108_CS2

#define   KS0108_RS       (1<<6)
#define   KS0108_RS_H     P9DIR|= KS0108_RS,P9OUT|= KS0108_RS
#define   KS0108_RS_L     P9DIR|= KS0108_RS,P9OUT&= ~KS0108_RS

#define   KS0108_LCD       (1<<7)
#define   KS0108_LCD_H     P9DIR|= KS0108_LCD,P9OUT|= KS0108_LCD
#define   KS0108_LCD_L     P9DIR|= KS0108_LCD,P9OUT&= ~KS0108_LCD
//==============================================================================
//KS0108配置 ,指令宏定义
#define Display_On     0x3f                //显示开指令
#define Display_Off    0x3e                //显示关指令
#define Y_Col_Addr     0x40                //定位到第0列指令(列起始地址)(0-63)
#define X_Page_Addr    0xb8                //定位到第0页指令(页起始地址)(0-7)
#define Start_Line           0xc0                //定位从DDROM中的第0行开始往屏幕上显示


//==============================================================================
void Init_Clk(void);

void delay(int n);
void delay1 (uint ms);

/*--------------------------------------------------------------*/
//函数声明
void LCD_pos(unsigned char x, unsigned char y);        //液晶定位(8*8)
void SetStartLine(unsigned char startline);
void init_ks0108(void);
void Lcd_clear(void) ;
void AllScreen(void) ;

void Write_command(unsigned char command) ;
void Write_data(unsigned char data) ;

void main()
{
  WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
  
  //P11DIR |= BIT2 + BIT1 + BIT0; //P11:012设为输出模式
  //P11SEL |= BIT2 + BIT1 + BIT0; //设为第二功能作为频率输出
  
  Init_Clk(); //时钟初始化
  init_ks0108();

  
  while(1)
  {
    LED1_H;
    //LCD_pos(5, 2);
    Write_command(0xb8);
    Write_command(0x40);
    Write_data(0xff);
   
    AllScreen();
    LED1_L;
    delay1(400);
   
  }

}

//delay
void delay(int n)
{
    while(n--);
}
void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<1000;j++)
  ;
}
//时钟初始化
void Init_Clk(void)
{
  P7SEL |= 0x03;                       // Port select XT1
  UCSCTL6 &= ~(XT1OFF);                // Set XT1 On
  UCSCTL6 |= XCAP_3;                        // Internal load cap
  
  UCSCTL3 |= SELREF_0;                      // 选 FLL 时钟源
  UCSCTL4 = SELA_0 + SELM_4 +  + SELS_4;    //选时钟源:ACLK = XT1 = 32768Hz, MCLK = SMCLK = 8MHz
  UCSCTL5 = DIVPA_0 + DIVA_0 + DIVM_0 + DIVS_0;

  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
  UCSCTL2 = FLLD_1 + 243;                   // Set DCO Multiplier for 8MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (243 + 1) * 32768 = 8MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop
  // Loop until XT1,XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }
  while (SFRIFG1&OFIFG);                    // Test oscillator fault flag
  
}

//KS0108
//==============================================================================
//检查忙标志位
void chk_busy (void)
{
  unsigned char lcd_status;
  P10OUT = 0XFF;
  P10DIR= 0x00;//设为输入口
      
  KS0108_RS_L;
  KS0108_RW_H;
  
  do
  {
    KS0108_EN_H;
    delay1(10);
    KS0108_EN_L;
    lcd_status = P10IN;
    //delay1(10);
    //KS0108_EN_L;
  }
  while((lcd_status&0x80)!=0);
  P10DIR= 0xFF;
}
//==============================================================================
//写命令
void Write_command(unsigned char command)
{
  chk_busy ();
  KS0108_RS_L;
  KS0108_RW_L;
  P10DIR|= 0xFF,  
  P10OUT = command;
  KS0108_EN_H;
  delay1(10);
  KS0108_EN_L;
}
//==============================================================================
//写数据
void Write_data(unsigned char data)
{
  chk_busy ();
  KS0108_RS_H;
  KS0108_RW_L;
  P10DIR|= 0xFF,  
  P10OUT = data;
  KS0108_EN_H;
  delay1(10);
  KS0108_EN_L;
}
//==============================================================================
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
   line=(line&0x07);                       // 0<=line<=7
   line=(line|0xb8);                                 //1011 1xxx
   Write_command(line);
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
   column=(column&0x3f);                  // 0=<column<=63
   column=(column|0x40);                  //01xx xxxx
   Write_command(column);
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
   startline=(startline&0x3f);              //??0x3f
   startline=(startline|0xc0);                                  //1100 0000
   Write_command(startline);
}

void SetOnOff(unsigned char onoff)
{
   onoff=(0x3e | onoff); //0011 111x
   Write_command(onoff);
}
//==============================================================================
//清屏
void Lcd_clear(void)
{
  unsigned char j,k;
  
  SetLine(0);       
  SetColumn(0);
  for(k=0;k<8;k++)
  {
    SetLine(k);       //第K页
    delay1(1);
    for(j=0;j<64;j++)
    {
      Write_data(0x00);
      delay1(10);
    }
  }
}
//==============================================================================
//全屏显示
void AllScreen(void)
{
  unsigned char j,k;
  
  SetLine(0);       
  SetColumn(0);
  for(k=0;k<8;k++)
  {
    SetLine(k);       //第K页
    delay1(1);
    for(j=0;j<64;j++)
    {
      Write_data(0xff);
      delay1(10);
    }
  }
  Write_command(0x3f);
}
//==============================================================================
//初始化
void init_ks0108(void)
{
  KS0108_CS1_L;
  KS0108_CS2_L;
  
  KS0108_RET_L;
  delay(1000);
  KS0108_RET_H;

  Write_command(0x3e);
  delay1(1000);
           SetLine(0x00);                   // 设定页
        delay1(100);
        SetStartLine(0x00);
        delay1(100);
        SetColumn(0x00);
        delay1(100);
  Write_command(0x3f);
  delay1(1000);
}
//==============================================================================
//液晶定位(8*8)
//液晶规划:
//x: 0 - 7        (行)
//y: 0 -15        (列)
void LCD_pos(unsigned char x, unsigned char y)
{
        if(y < 8)       
        {
         //左半屏
          KS0108_CS1_L;
          KS0108_CS2_H;
        }
        else
        {
          y -= 8;
          KS0108_CS1_H;
          KS0108_CS2_L;
        }                //右半屏
        Write_command(X_Page_Addr + x);                //页地址
        Write_command(Y_Col_Addr + (y * 8));//列地址
}

出0入0汤圆

发表于 2011-3-31 15:19:59 | 显示全部楼层
液晶是多少伏供电的

出0入0汤圆

 楼主| 发表于 2011-3-31 15:25:31 | 显示全部楼层
背面标签上贴的是3.3V

出0入0汤圆

发表于 2011-3-31 15:29:03 | 显示全部楼层
需要调节清晰度吗

出0入0汤圆

 楼主| 发表于 2011-3-31 15:30:01 | 显示全部楼层
这个无所谓,关键是现在什么都不显示啊

出0入0汤圆

 楼主| 发表于 2011-3-31 15:30:32 | 显示全部楼层
我不知道程序上是不是有问题?

出0入0汤圆

发表于 2011-3-31 15:31:28 | 显示全部楼层
液晶负压接了没?

出0入0汤圆

发表于 2011-3-31 15:32:35 | 显示全部楼层
你这个液晶好像需要调节外部电位器,来调节清晰度,要不然显示不出来的

出0入0汤圆

 楼主| 发表于 2011-3-31 15:33:02 | 显示全部楼层
接了一个电位器10K,VO大概-2.5V的样子

出0入0汤圆

发表于 2011-3-31 15:35:20 | 显示全部楼层
打开背光,好好调一下

出0入0汤圆

 楼主| 发表于 2011-3-31 15:35:48 | 显示全部楼层
OK了,我调到了-7V,谢谢了!

出0入0汤圆

 楼主| 发表于 2011-3-31 15:38:58 | 显示全部楼层
这个液晶VO调到-6.5V才有反应,郁闷啊,在程序上折腾了两天!

出0入0汤圆

 楼主| 发表于 2011-3-31 16:09:49 | 显示全部楼层
问题解决了,谢谢楼上的,圆满结贴!

出0入0汤圆

发表于 2011-3-31 16:55:42 | 显示全部楼层
哈哈,以后出问题还要慢慢来,先把最基本的问题弄清楚。

出0入0汤圆

发表于 2011-4-29 21:45:22 | 显示全部楼层
皆大欢喜!

出0入0汤圆

发表于 2011-5-20 10:36:14 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-12-29 17:52:37 | 显示全部楼层
马克…

出0入0汤圆

发表于 2013-11-5 12:50:45 | 显示全部楼层
谢谢,我也正在用430驱动呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 00:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表