當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]入口參數(shù)說明:// control port//#define SET_RS sbi(PORTB,5)//#define CLR_RS cbi(PORTB,5)//#define OUT_RS sbi(DDRB,5)//#define SET_RW sbi(PORTB,6)//#define CLR_RW

入口參數(shù)說明:

// control port

//#define SET_RS sbi(PORTB,5)

//#define CLR_RS cbi(PORTB,5)

//#define OUT_RS sbi(DDRB,5)

//#define SET_RW sbi(PORTB,6)

//#define CLR_RW cbi(PORTB,6)

//#define OUT_RW sbi(DDRB,6)

//#define SET_E sbi(PORTB,7)

//#define CLR_E cbi(PORTB,7)

//#define OUT_E sbi(DDRB,7)

// data port

//#define SET_D4 sbi(PORTD,4)

//#define CLR_D4 cbi(PORTD,4)

//#define OUT_D4 sbi(DDRD,4)

//#define SET_D5 sbi(PORTD,5)

//#define CLR_D5 cbi(PORTD,5)

//#define OUT_D5 sbi(DDRD,5)

//#define SET_D6 sbi(PORTD,6)

//#define CLR_D6 cbi(PORTD,6)

//#define OUT_D6 sbi(DDRD,6)

//#define SET_D7 sbi(PORTD,7)

//#define CLR_D7 cbi(PORTD,7)

//#define OUT_D7 sbi(DDRD,7)

// busy port

//#define GET_BF gbi(PIND,7)

//#define OUT_BF sbi(DDRD,7)

//#define IN_BF cbi(DDRD,7)

----------------------------------------------------------------------

接口定義:

LCD1602 ATmega16

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)點是:7根IO可任意定義,不需分布在固定的一組PORT口上

(3)該程序的缺點是:IO定義的寫法較為繁瑣

----------------------------------------------------------------------

待定參數(shù)說明:

//#define DELAY() {_nop_();_nop_();_nop_();}

----------------------------------------------------------------------

對外變量說明:

----------------------------------------------------------------------

對外函數(shù)說明:

----------------------------------------------------------------------

10101010101010101010101010101010101010101010101010101010101010101010*/

#ifndef LCD1602_H

#define LCD1602_H

#include "D:\ICC_H\CmmICC.H"

/* 待定參數(shù) */

#define DELAY() {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}

/* 不考慮移植性的寫法 */

//uint8 bdata bdat;

//sbit bdat0=bdat^0;

//sbit bdat1=bdat^1;

//sbit bdat2=bdat^2;

//sbit bdat3=bdat^3;

//sbit bdat4=bdat^4;

//sbit bdat5=bdat^5;

//sbit bdat6=bdat^6;

//sbit bdat7=bdat^7;

/* 考慮移植性的寫法 */

uint8 bdat;

#define bdat0 (bdat&0x01)

#define bdat1 (bdat&0x02)

#define bdat2 (bdat&0x04)

#define bdat3 (bdat&0x08)

#define bdat4 (bdat&0x10)

#define bdat5 (bdat&0x20)

#define bdat6 (bdat&0x40)

#define bdat7 (bdat&0x80)

#define CGRAM0 0x00

#define CGRAM1 0x01

#define CGRAM2 0x02

#define CGRAM3 0x03

#define CGRAM4 0x04

#define CGRAM5 0x05

#define CGRAM6 0x06

#define CGRAM7 0x07

#define TRUE 1

#define FALSE 0

bool LCD1602Err = FALSE;

/*--------------------------------------------------------------------

函數(shù)名稱:LCD1602讀讀讀讀讀忙~

函數(shù)功能:都說是讀讀讀讀讀忙咯~

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:無

輸 入:

返 回:無

--------------------------------------------------------------------*/

void busy(void)

{

uint16 busyCounter=0;

bool busySta; //用于探測 lcd busy status

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"時,"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錯誤,方便上繳系統(tǒng)報錯

return ; //避免由于LCD1602錯誤而導(dǎo)致程序阻塞

}

busyCounter++;

}

while(busySta);

LCD1602Err=FALSE;

CLR_E;

OUT_BF;

}

/*--------------------------------------------------------------------

函數(shù)名稱:LCD1602寫操作

函數(shù)功能:[!--empirenews.page--]

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:無

輸 入:

返 回:無

--------------------------------------------------------------------*/

void write(bool flag,uint8 dat) //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ù)功能:

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:無

輸 入:

返 回:無

--------------------------------------------------------------------*/

//void read(uint8 adr)

//{

//}

/*--------------------------------------------------------------------

函數(shù)名稱:LCD1602設(shè)置CGRAM內(nèi)容

函數(shù)功能:

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:調(diào)用LCD1602_setCG(0,userCh),則寫入用戶定義的字符"userCh"

輸 入:"adr"數(shù)據(jù)范圍:0-8,"buf"為用戶需要寫入的字符"userCh"

返 回:無

--------------------------------------------------------------------*/

