智能车制作

标题: xs128显示LCD1602的问题 [打印本页]

作者: ngngabc    时间: 2011-3-12 20:12
标题: xs128显示LCD1602的问题
  1. #include <hidef.h>      /* common defines and macros */
  2. 试过很多程序,包括别人实验过的程序,LCD都显示不了东西,这是为什么


  3. #include "derivative.h"      /* derivative-specific definitions */
  4. #define LCD1602_RS PORTB_PB0
  5. #define LCD1602_RW PORTB_PB1
  6. #define LCD1602_EN PORTB_PB2
  7. #define LCDIO PORTA
  8. #define LCDIO_DIR DDRA
  9. #define LCDIO_DIR_IN 0x00
  10. #define LCDIO_DIR_OUT 0xFF
  11. void SetBusCLK_16M(void)
  12. {   
  13.     CLKSEL=0X00;                                // disengage PLL to system
  14.     PLLCTL_PLLON=1;                        // turn on PLL
  15.     SYNR=0x00 | 0x01;         // VCOFRQ[7:6];SYNDIV[5:0]
  16.                         // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
  17.                         // fPLL= fVCO/(2 × POSTDIV)
  18.                         // fBUS= fPLL/2
  19.                         // VCOCLK Frequency Ranges  VCOFRQ[7:6]
  20.                         // 32MHz <= fVCO <= 48MHz    00
  21.                         // 48MHz <  fVCO <= 80MHz    01
  22.                         // Reserved                  10
  23.                         // 80MHz <  fVCO <= 120MHz   11                               
  24.     REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]
  25.                         // fREF=fOSC/(REFDIV + 1)
  26.                         // REFCLK Frequency Ranges  REFFRQ[7:6]
  27.                         // 1MHz <= fREF <=  2MHz       00
  28.                         // 2MHz <  fREF <=  6MHz       01
  29.                         // 6MHz <  fREF <= 12MHz       10
  30.                         // fREF >  12MHz               11                        
  31.                         // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
  32.     POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)
  33.                         // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
  34.     _asm(nop);          // BUS CLOCK=16M
  35.     _asm(nop);
  36.     while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
  37.     CLKSEL_PLLSEL =1;                        //engage PLL to system;
  38.    
  39.    
  40. }     
  41. void write_cmd(unsigned char cmd,unsigned BusyC) {
  42.   if (BusyC) ReadStatus(); //Test it busy or not
  43.         LCDIO=cmd;
  44.         LCD1602_RS=1;
  45.         LCD1602_RW=0;
  46.         LCD1602_EN=0;
  47.         LCD1602_EN=0;
  48.         LCD1602_EN=1;
  49. }
  50. void write_data(uchar dat,unsigned BusyC) {
  51.   if (BusyC) ReadStatus(); //Test it busy or not
  52.         LCDIO=dat;
  53.         LCD1602_RS=1;
  54.         LCD1602_RW=0;
  55.         LCD1602_EN=0;
  56.         LCD1602_EN=0;
  57.         LCD1602_EN=1;
  58. }
  59. int ReadStatus(void)
  60. {
  61.   uchar cRtn;
  62.         LCDIO_DIR = LCDIO_DIR_IN;
  63.         LCD1602_RS = 0;
  64.         LCD1602_RW = 1;
  65.         LCD1602_EN = 0;
  66.         LCD1602_EN = 0;
  67.         LCD1602_EN = 1;
  68.         while (LCDIO&0x80); //Test Busy State
  69.         cRtn = LCDIO_DIR;     // if Not save the port value, it should be change
  70.         LCDIO_DIR = LCDIO_DIR_OUT;
  71.         return(cRtn);
  72. }

  73. void LcdDelay(){
  74.   int i, j;
  75.   for (i = 0; i < 300; i++)
  76.     for(j = 0; j < 3000; j++);
  77. }
  78. void lcd_init() {
  79.   DDRA = 0xff;
  80.   DDRB = 0xff;
  81.   LCDIO_DIR = LCDIO_DIR_OUT;
  82.         LcdDelay();
  83.         write_cmd(0x01,0);          //clear screen
  84.         write_cmd(0x38,1);    //set 8 bit data transmission mode
  85.         write_cmd(0x06,1);   // cursor right, disable moving
  86.         write_cmd(0x0f,1); //open display (enable lcd display)
  87.         write_cmd(0x80,1);   //set lcd first display address
  88.         write_cmd(0x01,1);          //clear screen
  89.   
  90. }





  91. void main(void) {
  92.   /* put your own code here */
  93.    SetBusCLK_16M();
  94.    lcd_init();


  95.         EnableInterrupts;


  96.   for(;;) {
  97.   write_data('f',1);
  98.   DDRE_DDRE5=1;
  99.   PORTE_PE5=0;
  100.     _FEED_COP(); /* feeds the dog */
  101. } /* loop forever */
  102.   /* please make sure that you never leave main */   
  103. }
复制代码

作者: turf456    时间: 2011-3-12 21:07
写操作要加延时。不同的1602延时还不一样。多试试。控制方式一般都一样。
作者: ngngabc    时间: 2011-3-16 18:31
回复 2# turf456


    不是用了忙检测就不用延时吗,要是延时的话怎样根据1602来确定延时呢?
作者: tongyonghua123    时间: 2011-10-6 19:16
求二楼解释
作者: 记忆将军    时间: 2011-10-6 19:28
不同的总线时钟 延时不一样
作者: XHM    时间: 2011-10-24 21:16
使能不是应该是上升沿的啊?我也是新手,望请教。
作者: 清明    时间: 2011-11-12 20:57
xs




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2