當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 入口參數(shù)說明://controlport//#defineSET_RSsbi(PORTB,5)//#defineCLR_RScbi(PORTB,5)//#defineOUT_RSsbi(DDRB,5)//#defineSET_RWsbi(PORTB,6)//#defineCLR_RWcbi(PORTB,6)//#defineOUT_RWsbi(DDRB,6)

入口參數(shù)說明:

//controlport
//#defineSET_RSsbi(PORTB,5)
//#defineCLR_RScbi(PORTB,5)

//#defineOUT_RSsbi(DDRB,5)

//#defineSET_RWsbi(PORTB,6)
//#defineCLR_RWcbi(PORTB,6)
//#defineOUT_RWsbi(DDRB,6)

//#defineSET_Esbi(PORTB,7)
//#defineCLR_Ecbi(PORTB,7)
//#defineOUT_Esbi(DDRB,7)

//dataport
//#defineSET_D4sbi(PORTD,4)
//#defineCLR_D4cbi(PORTD,4)
//#defineOUT_D4sbi(DDRD,4)

//#defineSET_D5sbi(PORTD,5)
//#defineCLR_D5cbi(PORTD,5)
//#defineOUT_D5sbi(DDRD,5)

//#defineSET_D6sbi(PORTD,6)
//#defineCLR_D6cbi(PORTD,6)
//#defineOUT_D6sbi(DDRD,6)

//#defineSET_D7sbi(PORTD,7)
//#defineCLR_D7cbi(PORTD,7)
//#defineOUT_D7sbi(DDRD,7)

//busyport
//#defineGET_BFgbi(PIND,7)
//#defineOUT_BFsbi(DDRD,7)
//#defineIN_BFcbi(DDRD,7)

----------------------------------------------------------------------
接口定義:
LCD1602ATmega16
1.GND--------GND
2.VCC--------VCC
3.V0--------V0
4.RS--------由外部程序定義
5.R/W--------由外部程序定義
6.E--------由外部程序定義
7.D0--------NC
8.D1--------NC
9.D2--------NC
10.D3--------NC
11.D4--------由外部程序定義
12.D5--------由外部程序定義
13.D6--------由外部程序定義
14.D7--------由外部程序定義
15.LED+--------VCC
16.LED---------GND

說明:
(1)使用ATmega16的7根IO口操作LCD1602
(2)該程序的優(yōu)點(diǎn)是:7根IO可任意定義,不需分布在固定的一組PORT口上
(3)該程序的缺點(diǎn)是:IO定義的寫法較為繁瑣
----------------------------------------------------------------------
待定參數(shù)說明:
//#defineDELAY(){_nop_();_nop_();_nop_();}

----------------------------------------------------------------------
對外變量說明:

----------------------------------------------------------------------
對外函數(shù)說明:

----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

#ifndefLCD1602_H
#defineLCD1602_H

#include"D:ICC_HCmmICC.H"

/*待定參數(shù)*/
#defineDELAY(){NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}

/*不考慮移植性的寫法*/
//uint8bdatabdat;
//sbitbdat0=bdat^0;
//sbitbdat1=bdat^1;
//sbitbdat2=bdat^2;
//sbitbdat3=bdat^3;
//sbitbdat4=bdat^4;
//sbitbdat5=bdat^5;
//sbitbdat6=bdat^6;
//sbitbdat7=bdat^7;
/*考慮移植性的寫法*/
uint8bdat;
#definebdat0(bdat&0x01)
#definebdat1(bdat&0x02)
#definebdat2(bdat&0x04)
#definebdat3(bdat&0x08)
#definebdat4(bdat&0x10)
#definebdat5(bdat&0x20)
#definebdat6(bdat&0x40)
#definebdat7(bdat&0x80)

#defineCGRAM00x00
#defineCGRAM10x01
#defineCGRAM20x02
#defineCGRAM30x03
#defineCGRAM40x04
#defineCGRAM50x05
#defineCGRAM60x06
#defineCGRAM70x07

#defineTRUE1
#defineFALSE0
boolLCD1602Err=FALSE;

