本帖最后由 MOP 于 2016-11-8 23:45 编辑
就是分有無字庫,就是看控制IC是不是ST7920,是的話指令集會不同,會有擴展跟非擴展,我看了指令都跟原本的無字庫(KS0108)控制IC不同,另外Proteus的LCD12864是無字庫的
ST7920的普通指令集
ST7920的擴展指令集
無字庫的指令集(KS0108)
另外看Code的話,您的CS是有問題的
void hanzi(uchar ye,uchar lie,uchar *daima)
{
uchar i,j,col;
col=lie;
for(i=0;i<2;i++)
{
if(col>63)//起始點判斷
{
cs1=0;
cs2=1;
col=col-64;
}
else
{
cs1=1;
cs2=0;
}
write_com(0xb8+ye+i);
delay(5);
write_com(0x40+col);
for(j=0;j<16;j++)
{
write_dat(daima[i*16+j]);
col=col+8;
if(col>63)//寫數據中,超過邊界時
{
col=col-64;
if(lie>63)
{
cs1=1;
cs2=0;
}
else
{
cs1=0;
cs2=1;
}
write_com(0xb8+ye+i);
delay(5);
write_com(0x40+col);
}
}
col=lie;
}
}
改過的函式假設您的參數範圍Page(ye)0~7,Column(lie)0~127,這樣顯示時,會在同一行,但這寫法只保證lie為8的倍數才不會截斷任何data,另外字串長度一個Page也不可超過8字
void init()
{
delay(10);
cs1=1;
cs2=1;
分成兩行才不會cs1去讀取cs2的值來指派
void clear()
{
uchar i,j;
cs1=1;
cs2=1;
for(i=0;i<8;i++)
{
write_com(0xb8+i);
delay(5);
write_com(0x40);
for(j=0;j<64;j++)
write_dat(0x00);
}
}
清除時,兩個cs應都設為1
void read()
{
volatile uchar r;
習慣給I/O變數加上volatile
void main()
{
init();
clear();
while(1)
{
hanzi(0,0,chen);
}
}
更改main函式,讓函式自己依照起始位置來決定cs1和cs2
以上您試看看