void LCD1602_setCGRAM(uint8 adr,const uint8 buf[8])

{

uint8 i;

write(0,0x40+adr*8);

for(i=0;i<8;i++)

write(1,buf[i]);

/* 不得采樣下面寫法,因為傳入的是數(shù)組,最后一個不是’\0’ */

//while(*buf)

//write(1,*buf++);

}

/*--------------------------------------------------------------------

函數(shù)名稱:LCD1602命令設(shè)置

函數(shù)功能:

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:

輸 入:"CLR_SCR"/"GO_HOME"/"AC_INC"/"AC_DEC"...

返 回:無

--------------------------------------------------------------------*/

//---- function ------ 1 -------- 0 ----LcdWordPos--

// dispEn | Enable | DISAble | bit2

// cursorEn | Enable | Disable | bit1

// blinkEn | Enable | Disable | bit0

//------------------------------------------------------

// isACinc | INC_AC | DEC_AC | bit1

// shiftEn | Enable | Disable | bit0

//------------------------------------------------------

void LCD1602_setCmd(uint8 *str)

{

static bool dispEn =0;

static bool cursorEn=0;

static bool blinkEn =0;

static bool shiftEn =0;

static bool isACinc =0;

if(!strcmp(str,"CLR_SCR")) //clear screen

write(0,0x01);

else if(!strcmp(str,"GO_HOME")) //set AC go home

write(0,0x02);

/*--------------------------------------------------

isACinc & shiftEn 共用一個命令設(shè)置

--------------------------------------------------*/

else if(!strcmp(str,"INC_AC")) //set AC as inc mode

{

isACinc=1;

if(shiftEn)

write(0,0x07);

else

write(0,0x06);

}

else if(!strcmp(str,"DEC_AC")) //set AC as dec mode

{

isACinc=0;

if(shiftEn)

write(0,0x05);

else

write(0,0x04);

}

else if(!strcmp(str,"EN_SHIFT")) //enable shift

{

shiftEn=1;

if(isACinc)

write(0,0x07);

else

write(0,0x06);

}

else if(!strcmp(str,"DIS_SHIFT")) //disable shift

{

shiftEn=0;

if(isACinc)

write(0,0x05);

else

write(0,0x04);

}

/*--------------------------------------------------

dispEn & cursorEn & blinkEn共用一個命令設(shè)置

--------------------------------------------------*/

else if(!strcmp(str,"OPEN_LCD")) //opern lcd

{

dispEn=1;

if(cursorEn)

if(blinkEn)

write(0,0x0F);

else

write(0,0x0E);

else

if(blinkEn)

write(0,0x0D);

else

write(0,0x0C);

}

else if(!strcmp(str,"CLOSE_LCD")) //close lcd

{

dispEn=0;

if(cursorEn)

if(blinkEn)

write(0,0x0B);

else

[!--empirenews.page--]

write(0,0x0A);

else

if(blinkEn)

write(0,0x09);

else

write(0,0x08);

}

else if(!strcmp(str,"OPEN_CURS")) //open cursor

{

cursorEn=1;

if(dispEn)

if(blinkEn)

write(0,0x0F);

else

write(0,0x0E);

else

if(blinkEn)

write(0,0x0B);

else

write(0,0x0A);

}

else if(!strcmp(str,"CLOSE_CURS")) //close cursor

{

cursorEn=0;

if(dispEn)

if(blinkEn)

write(0,0x0D);

else

write(0,0x0C);

else

if(blinkEn)

write(0,0x09);

else

write(0,0x08);

}

else if(!strcmp(str,"EN_BLINK")) //enable blink cursor

{

blinkEn=1;

if(dispEn)

if(cursorEn)

write(0,0x0F);

else

write(0,0x0D);

else

if(cursorEn)

write(0,0x0B);

else

write(0,0x09);

}

else if(!strcmp(str,"DIS_BLINK")) //disable blink cursor

{

blinkEn=0;

if(dispEn)

if(cursorEn)

write(0,0x0E);

else

write(0,0x0C);

else

if(cursorEn)

write(0,0x0A);

else

write(0,0x08);

}

/*--------------------------------------------------

dispEn & cursorEn & blinkEn共用一個命令設(shè)置

--------------------------------------------------*/

else if(!strcmp(str,"RIGHT_SCR")) //right shift screen

write(0,0x1c);

else if(!strcmp(str,"LEFT_SCR")) //left shift screen

write(0,0x18);

else if(!strcmp(str,"RIGHT_CURS")) //right shift cursor

write(0,0x14);

else if(!strcmp(str,"LEFT_CURS")) //left shift cursor

write(0,0x10);

}

/*--------------------------------------------------------------------

函數(shù)名稱:LCD1602初始化

函數(shù)功能:

注意事項:

提示說明:無

輸 入:

返 回:無

--------------------------------------------------------------------*/

void LCD1602_init(void)

