完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
入口参数说明: // control port //#define SET_RS ***i(PORTB,5) //#define CLR_RS cbi(PORTB,5) //#define OUT_RS ***i(DDRB,5) //#define SET_RW ***i(PORTB,6) //#define CLR_RW cbi(PORTB,6) //#define OUT_RW ***i(DDRB,6) //#define SET_E ***i(PORTB,7) //#define CLR_E cbi(PORTB,7) //#define OUT_E ***i(DDRB,7) // data port //#define SET_D4 ***i(PORTD,4) //#define CLR_D4 cbi(PORTD,4) //#define OUT_D4 ***i(DDRD,4) //#define SET_D5 ***i(PORTD,5) //#define CLR_D5 cbi(PORTD,5) //#define OUT_D5 ***i(DDRD,5) //#define SET_D6 ***i(PORTD,6) //#define CLR_D6 cbi(PORTD,6) //#define OUT_D6 ***i(DDRD,6) //#define SET_D7 ***i(PORTD,7) //#define CLR_D7 cbi(PORTD,7) //#define OUT_D7 ***i(DDRD,7) // busy port //#define GET_BF gbi(PIND,7) //#define OUT_BF ***i(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)该程序的优点是:7根IO可任意定义,不需分布在固定的一组PORT口上 (3)该程序的缺点是:IO定义的写法较为繁琐 ---------------------------------------------------------------------- 待定参数说明: //#define DELAY() {_nop_();_nop_();_nop_();} ---------------------------------------------------------------------- 对外变量说明: ---------------------------------------------------------------------- 对外函数说明: ---------------------------------------------------------------------- 10101010101010101010101010101010101010101010101010101010101010101010*/ #ifndef LCD1602_H #define LCD1602_H #include "D:ICC_HCmmICC.H" /* 待定参数 */ #define DELAY() {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();} /* 不考虑移植性的写法 */ //uint8 bdata bdat; //***it bdat0=bdat^0; //***it bdat1=bdat^1; //***it bdat2=bdat^2; //***it bdat3=bdat^3; //***it bdat4=bdat^4; //***it bdat5=bdat^5; //***it bdat6=bdat^6; //***it 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; /*-------------------------------------------------------------------- 函数名称:LCD1602读读读读读忙~ 函数功能:都说是读读读读读忙咯~ 注意事项:对于高速CPU,应加延时,好像是废话~ 提示说明:无 输 入: 返 回:无 --------------------------------------------------------------------*/ 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"状态可能已经改变,必须再次设为输出"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; //标识LCD1602错误,方便上缴系统报错 return ; //避免由于LCD1602错误而导致程序阻塞 } busyCounter++; } while(busySta); LCD1602Err=FALSE; CLR_E; OUT_BF; } /*-------------------------------------------------------------------- 函数名称:LCD1602写操作 函数功能: 注意事项:对于高速CPU,应加延时,好像是废话~ 提示说明:无 输 入: 返 回:无 --------------------------------------------------------------------*/ 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(); } /*-------------------------------------------------------------------- 函数名称:LCD1602读操作 函数功能: 注意事项:对于高速CPU,应加延时,好像是废话~ 提示说明:无 输 入: 返 回:无 --------------------------------------------------------------------*/ //void read(uint8 adr) //{ //} /*-------------------------------------------------------------------- 函数名称:LCD1602设置CGRAM内容 函数功能: 注意事项:对于高速CPU,应加延时,好像是废话~ 提示说明:调用LCD1602_setCG(0,userCh),则写入用户定义的字符"userCh" 输 入:"adr"数据范围: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); /* 不得采样下面写法,因为传入的是数组,最后一个不是' |