久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

基于atmega的LCD1602驅動(8線/4線)

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年10月17日   【字體:
//*************************************************
// 文件名: 1602.h
// 作用:    AVR的LCD1602 4/8線驅動
// 作者:    seabisuit
// 最新修改: 2011年6月22日
// 說明:   使用GCC編程,1602提供4/8線驅動
//     4線暫時高4位
//*************************************************/
#ifndef __1602_H_
#define __1602_H_ 1
//***頭文件調用***//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/portpins.h>
#include <compat/deprecated.h>

//***定義uchar***//
#ifndef uchar
#define uchar unsigned char
#endif

//***本頭文件增強功能設置***//
#define _LCD_DEF    0 //使自定義功能實現,如不需要將其定義為0(#define _LCD_DEF 0)
#define _LCD_BIT_IS_8 1 //定義4線或者8線

/*控制針腳設置*/
#define LCD_CZ PORTB
#define LCD_CZDDR DDRB 
#define LCD_E 2
#define LCD_RW 1
#define LCD_RS 0
#define LCDDATA PORTE
#define LCDDDR DDRE
#define LCDPIN PINE
#define busy 7

/*LCD命令定義*/
#define E0()   cbi(LCD_CZ,LCD_E)
#define E1()   sbi(LCD_CZ,LCD_E)
#define RW0()    cbi(LCD_CZ,LCD_RW)
#define RW1()    sbi(LCD_CZ,LCD_RW)
#define RS0()    cbi(LCD_CZ,LCD_RS)
#define RS1()    sbi(LCD_CZ,LCD_RS)
#define nop()    asm("nop")



/*基本功能函數聲明。*/
void lcd_busy(void);//測試LCD忙碌狀態
void lcd_wrcmd(uchar CMD,uchar wait);//LCD寫入指令
void lcd_wrdata(uchar);//LCD寫入數據
void lcd_xy(uchar,uchar);//lcd顯示定位
void lcd_char(uchar,uchar,uchar);//lcd顯示字符
void lcd_string(uchar,uchar,uchar *);//lcd顯示字符串
void lcd_cls(void);//1602清顯示
void lcd_init(void); //LCD初始化設定程序
void lcd_def(void);//自定義字符串


/********************************************************/
/* 函數:void lcd_busy(void)                            */
/* 功能:檢查LCD忙狀態                                  */
/*busy為1時,忙,等待。busy為0時,閑,可寫指令與數據     */
/*                                                      */
/********************************************************/ 
void lcd_busy(void)
{
   #if (_LCD_BIT_IS_8==1) //8位數據線

uchar tmp;

LCDDDR&=~1<<7;//設置為輸入
E0();RS0();RW1();

/*循環讀取忙位*/
do{ 
   E1();_delay_us(1);
   tmp=LCDPIN;
   E0();
}
while(tmp&1<<busy);
LCDDDR=0xff;

#else    //4位數據線

uchar tmp;
LCDDDR=0;
E0();RS0();RW1();
/*循環讀取忙位*/
do{
E1();_delay_us(1);
tmp=LCDPIN;
E0();_delay_us(1);
E1();_delay_us(1);

E0();_delay_us(6);
}
while(tmp&1<<busy);

LCDDDR=0xff;

#endif

}
/********************************************************/
/* 函數:lcd_wrcmd(uchar CMD,uchar wait)                */
/* 功能:寫入命令到LCD                                  */
/*RS=0,RW=0,E=高脈沖,D0-D7=指令碼。                  */
/*CMD為指令,wait指定是否要檢測LCD忙信號                */
/*                                                      */
/********************************************************/
void lcd_wrcmd(uchar CMD,uchar wait)
{   
   #if (_LCD_BIT_IS_8==1) //8位數據線

if (wait) //是否讀忙
lcd_busy();
//else 
//_delay_us(40);
    RS0();RW0();
    LCDDATA=CMD;    
    E1();E0();

#else    //4位數據線

if (wait) 
lcd_busy();
else 
_delay_us(40);
    RS0();RW0();E0();     
    
    LCDDATA=CMD&0xf0;
    E1();_delay_us(1);E0();_delay_us(6);
LCDDATA=(CMD<<4)&0xf0;
E1();_delay_us(1);E0();
#endif
}
/********************************************************/
/* 函數:void lcd_wrdate(uchar);                        */
/* 功能:寫入數據到LCD                                  */
/*RS=1,RW=0,E=高脈沖,D0-D7=指令碼。                  */
/*dat為要寫入的數據                                     */
/*                                                      */
/********************************************************/
void lcd_wrdata(uchar dat)      //寫數據
{ 
   #if (_LCD_BIT_IS_8==1) //8位數據線

lcd_busy();
    RW0();RS1();      
LCDDATA=dat;
    E1();E0();

#else    //4位數據線
lcd_busy();
    RW0();RS1();      

    LCDDATA=dat&0xf0;
    E1();_delay_us(1);E0();_delay_us(6);


    LCDDATA=(dat<<4)&0xf0;
E1();_delay_us(1);E0();
#endif
    
}
/********************************************************/
/* 函數:lcd_xy(uchar x,uchar y)                        */
/* 功能:lcd顯示定位                                    */
/*                                                      */
/********************************************************/
void lcd_xy(uchar x,uchar y)
{ 
uchar add;
if(y==0) 
add=0x80+0x00+x;
    else
    add=0x80+0x40+x;
    lcd_wrcmd(add,1);
}