{

OUT_RS;

OUT_RW;

OUT_E;

OUT_D4;

OUT_D5;

OUT_D6;

OUT_D7;

delay50ms(1);

CLR_D7;

CLR_D6;

SET_D5;

SET_D4;

DELAY();

CLR_RS;

DELAY();

CLR_RW;

SET_E;

DELAY();

CLR_E;

delay50us(200);

SET_E;

DELAY();

CLR_E;

delay50us(200);

SET_E;

DELAY();

CLR_E;

delay50us(200);

CLR_D7;

CLR_D6;

SET_D5;

CLR_D4;

DELAY();

SET_E;

DELAY();

CLR_E;

DELAY();

LCD1602_setCmd("OPEN_LCD");

LCD1602_setCmd("CLR_SCR");

LCD1602_setCmd("INC_AC");

//LCD1602_setCmd("OPEN_CURS");

//LCD1602_setCmd("GO_HOME");

}

/*--------------------------------------------------------------------

宏名稱:設(shè)置AC值

宏功能:設(shè)置AC值啦

注意事項:

提示說明:

輸 入:

返 回:無

--------------------------------------------------------------------*/

#define LCD1602_setAC(adr) write(0,adr)

/*--------------------------------------------------------------------

函數(shù)名稱:輸出一個字符

函數(shù)功能:

注意事項:對于高速CPU,應(yīng)加延時,好像是廢話~

提示說明:調(diào)用LCD1602_putc(0x80,’A’),則在第一行第一個字符處輸出’A’

輸 入:

返 回:無

--------------------------------------------------------------------*/

void LCD1602_putc(uint8 adr,uint8 ch)

{

write(0,adr);

write(1,ch);

}

/*--------------------------------------------------------------------

函數(shù)名稱:輸出一個字符串

函數(shù)功能:

注意事項:無

提示說明:調(diào)用LCD1602_puts(0x80,"waveShare"),則從第一行第一個位置開始輸出"waveShare"

輸 入:

返 回:無

--------------------------------------------------------------------*/

void LCD1602_puts(uint8 startAdr,uint8 *str)

{

/*

while(*str)

{

LCD1602_putc(addr++,*str++);

}

*/

//LCD1602_setCmd("AC++");

write(0,startAdr);

while(*str)

write(1,*str++);

}

/*--------------------------------------------------------------------

函數(shù)名稱:輸出一個數(shù)值(帶0)

函數(shù)功能:有時候你可能不是需要"123",而是需要"00123"吧

注意事項:無

提示說明:調(diào)用LCD1602_putd0(0x8F,123,5),則從0x8B開始到0X8F輸出"00123"

輸 入:

返 回:無

--------------------------------------------------------------------*/[!--empirenews.page--]

//for example:dat=123,length=6,output 000123

void LCD1602_putd0(uint8 endAdr,uint32 dat,uint8 length)

{

sint8 i;

speaData(dat,length);

//LCD1602_setCmd("AC++");

write(0,endAdr-length+1);

for(i=length-1;i>=0;i--)

write(1,dataElem[i]+0x30);

}

/*--------------------------------------------------------------------

函數(shù)名稱:輸出一個數(shù)值(不帶0)

函數(shù)功能:

注意事項:無

提示說明:調(diào)用LCD1602_putd(0x8F,123,5),則從0x8B開始到0X8F輸出" 123"

輸 入:

返 回:無

--------------------------------------------------------------------*/

void LCD1602_putd(uint8 endAdr,uint32 dat,uint8 length)

{

sint8 i;

sint8 effectLen;

if(dat>999999)

effectLen=7;

else if(dat>99999)

effectLen=6;

else if(dat>9999)

effectLen=5;

else if(dat>999)

effectLen=4;

else if(dat>99)

effectLen=3;

else if(dat>9)

effectLen=2;

else

effectLen=1;

speaData(dat,effectLen);

//LCD1602_setCmd("AC++");

if(length>effectLen)

{

write(0,endAdr-length+1);

for(i=length-effectLen-1;i>=0;i--)

write(1,’ ’);

}

for(i=effectLen-1;i>=0;i--)

{

if(i==0||dataElem[i])

{

write(0,endAdr-i);

for(;i>=0;i--)

write(1,dataElem[i]+0x30);

}

}

}

/*--------------------------------------------------------------------

函數(shù)名稱:輸出一個混合串

函數(shù)功能:

注意事項:最好不要加載這個函數(shù),因為它將占用將近1K空間

提示說明:調(diào)用LCD1602_sprintf(0x8F,12AB,4),則從0x8B開始到0X8F輸出"12ABok"

輸 入:

返 回:無

--------------------------------------------------------------------*/

//void LCD1602_sprintf(uint8 startAdr,uint32 dat,uint8 length)

//{

// /* clear the display area first here! */

// //LCD1602_puts(addr," ");

// sprintf(t,"%luok",dat);

// //LCD1602_setCmd("AC++");

// LCD1602_puts(addr,t);

//}

#endif

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