/*--------------------------------------------------------------------
函數(shù)名稱:LCD1602讀讀讀讀讀忙~
函數(shù)功能:都說是讀讀讀讀讀忙咯~
注意事項(xiàng):對于高速CPU,應(yīng)加延時(shí),好像是廢話~
提示說明:無
輸入:
返回:無
--------------------------------------------------------------------*/
voidbusy(void)
{
uint16busyCounter=0;
boolbusySta;//用于探測lcdbusystatus
IN_BF;
SET_D4;
SET_D5;
SET_D6;
SET_D7;
DELAY();
CLR_RS;
DELAY();
SET_RW;
DELAY();

do
{
SET_E;
DELAY();
/*這里讀取AC4-AC6位及BF的值,程序不需記錄AC4-AC6的值,所以不存儲*/
busySta=(bool)GET_BF;
CLR_E;
DELAY();
/*讀取"BUSY"時(shí),"D4-D7"狀態(tài)可能已經(jīng)改變,必須再次設(shè)為輸出"1"*/
SET_D4;
SET_D5;
SET_D6;
SET_D7;
DELAY();
SET_E;
DELAY();
/*這里讀取AC0-AC3位的值,程序不需記錄AC0-AC3的值,所以不存儲*/
CLR_E;
DELAY();
if(busyCounter==1000)
{
LCD1602Err=TRUE;//標(biāo)識LCD1602錯(cuò)誤,方便上繳系統(tǒng)報(bào)錯(cuò)
return;//避免由于LCD1602錯(cuò)誤而導(dǎo)致程序阻塞
}
busyCounter++;
}
while(busySta);

LCD1602Err=FALSE;
CLR_E;
OUT_BF;
}
/*--------------------------------------------------------------------
函數(shù)名稱:LCD1602寫操作
函數(shù)功能:
注意事項(xiàng):對于高速CPU,應(yīng)加延時(shí),好像是廢話~
提示說明:無
輸入:
返回:無
--------------------------------------------------------------------*/
voidwrite(boolflag,uint8dat)//flag=0:command,flag=1:data
{
bdat=dat;
busy();
if(flag)
SET_RS;
else
CLR_RS;
DELAY();
CLR_RW;
DELAY();
if(bdat4)
SET_D4;
else
CLR_D4;
if(bdat5)
SET_D5;
else
CLR_D5;
if(bdat6)
SET_D6;
else
CLR_D6;
if(bdat7)
SET_D7;
else
CLR_D7;
DELAY();
SET_E;
DELAY();
CLR_E;
DELAY();

if(bdat0)
SET_D4;
else
CLR_D4;
if(bdat1)
SET_D5;
else
CLR_D5;
if(bdat2)
SET_D6;
else
CLR_D6;
if(bdat3)
SET_D7;
else
CLR_D7;
DELAY();
SET_E;
DELAY();
CLR_E;
DELAY();
}
/*--------------------------------------------------------------------
函數(shù)名稱:LCD1602讀操作
函數(shù)功能:
注意事項(xiàng):對于高速CPU,應(yīng)加延時(shí),好像是廢話~
提示說明:無
輸入:
返回:無
--------------------------------------------------------------------*/
//voidread(uint8adr)
//{
//}
/*--------------------------------------------------------------------
函數(shù)名稱:LCD1602設(shè)置CGRAM內(nèi)容
函數(shù)功能:
注意事項(xiàng):對于高速CPU,應(yīng)加延時(shí),好像是廢話~
提示說明:調(diào)用LCD1602_setCG(0,userCh),則寫入用戶定義的字符"userCh"
輸入:"adr"數(shù)據(jù)范圍:0-8,"buf"為用戶需要寫入的字符"userCh"
返回:無
--------------------------------------------------------------------*/
voidLCD1602_setCGRAM(uint8adr,constuint8buf[8])
{
uint8i;
write(0,0x40+adr*8);
for(i=0;i<8;i++)
write(1,buf[i]);
/*不得采樣下面寫法,因?yàn)閭魅氲氖菙?shù)組,最后一個(gè)不是’