完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这是的AVR mega8 的程序 /* * _1602_mega8.c * * Created: 2014-5-12 10:47:19 * Author: Administrator //这是LCD 1602 通用程序 #define F_CPU 3686400UL #include #include #include //LCD控制引脚定义 /***********************************/ #define RS PB0 //寄存器控制端口 0为命令 1数据 #define RW PB1 //读写操作端口 #define E PB2 //使能操作端口 /***********************************/ //LCD 控制端口定义 /***********************************/ #define LCD_CRTL_PORT PORTB /***********************************/ //LCD 控制引脚操作定义 #define RS_1 LCD_CRTL_PORT|= (1< #define RS_1 LCD_CRTL_PORT|=_BV(RS) //RS为1 进行数据传输 #define RS_0 LCD_CRTL_PORT&=~_BV(RS) //RS为0 进行命令控制 #define RW_1 LCD_CRTL_PORT|=_BV(RW) //RW为1 进行读操作 #define RW_0 LCD_CRTL_PORT&=~_BV(RW) //RW为0 进行写操作 #define EN_1 LCD_CRTL_PORT|=_BV(E) //EN为1 使能1602 #define EN_0 LCD_CRTL_PORT&=~_BV(E) //EN为0 不使能1602 ***********************************/ //LCD 数据端口定义 /***********************************/ #define LCD_PORT PORTD //发送LCD数据端口 #define LCD_PIN PIND //读取LCD数据端口 #define LCD_DDR DDRD //LCD数据端口方向 /***********************************/ // LCD忙等待 /***********************************/ void LCD_BUSY_WAIT() { RS_0; RW_1; //读状态 LCD_DDR=0x00; //端口设为输入 _delay_ms(10); EN_1; //使能1602 等待 //loop_until_bit_is_clear(LCD_PIN,7); //空转直到端口的最高位7 为0 while((LCD_PIN&0X80)!=0); EN_0; LCD_DDR=0XFF; //还原LCD端口为输出 _delay_ms(5); } /***********************************/ // 写LCD命令寄存器 /***********************************/ void Write_LCD_Command(unsigned char cmd) { LCD_BUSY_WAIT(); RS_0; RW_0; //写状态寄存器 _delay_ms(10); LCD_PORT=cmd; //写入命令 _delay_ms(15); EN_1; _delay_ms(5); EN_0; //使能芯片执行 LCD_CRTL_PORT=0X00; //清除端口 } /***********************************/ // 写LCD数据寄存器 /***********************************/ void Write_LCD_Data(unsigned char data) { LCD_BUSY_WAIT(); RS_1; RW_0; //写数据寄存器 _delay_ms(10); LCD_PORT=data; //写入数据 _delay_ms(15); EN_1; _delay_ms(5); EN_0; //使能 } /***********************************/ // LCD初始化 /***********************************/ void Initialize_LCD() { Write_LCD_Command(0x01); _delay_ms(15); //清屏 Write_LCD_Command(0x38); _delay_ms(15); //置功能,8位数据,双行显示,5*7字体 Write_LCD_Command(0x06); _delay_ms(15); //字符进入模式,屏幕不移动,字符移动,数据时递增的 Write_LCD_Command(0x0c); _delay_ms(15); //显示开,关闭光标 Write_LCD_Command(0x01); _delay_ms(15); //清屏 } /***********************************/ // LCD字符串显示 /***********************************/ void LCD_ShowString(unsigned char x,unsigned char y,char *str) //表示要再显示屏上的第y行的第x个位置(从左往右)开始显示字符 { unsigned char i=0; if(y==0)Write_LCD_Command(0x80|x); //假如第一行开始显示 从x位开始 if(y==1)Write_LCD_Command(0xC0|x); //假如第二行开始显示 从x位开始 for (i=0;i<16 && str!=' |