小弟想做一个ks0108的12864屏温度计,找了一个51的程序,但字体太小,小弟不懂字体显示函数,只会改字模,请好心人帮忙修改一下或指导一下,多谢了!原程序+仿真+字模软件+效果图和预期的效果图附上。
/*************************写LCD函数********************************/
void lw(unsigned char x,unsigned char y,unsigned char dd)
{
if (x<64)
{
cs1=cs2=0;
di=rw=0;cs1=1;cs2=0;P2=0xb8|y;e=1;delay(2);e=0;delay(2);
di=rw=0;cs1=1;cs2=0;P2=0x40|x;e=1;delay(2);e=0;delay(2);
di=1;rw=0;cs1=1;cs2=0;P2=dd;e=1;delay(2);e=0;delay(2);
}
else
{
cs1=cs2=0;x=x-64;
di=rw=0;cs1=0;cs2=1;P2=0xb8|y;e=1;delay(2);e=0;delay(2);
di=rw=0;cs1=0;cs2=1;P2=0x40|x;e=1;delay(2);e=0;delay(2);
di=1;rw=0;cs1=0;cs2=1;P2=dd;e=1;delay(2);e=0;delay(2);
cs1=cs2=1;
}
P2=0xff;
}
/************************LCD初始化*************************/
void lcd_init(void) {
unsigned char x,y;
e=di=rw=0;
cs1=cs2=1;
cs1=0;cs2=1;
di=rw=0;P2=0x3f;e=1;delay(2);e=0;delay(2);
cs1=0;cs2=1;
di=rw=0;P2=0xc0;e=1;delay(2);e=0;delay(2);
cs1=cs2=0;
cs1=1;cs2=0;
di=rw=0;P2=0x3f;e=1;delay(2);e=0;delay(2);
cs1=1;cs2=0;
di=rw=0;P2=0xc0;e=1;delay(2);e=0;delay(2);
cs1=cs2=0;
for (y=0;y<8;y++) {
for (x=0;x<128;x++) lw(x,y,0);
}
}
/**********************************字符取模********************************************/
unsigned char code wen[32]={
0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00};
unsigned char code du[32]={
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00};
unsigned char code shu[10][16]={
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00} };
unsigned char code point[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00}; //小数点
/***************写16*16分辨率汉字************/
void write_chinese(x,y,array)
unsigned char x,y;
unsigned char array[];
{
unsigned char j,dd;
for(j=0;j<32;j++)
{
dd=array[j];
if(j<16) lw(x+j,y,dd);
else lw(x+j-16,y+1,dd);
}
}
/***************写8*16分辨率字母,数字**********/
void write_english(x,y,array)
unsigned char x,y;
unsigned char array[];
{
unsigned char j,dd;
for(j=0;j<16;j++)
{
dd=array[j];
if(j<8) lw(x+j,y,dd);
else lw(x+j-8,y+1,dd);
}
}
/************主函数*************/
void main()
{
char bw,sw,gw,qw;
int i=0;
lcd_init();
while(1)
{ i=ReadTemperature();//读温度
qw=i/1000;
bw=(i%1000)/100;
sw=(i-1000*qw-100*bw)/10;
gw=i-1000*qw-100*bw-10*sw;
write_chinese(24,3,wen);
write_chinese(40,3,du);
write_english(72,3,shu[bw]);
write_english(80,3,shu[sw]);
write_english(88,3,point);
write_english(96,3,shu[bw]);
delay(1000);
}
} |