智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1150|回复: 0
打印 上一主题 下一主题

zbh

[复制链接]

1

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
威望
272
贡献
62
兑换币
2
注册时间
2011-11-23
在线时间
20 小时
跳转到指定楼层
1#
发表于 2011-11-23 21:48:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>      /* common defines and macros */

试过很多程序,包括别人实验过的程序,LCD都显示不了东西,这是为什么





#include "derivative.h"      /* derivative-specific definitions */

#define LCD1602_RS PORTB_PB0

#define LCD1602_RW PORTB_PB1

#define LCD1602_EN PORTB_PB2

#define LCDIO PORTA

#define LCDIO_DIR DDRA

#define LCDIO_DIR_IN 0x00

#define LCDIO_DIR_OUT 0xFF

void SetBusCLK_16M(void)

{   

    CLKSEL=0X00;                                // disengage PLL to system

    PLLCTL_PLLON=1;                        // turn on PLL

    SYNR=0x00 | 0x01;         // VCOFRQ[7:6];SYNDIV[5:0]

                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)

                        // fPLL= fVCO/(2 × POSTDIV)

                        // fBUS= fPLL/2

                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]

                        // 32MHz <= fVCO <= 48MHz    00

                        // 48MHz <  fVCO <= 80MHz    01

                        // Reserved                  10

                        // 80MHz <  fVCO <= 120MHz   11                                

    REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]

                        // fREF=fOSC/(REFDIV + 1)

                        // REFCLK Frequency Ranges  REFFRQ[7:6]

                        // 1MHz <= fREF <=  2MHz       00

                        // 2MHz <  fREF <=  6MHz       01

                        // 6MHz <  fREF <= 12MHz       10

                        // fREF >  12MHz               11                        

                        // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;

    POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)

                        // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).

    _asm(nop);          // BUS CLOCK=16M

    _asm(nop);

    while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;

    CLKSEL_PLLSEL =1;                        //engage PLL to system;

   

   

}     

void write_cmd(unsigned char cmd,unsigned BusyC) {

  if (BusyC) ReadStatus(); //Test it busy or not

        LCDIO=cmd;

        LCD1602_RS=1;

        LCD1602_RW=0;

        LCD1602_EN=0;

        LCD1602_EN=0;

        LCD1602_EN=1;

}

void write_data(uchar dat,unsigned BusyC) {

  if (BusyC) ReadStatus(); //Test it busy or not

        LCDIO=dat;

        LCD1602_RS=1;

        LCD1602_RW=0;

        LCD1602_EN=0;

        LCD1602_EN=0;

        LCD1602_EN=1;

}

int ReadStatus(void)

{

  uchar cRtn;

        LCDIO_DIR = LCDIO_DIR_IN;

        LCD1602_RS = 0;

        LCD1602_RW = 1;

        LCD1602_EN = 0;

        LCD1602_EN = 0;

        LCD1602_EN = 1;

        while (LCDIO&0x80); //Test Busy State

        cRtn = LCDIO_DIR;     // if Not save the port value, it should be change

        LCDIO_DIR = LCDIO_DIR_OUT;

        return(cRtn);

}



void LcdDelay(){

  int i, j;

  for (i = 0; i < 300; i++)

    for(j = 0; j < 3000; j++);

}

void lcd_init() {

  DDRA = 0xff;

  DDRB = 0xff;

  LCDIO_DIR = LCDIO_DIR_OUT;

        LcdDelay();

        write_cmd(0x01,0);          //clear screen

        write_cmd(0x38,1);    //set 8 bit data transmission mode

        write_cmd(0x06,1);   // cursor right, disable moving

        write_cmd(0x0f,1); //open display (enable lcd display)

        write_cmd(0x80,1);   //set lcd first display address

        write_cmd(0x01,1);          //clear screen

  

}











void main(void) {

  /* put your own code here */

   SetBusCLK_16M();

   lcd_init();





        EnableInterrupts;





  for(;;) {

  write_data('f',1);

  DDRE_DDRE5=1;

  PORTE_PE5=0;

    _FEED_COP(); /* feeds the dog */

} /* loop forever */

  /* please make sure t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 17:47 , Processed in 0.045344 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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