本帖最后由 dgahz 于 2014-11-20 22:48 编辑
lcd_address(uint page,uint column) //这里决定输入点位置,共8页,每页8行,page范围0-7;列column范围0-127;
{ 页(或行)决定了上下位置,列决定了左右位置。
transfer_command_lcd(0xb0+page); /*设置页地址*/ 0xb0为规定的0页地址
transfer_command_lcd(0x10+(column>>4&0x0f)); /*设置列地址的高4位*/ column>>4&0x0f取列地址高4位,为和格式规定的
0x10组合,需右移4位变成低4位,原因0x10已占高4位
transfer_command_lcd(column&0x0f); /*设置列地址的低4位*/ 取 列地址低4位
}
/*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
void display_graphic_16x16(uint page,uint column,uchar *dp)
{
uint i,j;
CS_12864=0; //片选选中芯片工作
for(j=0;j<2;j++)j //因为是要生成16*16,所以占2页16列,每页16列循环2次,注:每页8行
{
lcd_address(page+j,column); //设置显示位置命令
for (i=0;i<16;i++) //16列
{
transfer_data_lcd(*dp); //每次写8位数据 /*写数据到LCD,每写完一个8位的数据后列地址自 动加1*/
dp++; //写完数据列地址自加,页(行)不会自加,所以前面要加page+j这一条, 而column不用加
} //dp++必需有,它不会自加
}
CS_12864=1; //停芯片
}
/*全屏清屏*/
void clear_screen()
{
unsigned char i,j;
CS_12864=0;
for(i=0;i<9;i++) //为什么是9页,猜可能页地址储存器多出一页,清的是储存器
{
transfer_command_lcd(0xb0+i);
transfer_command_lcd(0x10);
transfer_command_lcd(0x00);
for(j=0;j<132;j++) //列地址存储器说明书上是83H 即0-131
{
transfer_data_lcd(0x00); //各点写入0
}
}
CS_12864=1;
}
void display_text(uchar *s,page,column) //定点输入16*16
{
uchar a;
for(a=0;s[a]!=0;a+=2) //选偶数,a*8刚好为0,16,32,为16倍数,16为一个字占位 置。a/2自己分析
{
display_graphic_16x16(page,column+a*8,tep[a/2+page]); //调用前面显示16*16函数,写完一个字,向右挪一个字位置,
} //即列地址加16,而数据加1递增
}
void main()
{
uchar i=0;
uchar j=0;
uchar k=0;
uint humi,gq;
P0=0;
CS_12864=0;
initial_lcd();
clear_screen();
display_text("温度湿",0,0) ;
display_text("湿度湿",3,0);
display_text("光照湿",6,0);
} |