智能车制作

标题: 求xs128的1602液晶显示程序 [打印本页]

作者: tingting    时间: 2010-11-22 18:17
标题: 求xs128的1602液晶显示程序
求xs128板的1602液晶显示程序
作者: 艾玛    时间: 2010-11-23 16:25
以下程序用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);

}
作者: chiusir    时间: 2010-11-24 15:34
很好!
作者: ngngabc    时间: 2011-3-12 20:00
回复 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. }
复制代码

作者: 李浩    时间: 2011-3-13 16:00
。。。。。。
作者: chiusir    时间: 2011-3-14 23:09
回复 4# ngngabc


    你可以在本论坛下载我提供的完成程序!
作者: chiusir    时间: 2011-3-14 23:14
http://www.znczz.com/thread-20039-1-5.html
作者: tongyonghua123    时间: 2011-10-6 19:04
#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 */
}
作者: 理工小别    时间: 2011-10-11 21:04
zhe  bu cuo
作者: csycaiyan    时间: 2012-3-21 19:06
tongyonghua123 发表于 2011-10-6 19:04
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-specific  ...

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

作者: tongyonghua123    时间: 2012-3-22 11:09
嗯嗯  是啊
作者: tongyonghua123    时间: 2012-3-22 11:09
我以前试过了  可以用的
作者: ★奔/1孓亥★    时间: 2014-6-29 19:47
学习,,
作者: hldeg    时间: 2014-7-2 22:15
谢啦,太及时了




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