//上接 液晶1602 程序<2>----- CVAVR环境下mega8 内部8MHZ晶振
//----------------------------------------------------
//检测忙标志
void BF_mang(void)
{
bf_loop:
DUAN=0XFF; //先放开总线
//读忙信号状态设置
RS=0;
RW=1;
delay_us(2);//稍作延时待稳定
//下跳沿
E=0;
delay_us(2);//稍作延时待稳定
//拉回E
E=1;
DDRD.7=0; //一定要转换成输入模式,我个人也认为不用,直接读PIND.7就行,但我试了一下,没有此句,液晶不正常显示
delay_us(2); //稍作延时待稳定
if(PIND.7==1) //读忙信号,若为1,则说明忙,则再从头检测忙信号
{
goto bf_loop;
}
//不忙则
DDRD.7=1; //转换成输出模式
delay_us(2);//稍作延时待稳定
}
//----------------------------------------------------
//----------------------------------------------------
//写指令或者显示地址
void enable(void)
{
//写指令 或者 显示地址 状态设置
RS=0;
RW=0;
delay_us(2);//稍作延时待稳定
//下跳沿
E=0;
delay_us(2);//稍作延时待稳定
BF_mang(); //读忙信号
//拉回E
E=1;
}
//----------------------------------------------------
//----------------------------------------------------
//系统初始化
void init(void)
{
//总线设为输出 初始时为高电平
PORTD=0XFF;
DDRD=0XFF;
//背光控制端设为输出 初始时为高电平
LT=0;
DDRB.5=1;
//E端输出 初始时为高电平
E=1;
DDRB.4=1;
//RW端输出 初始时为高电平
RW=1;
DDRC.3=1;
//RS端输出 初始时为高电平
RS=1;
DDRC.2=1;
delay_us(2);//稍作延时待稳定
}
//----------------------------------------------------
//----------------------------------------------------
void xianshi(u8 add,u8 *str)//add为行的首地址 table为要显示的数组
{
u8 i;
for(i=0;i<=16;i++) //显示16个字符
{
//写要显示的地址 在这里是第二行的第一个位置(写入地址时要求最高位恒定为1,这个要注意哦!)
DUAN=add+i; //地址的算法
enable();
DUAN= *str; //要显示的字符
//对数据寄存器开始写 的状态设置
RS=1;
RW=0;
delay_us(2);//稍作延时待稳定
//下跳沿
E=0;
delay_us(2);//稍作延时待稳定
BF_mang(); //读忙信号
//拉回E
E=1;
str++;
}
}
//----------------------------------------------------
//----------------------------------------------------
//主函数
void main(void)
{
init();//初始化
//写命令
COM_1;
enable();
COM_6;
enable();
COM_4;
enable();
COM_3;
enable();
xianshi(add1, table1);
xianshi(add2, table2);
while (1)
{
#asm("NOP"); //工作结束,原地踏步
}
}
//----------------------------------------------------
//液晶1602 <1> <2> <3> 文章到此结束