智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8886|回复: 13
打印 上一主题 下一主题

[软件类] 求xs128的1602液晶显示程序

  [复制链接]

9

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
威望
197
贡献
50
兑换币
0
注册时间
2010-11-22
在线时间
12 小时
跳转到指定楼层
1#
发表于 2010-11-22 18:17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
求xs128板的1602液晶显示程序

24

主题

128

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3525

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

QQ
威望
805
贡献
2486
兑换币
0
注册时间
2010-11-16
在线时间
117 小时
2#
发表于 2010-11-23 16:25:36 | 只看该作者
以下程序用1602液晶显示abc 三个字符,程序经过实际验证,保证了正确性.
子程序LCDcom()用于向液晶LCD写命令
子程序LCDtata()用于LCD写数据
我们只要在主程序中调用这两个程序就可以
#include
#define LCDEN P2_2
#define LCDRS P2_0
void Delay(int t)
{
while(t--);
}
void LCDcom(unsigned char com) //发送指令给LCD
{
LCDRS=0; //写指令
P1=com;
Delay(4000);
LCDEN=1;
Delay(4000);
LCDEN=0;
}
void LCDtata(unsigned char tata)//发送数据给LCD
{
LCDRS=1; //写数据
P1=tata; //写
Delay(4000);
LCDEN=1;
Delay(4000);
LCDEN=0;
}
void LCDinit() //初始化LCD
{

LCDcom(0x38); //初始化LCD
LCDcom(0x0c); //初始化光标
LCDcom(0x01); //初始化LCD

}

int main(void)
{
Delay(4000);
LCDinit();
Delay(1000);
LCDcom(0x80); //数据指针初始化
LCDtata('a');
LCDtata('b');
LCDtata('c');
  
while(1);

}
回复

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
3#
发表于 2010-11-24 15:34:20 | 只看该作者
很好!
回复

使用道具 举报

1

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
633
威望
333
贡献
104
兑换币
12
注册时间
2011-1-10
在线时间
98 小时
4#
发表于 2011-3-12 20:00:11 | 只看该作者
回复 3# chiusir
能不能帮我看下这个程序为什么不能在LCD1602上显示出字符f
  1. #include <hidef.h>      /* common defines and macros */
  2. #include "derivative.h"      /* derivative-specific definitions */
  3. #define LCD1602_RS PORTB_PB0
  4. #define LCD1602_RW PORTB_PB1
  5. #define LCD1602_EN PORTB_PB2
  6. #define LCDIO PORTA
  7. #define LCDIO_DIR DDRA
  8. #define LCDIO_DIR_IN 0x00
  9. #define LCDIO_DIR_OUT 0xFF
  10. void SetBusCLK_16M(void)
  11. {   
  12.     CLKSEL=0X00;                                // disengage PLL to system
  13.     PLLCTL_PLLON=1;                        // turn on PLL
  14.     SYNR=0x00 | 0x01;         // VCOFRQ[7:6];SYNDIV[5:0]
  15.                         // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
  16.                         // fPLL= fVCO/(2 × POSTDIV)
  17.                         // fBUS= fPLL/2
  18.                         // VCOCLK Frequency Ranges  VCOFRQ[7:6]
  19.                         // 32MHz <= fVCO <= 48MHz    00
  20.                         // 48MHz <  fVCO <= 80MHz    01
  21.                         // Reserved                  10
  22.                         // 80MHz <  fVCO <= 120MHz   11                               
  23.     REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]
  24.                         // fREF=fOSC/(REFDIV + 1)
  25.                         // REFCLK Frequency Ranges  REFFRQ[7:6]
  26.                         // 1MHz <= fREF <=  2MHz       00
  27.                         // 2MHz <  fREF <=  6MHz       01
  28.                         // 6MHz <  fREF <= 12MHz       10
  29.                         // fREF >  12MHz               11                        
  30.                         // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
  31.     POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)
  32.                         // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
  33.     _asm(nop);          // BUS CLOCK=16M
  34.     _asm(nop);
  35.     while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
  36.     CLKSEL_PLLSEL =1;                        //engage PLL to system;
  37.    
  38.    
  39. }     
  40. void write_cmd(unsigned char cmd,unsigned BusyC) {
  41.   if (BusyC) ReadStatus(); //Test it busy or not
  42.         LCDIO=cmd;
  43.         LCD1602_RS=1;
  44.         LCD1602_RW=0;
  45.         LCD1602_EN=0;
  46.         LCD1602_EN=0;
  47.         LCD1602_EN=1;
  48. }
  49. void write_data(uchar dat,unsigned BusyC) {
  50.   if (BusyC) ReadStatus(); //Test it busy or not
  51.         LCDIO=dat;
  52.         LCD1602_RS=1;
  53.         LCD1602_RW=0;
  54.         LCD1602_EN=0;
  55.         LCD1602_EN=0;
  56.         LCD1602_EN=1;
  57. }
  58. int ReadStatus(void)
  59. {
  60.   uchar cRtn;
  61.         LCDIO_DIR = LCDIO_DIR_IN;
  62.         LCD1602_RS = 0;
  63.         LCD1602_RW = 1;
  64.         LCD1602_EN = 0;
  65.         LCD1602_EN = 0;
  66.         LCD1602_EN = 1;
  67.         while (LCDIO&0x80); //Test Busy State
  68.         cRtn = LCDIO_DIR;     // if Not save the port value, it should be change
  69.         LCDIO_DIR = LCDIO_DIR_OUT;
  70.         return(cRtn);
  71. }

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





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


  94.         EnableInterrupts;


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

