lcd12864c语言显示任意位置
#include
#define uint unsigned int
#define uchar unsigned char
#include
#define RS RD2
#define CS2 RD1
#define CS1 RD0
#define E RD4
#define RW RD3
#define BUSY RB7
uchar (*p)[32];
uchar tab3[]={
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x 20,/*"a",0*/
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x 00/*"b",1*/
};
uchar tab0[]={
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x 00,
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x 00,/*"电",0*/
0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x 00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00/*"子",1*/
};
uchar tab1[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x 00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x 00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x 00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x 00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x 00/*"4",4*/
};/*"4",3*/
uchar tab2[]={
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x 00,/*"5",0*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x 00,/*"6",1*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x 00,/*"7",2*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x 00,/*"8",3*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x 00/*"9",4*/
};
//写指令代码(左)
void l_w_code(char l_code)
{
//check_busy();
PORTD=0x12;
PORTB=l_code;
E=1;
E=0;
asm("nop");
}
//写显示数据(左)
void l_w_data(char l_data)
{
//check_busy();
PORTD=0x16;
PORTB=l_data;
E=1;
E=0;
asm("nop");
}
//写指令代码(右)
void r_w_code(char r_code) {
//check_busy();
PORTD=0x11;
PORTB=r_code;
E=1;
E=0;
//asm("nop");
}
//写显示数据(右)
void r_w_data(char r_data) {
//check_busy();
PORTD=0x15;
PORTB=r_data;
E=1;
E=0;
asm("nop");
}
void initializeLCD(void)
{
l_w_code(0x3f);
l_w_code(0xc0);
l_w_code(0xb8);
l_w_code(0x40);
r_w_code(0x3f);
r_w_code(0xc0);
r_w_code(0xb8);
r_w_code(0x80);
}
void c_display(uint q,uint w,uint e) {
uchar m,n;
uchar i,x,y=0x40;
uint k=0,j=1;
if(w>8)
{w=w-8;j=0;}
for(i=1;i {y=y+0x08;} switch(q) { case 1:x=0xb8;break; case 2:x=0xba;break; case 3:x=0xbc;break; case 4:x=0xfe;break; default:break; } switch(e) { case 0:k=0;break; case 1:k=16;break; case 2:k=32;break; case 3:k=48;break; case 4:k=64;break; case 5:k=0;break; case 6:k=16;break; case 7:k=32;break; case 8:k=48;break; case 9:k=64;break; default:k=0;break; } if(j) { for (m=0;m<2;m++) { for(n=0;n<8;n++) { l_w_code(x); //写入页地址 l_w_code(y); if((e<10)&&(e>4)) { l_w_data(tab2[k++]);} else if(e<5) { l_w_data(tab1[k++]);} else { l_w_data((*p)[k++]);} y=y+0x01; } y=y-0x08; x+=0x01; } } else { for (m=0;m<2;m++) { for(n=0;n<8;n++) { r_w_code(x); //写入页地址 r_w_code(y); if((e<10)&&(e>4)) { r_w_data(tab2[k++]);} else if(e<5) { r_w_data(tab1[k++]);} else { r_w_data((*p)[k++]);} y=y+0x01; } y=y-0x08; x+=0x01; } } } void l_display(uint q,uint w) { uchar m,n; uchar i,x,y=0x40; uint k=0,j=1; if(w>8) {w=w-8;j=0;} for(i=1;i {y=y+0x08;} switch(q) { case 1:x=0xb8;break; case 2:x=0xba;break; case 3:x=0xbc;break; case 4:x=0xbe;break; default:break; } if(j) { for (m=0;m<2;m++) { for(n=0;n<16;n++) { l_w_code(x); //写入页地址 l_w_code(y); l_w_data((*p)[k++]); y=y+0x01; } y=y-0x10; x+=0x01; } } else { for (m=0;m<2;m++) { for(n=0;n<16;n++) { r_w_code(x); //写入页地址 r_w_code(y); r_w_data((*p)[k++]); y=y+0x01; } y=y-0x10; x+=0x01; } } } void delaycnt(unsigned int cnt) { while(--cnt); } void main(void) { TRISD=0X00; TRISB=0X00; initializeLCD(); while(1) { p=&tab0[0]; //显示电子 l_display(3,3); p=&tab0[32]; l_display(3,5); c_display(3,7,1); //显示1202 c_display(3,8,2); c_display(3,9,0); c_display(3,10,2); p=&tab3[0]; //显示ab c_display(2,11,10); p=&tab3[16]; c_display(2,12,10); } } /* x=4,0 c_display(x,y,z);表示在第x行,第Y列,显示z(数字1-9). 如果要显示其他字符,z=10,每个字母16个字符,p=&tab3[0];表示显示第一个字母,p=&tab3[16];表示显示第二个字母 P=&tab0[0];l_display(x,y);这里y不能为8和16,表示在第X行,第Y列和Y+1列显示tab0[]的第一个汉子,每个汉子32个字符,显示tab0[] 里面的第二个就是从p=&tab2[32]开始 */