下面表格是16*2LCD液晶與單片機的硬件接法:
//04:lcd_init()//LCD初始化函數(shù)
//05:lcd_DICtate(byte)//寫指令的函數(shù)
//07:lcd_gotoxy(x,y)//列行定位函數(shù)
//06:lcd_putchar(byte)//以ASCII方式顯示一個字節(jié)變量
//08:lcd_hex(byte)//以十六進制顯示一個字節(jié)變量
//09:lcd_byte(byte)//以十進制顯示一個字節(jié)變量
//10:lcd_putsf(地址,個數(shù))//顯示FLASH里面的字符串
#include
#include
#include <1602lcd.h>
unsigned char byte;
unsigned char flash string[]="M8V20";
void main(void)
{
lcd_init(); //1602LCD初始化函數(shù)
lcd_dICtate(1); //LCD清屏指令是(1)
while (1)
{
byte++;
lcd_gotoxy(4,0); //光標(biāo)定位到第4列第0行
lcd_byte(byte); //以十進制的方式顯示鍵值(字節(jié)形)
lcd_putchar('='); //顯示 = 字符
lcd_putchar(48); //顯示數(shù)字0 ,數(shù)字0的ASCII值是48
lcd_putchar('x'); //顯示 x 字符
lcd_hex(byte); //以十六進制的方式顯示鍵值(字節(jié)型)
lcd_gotoxy(2,1); //定位到第2列第1行
lcd_putsf(string,5); //顯示FLASH里面的字符串
lcd_putsf("-AVRDIY",7); //顯示FLASH里面的字符串
delay_ms(500);
}
}
/*下面是<1602LCD.h>文件內(nèi)容
在使用LCD之前先了解一下4位數(shù)據(jù)線傳輸?shù)脑?br/>1:LCD在E由 1->0 時對RS和DB4-DB7進行取樣和執(zhí)行操作
2:RS=0 時表示"準(zhǔn)備"寫指令,RS=1 時表示"準(zhǔn)備"寫顯示的數(shù)據(jù)
3:不管是指令數(shù)據(jù)還是顯示數(shù)據(jù),數(shù)據(jù)位都是8位,由于LCD用的是4個數(shù)據(jù)線,所以在傳輸時先傳輸數(shù)據(jù)的高4位(Msb),然后再傳輸數(shù)據(jù)的低4位(Lsb)
比如說我們要寫一個指令,指令是0b11001000 ( 高4位是1100,低4位是1000 )
那么就要這樣:
先傳輸高4位 | 接著傳輸?shù)?位
E=1 ; | E=1 ;
RS=0 ; | RS=0 ;
DB7=1; | DB7=1;
DB6=1; | DB6=0;
DB5=0; | DB5=0;
DB4=0; | DB4=0;
E=0; | E=0;
這樣,我們就完成了寫一個指令了,相反,寫顯示數(shù)據(jù)時就是把RS=1就可以了
對LCD的寫操作只有寫指令和寫顯示數(shù)據(jù)兩種,所以,一個"寫指令函數(shù)"和一個"寫顯示數(shù)據(jù)函數(shù)"就可以滿足全部要求
*/
#ifndef _1602lcd_INCLUDED_ //如果原來沒有宏定義本名字就...
#define _1602lcd_INCLUDED_ //定義一下,防止多次被頭文件包含
#include
#define RS PORTB.4 //請修改LCD與 單片機 的連接IO口
#define RS_DDRn DDRB.4
#define RW PORTB.5
#define RW_DDRn DDRB.5
#define E PORTB.2
#define E_DDRn DDRB.2
#define DB4 PORTC.4
#define DB4_DDRn DDRC.4
#define DB5 PORTC.5
#define DB5_DDRn DDRC.5
#define DB6 PORTC.6
#define DB6_DDRn DDRC.6
#define DB7 PORTC.7
#define DB7_DDRn DDRC.7
#define DB7_PINn PINC.7
//======================================================================================
//寫LCD
//datas是數(shù)據(jù),高4位有效,rs決定datas是顯示還是指令,read_lcd決定是否需要讀取忙標(biāo)志BF
void lcd_h(unsigned char datas,unsigned char rs,unsigned char read_lcd)
{
RS_DDRn =1; //RS/RW/E設(shè)置為輸出
RW_DDRn =1;
E_DDRn =1;
if(read_lcd) //如果需要讀LCD忙標(biāo)志就...
{
DB4_DDRn=0; //先把4個數(shù)據(jù)口設(shè)置為輸入
DB5_DDRn=0;
DB6_DDRn=0;
DB7_DDRn=0;
RS=0;
RW=1; //讀BF
E=1;
E=1; //相同的操作相當(dāng)于等待幾個時鐘周期
E=1;
while(DB7_PINn); //等待,直到DB7=0
}
RS=rs; //寫指令或者數(shù)據(jù)
RW=0; //寫
DB4_DDRn=1;
DB5_DDRn=1;
DB6_DDRn=1;
DB7_DDRn=1;
E=1;
if(datas&128) DB7=1; else DB7=0;
if(datas&64) DB6=1; else DB6=0;
if(datas&32) DB5=1; else DB5=0;
if(datas&16) DB4=1; else DB4=0;
E=0; //LCD在E下降沿時對RS與DB4-DB7進行取樣
}
//==================================================================================
void lcd_dictate(unsigned char data) //寫指令函數(shù)
{
lcd_h(data,0,1); //輸出高4位
lcd_h(data*16,0,1); //輸出低4位
}
//===================================================================================
void lcd_putchar(unsigned char data) //寫顯示函數(shù)
{
lcd_h(data,1,1); //輸出高4位
lcd_h(data*16,1,1); //輸出低4位
}
//====================================================================================
//初始化函數(shù)
void lcd_init(void)
{
delay_ms(20);
lcd_h(48,0,0); delay_ms(6); //這3條是初始化語句
lcd_h(48,0,0); delay_ms(5);
lcd_h(48,0,0);
lcd_h(32,0,1); //使能4位數(shù)據(jù)線
lcd_dictate(40); //顯示參數(shù)設(shè)定
lcd_dictate(12); //顯示參數(shù)設(shè)定
}
//======================================================================================
//列/行定位函數(shù),最開頭的地址是0列0行
void lcd_gotoxy(unsigned char x, unsigned char y) //列/行定位函數(shù)
{
if(x<=19 && y<=3) //防止輸入的數(shù)據(jù)不正確
{
if(y==0) lcd_dictate(x+128); //第0行的地址是從128開始
if(y==1) lcd_dictate(x+192); //第1行......
if(y==2) lcd_dictate(x+148);
if(y==3) lcd_dictate(x+212);
}
}
//=====================================================================================
void lcd_hex(unsigned char byte_data) //以十六進制顯示一個字節(jié)變量
{
unsigned char data;
data=byte_data>>4; //求高4位
if(data<10) data+=48; else data+=55; //轉(zhuǎn)化為ASCII值
lcd_putchar(data); //顯示
data=byte_data&15; //求低4位
if(data<10) data+=48; else data+=55; //轉(zhuǎn)化為ASCII值
lcd_putchar(data); //顯示
}
//=====================================================================================
void lcd_byte(unsigned char byte_data) //以十進制顯示一個字節(jié)變量
{
unsigned char data;
data=byte_data/100; //求百位數(shù)
lcd_putchar(data+48); //轉(zhuǎn)化為ASCII值再顯示
data=byte_data/10%10; //求十位數(shù)
lcd_putchar(data+48); //轉(zhuǎn)化為ASCII值再顯示
data=byte_data%10; //求個位數(shù)
lcd_putchar(data+48); //轉(zhuǎn)化為ASCII再再顯示
}
//=====================================================================================
void lcd_putsf(flash unsigned char *string , unsigned char n) //顯示FLASH里面的字符串
{
unsigned char i=0;
while(i
lcd_putchar( string[ i ] ) ; //順序顯示字符
i++;
}
}
//=====================================================================================
#endif//