使用道具 举报

5

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
QQ
威望
339
贡献
126
兑换币
0
注册时间
2011-1-1
在线时间
9 小时
5#
发表于 2011-3-13 16:00:57 | 只看该作者
。。。。。。
回复

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
6#
发表于 2011-3-14 23:09:39 | 只看该作者
回复 4# ngngabc


    你可以在本论坛下载我提供的完成程序!
回复

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
7#
发表于 2011-3-14 23:14:16 | 只看该作者
回复

使用道具 举报

16

主题

352

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2535

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

QQ
威望
888
贡献
1261
兑换币
10
注册时间
2011-8-31
在线时间
193 小时
8#
发表于 2011-10-6 19:04:16 | 只看该作者
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
void PLL_Init(void)   //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{                     //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
  REFDV=1;            //总线时钟=48/2=24MHz
  SYNR=2;
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;        //选定锁相环时钟
}
# define  LCD_DB   PORTB
# define  LCD_RS   PORTE_PE0
# define  LCD_RW   PORTE_PE1
# define  LCD_E    PORTE_PE2
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
void delay_n40us(uint n);//延时函数
//********************************
//*******初始化函数***************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n40us(100);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
//********写数据函数*************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);
}
//********************************
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
         address=0x80+x;
else
         address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//********************************
/*******检查忙函数*************
void LCD_check_busy()      //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{                                          //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do                                       //用了延时的方法,延时还是非常好用的。我试了一下,用
        { LCD_E=0;                   //for循环作延时,普通指令只要1次循就可完成。清屏指令
          LCD_RS=0;                 //要用200次循环便能完成。   
          LCD_RW=1;
          LCD_DB=0xff;
          LCD_E=1;
        }while(LCD_DB^7==1);

******************************/
//********延时函数***************
void delay_n40us(uint n)
{ uint i;
      uchar j;            
        for(i=n;i>0;i--)
           for(j=0;j<2;j++);          //在这个延时循环函数中我只做了2次循环,
}                                         //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
//*******************************
//*********主函数*****************
void port_init() {
  DDRB=0XFF;
  DDRE=0XFF;
  PORTB=0XFF;
}


void main(void) {
   PLL_Init();
  port_init();
  LCD_init();

  for(;;) {
    _FEED_COP(); /* feeds the dog */
     LCD_disp_char(0,2,'a');
  } /* loop forever */
  /* please make sure that you never leave main */
}
回复

使用道具 举报

11

主题

390

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1698
QQ
威望
835
贡献
433
兑换币
324
注册时间
2011-8-20
在线时间
215 小时
9#
发表于 2011-10-11 21:04:28 | 只看该作者
zhe  bu cuo
回复

使用道具 举报

2

主题

52

帖子

0

精华

高级会员

Rank: 4

积分
638
威望
400
贡献
86
兑换币
4
注册时间
2011-8-29
在线时间
76 小时
10#
发表于 2012-3-21 19:06:14 | 只看该作者
tongyonghua123 发表于 2011-10-6 19:04
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-specific  ...

请问你这是用在9x128上的程序吗,你当初用这个的时候可以用吗??
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 01:18 , Processed in 0.063057 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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