智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3238|回复: 6
打印 上一主题 下一主题

xs128显示LCD1602的问题

[复制链接]

1

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
633
威望
333
贡献
104
兑换币
12
注册时间
2011-1-10
在线时间
98 小时
跳转到指定楼层
1#
发表于 2011-3-12 20:12:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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. }
复制代码

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27953

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10635
贡献
10966
兑换币
4566
注册时间
2010-11-23
在线时间
3176 小时
2#
发表于 2011-3-12 21:07:32 | 只看该作者
写操作要加延时。不同的1602延时还不一样。多试试。控制方式一般都一样。
回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
633
威望
333
贡献
104
兑换币
12
注册时间
2011-1-10
在线时间
98 小时
3#
 楼主| 发表于 2011-3-16 18:31:05 | 只看该作者
回复 2# turf456


    不是用了忙检测就不用延时吗,要是延时的话怎样根据1602来确定延时呢?
回复 支持 反对

使用道具 举报

16

主题

352

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2535

优秀会员奖章活跃会员奖章

QQ
威望
888
贡献
1261
兑换币
10
注册时间
2011-8-31
在线时间
193 小时
4#
发表于 2011-10-6 19:16:43 | 只看该作者
求二楼解释
回复 支持 反对

使用道具 举报

7

主题

125

帖子

0

精华

等待验证会员

积分
417

活跃会员奖章优秀会员奖章论坛元老奖章

威望
23
贡献
18
兑换币
18
注册时间
2011-9-30
在线时间
188 小时
5#
发表于 2011-10-6 19:28:51 | 只看该作者
不同的总线时钟 延时不一样
回复 支持 反对

使用道具 举报

4

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2547
威望
1184
贡献
653
兑换币
330
注册时间
2011-9-30
在线时间
355 小时
6#
发表于 2011-10-24 21:16:31 | 只看该作者
使能不是应该是上升沿的啊?我也是新手,望请教。
回复 支持 反对

使用道具 举报

1

主题

206

帖子

0

精华

高级会员

Rank: 4

积分
610
QQ
威望
348
贡献
196
兑换币
0
注册时间
2011-10-5
在线时间
33 小时
7#
发表于 2011-11-12 20:57:08 | 只看该作者
xs
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 11:26 , Processed in 0.122051 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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