/********************************************************/
/* 函數:void lcd_char(uchar x,uchar y,uchar dat)       */
/* 功能:lcd于(x,y)處顯示字符                        */
/*                                                      */
/********************************************************/
void lcd_char(uchar x,uchar y,uchar dat) 
{   
    lcd_xy(x,y);
    lcd_wrdata(dat);
}           
/********************************************************/
/* 函數:void lcd_string(uchar x,uchar y,uchar *s)      */
/* 功能:lcd于(x,y)處開始顯示字符串                  */
/*                                                      */
/********************************************************/
void lcd_string(uchar x,uchar y,uchar *s)
{ 
lcd_xy(x,y);
while(*s) 
    {
   lcd_wrdata(*s);
        s++;
    }
}
/********************************************************/
/* 函數:void lcd_cls(void)                             */
/* 功能:對1602顯示屏清除,并進行延時                   */
/* 延時是為了使1602又時間進行清除                       */
/*                                                      */
/********************************************************/
void lcd_cls(void)
{ 
lcd_wrcmd(0x01,1);
_delay_ms(10);
}
/********************************************************/
/* 函數:void LcdReset(void);                           */
/* 功能:對1602進行復位                                 */
/*                                                      */
/********************************************************/
void lcd_init(void)     
{   
   #if (_LCD_BIT_IS_8==1) //8位數據線
   
LCD_CZDDR=1<<LCD_E|1<<LCD_RS|1<<LCD_RW;
LCDDDR=0xff;
_delay_ms(15);
lcd_wrcmd(0x38,0);    
_delay_ms(5);
lcd_wrcmd(0x38,0);    
_delay_ms(5);
lcd_wrcmd(0x38,0); 
_delay_us(1);
lcd_wrcmd(0x38,1);
lcd_wrcmd(0x08,1);
lcd_cls();

    lcd_wrcmd(0x06,1); 
    lcd_wrcmd(0x0e,1);

#else    //4位數據線
LCD_CZDDR=1<<LCD_E|1<<LCD_RS|1<<LCD_RW;
LCDDDR=0xf0;
_delay_ms(15);
lcd_wrcmd(0x38,0);    
_delay_ms(5);
lcd_wrcmd(0x38,0);    
_delay_ms(5);
lcd_wrcmd(0x38,0); 
_delay_us(1);
lcd_wrcmd(0x38,1);
lcd_wrcmd(0x02,1);
lcd_wrcmd(0x28,1);
lcd_cls();
lcd_wrcmd(0x06,1); 
    lcd_wrcmd(0x0e,1);


#endif

    
}


#if (_LCD_DEF==1)
//定義CGRAM的值,在功能開啟后再主文件加入如下面字符串數組定義
const uchar lcd_cgram[64]=
{
0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00
};

void lcd_def(uchar cg[64])
{
    uchar temp=0;
    lcd_wrcmd(0x40,1);
    while(temp<64)
    {
      lcd_wrdata(cg[temp]);
      temp++;
    }
}
#endif

#endif /*__1602_H_*/

 

關閉窗口

相關文章

主站蜘蛛池模板: 欧美一级网站 | 色婷婷在线视频 | 综合久久久 | 国产成人精品一区二区 | 国产成人精品一区二区 | 日日骚av| 亚洲精品 在线播放 | 女人一区 | 国产一区二区三区在线看 | 成人精品免费视频 | 国产精品综合久久 | 日本国产精品视频 | 韩日一区二区 | 特级毛片爽www免费版 | 日本亚洲欧美 | 国产丝袜av | 日本粉嫩一区二区三区视频 | 欧美 日韩精品 | 超碰网址 | 亚洲综合中文字幕在线观看 | 欧美精品一区二区在线观看 | 看真人视频一级毛片 | 鸡毛片| 国产一区二区三区不卡av | 在线中文字幕第一页 | 999免费观看视频 | 日韩精品在线一区 | 中国一级大黄大片 | 亚洲一区二区三区在线 | 精品亚洲一区二区三区 | 国产激情精品视频 | 国产精品成人一区二区 | 91久久夜色 | 成人一区二区在线 | 成人在线不卡 | 亚洲视频一区在线观看 | 午夜电影网 | 91视频一区二区三区 | 青青草视频免费观看 | 欧美性jizz18性欧美 | 黄免费观看视频 |