{
wr_lcd (comm,0x34); //扩充指令操作。 wr_lcd (comm,y+j*2); wr_lcd (comm,x+i); wr_lcd (comm,0x30); wr_lcd (dat,data1); wr_lcd (dat,data1); }
for(i=0;i<8;i++) {
wr_lcd (comm,0x34); wr_lcd (comm,y+j*2+1); wr_lcd (comm,x+i); wr_lcd (comm,0x30); wr_lcd (dat,data2); wr_lcd (dat,data2); } }
x=x2; }
wr_lcd (comm,0x36); }
/*-----------------------------------------------*/ /*---------------显示汉字或字符----------------*/ void chn_disp (uchar code *chn) {
uchar i,j;
wr_lcd (comm,0x30); wr_lcd (comm,0x80); for (j=0;j<4;j++) {
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]); } }
//**********************************************
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.我发现如果固定yo的值为0x80,
//那么再去改变x0的值的话,x0的值是多少就在那一块反白,反白的范围应该是32*16。但前提是 //x1=2,y1=16.
21
//如果x1=1,y1=8. 那么反白的范围应该是16*8。
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl) {
uchar i,j;
for(j=0;j for(i=0;i wr_lcd (comm,0x34); wr_lcd (comm,y0+j); wr_lcd (comm,x0+i); wr_lcd (comm,0x30); wr_lcd (dat,data1); //写数据到RAM.这类语句都是一个道理。 wr_lcd (dat,data2); } } wr_lcd (comm,0x36); } //***************************************************** /*--------------清DDRAM------------------*/ void clrram (void) { wr_lcd (comm,0x30); wr_lcd (comm,0x01); //清除显示指令。 delay (180); } /*---------------------------------------*/ /*-------------下半屏显示图形--------------*/ //显示图形的过程是这样的:首先先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址) //然后在每个地址里写上16位的数据。 void img_disp1 (uchar code *img) { uchar i,j; for(j=0;j<32;j++) { for(i=0;i<8;i++) { wr_lcd (comm,0x34); wr_lcd (comm,y+j); wr_lcd (comm,x2+i); 22 wr_lcd (comm,0x30); wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } } wr_lcd (comm,0x36); //扩充功能指令,开绘图开关。 } //******************************************* /*----------------显示图形-----------------*/ void img_disp (uchar code *img) { uchar i,j; for(j=0;j<32;j++) { for(i=0;i<8;i++) { wr_lcd (comm,0x34); //扩充指令操作。 wr_lcd (comm,y+j); //设定绘图RAM地址。 wr_lcd (comm,x1+i); //同上。 wr_lcd (comm,0x30); //基本指令操作。 wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } } for(j=32;j<64;j++) { for(i=0;i<8;i++) { wr_lcd (comm,0x34); wr_lcd (comm,y+j-32); wr_lcd (comm,x2+i); wr_lcd (comm,0x30); wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } } wr_lcd (comm,0x36); } //********************************************** /*------------------主程序--------------------*/ void main () { 23 SP=0x5f; init_lcd (); while (1) { lat_disp (0x00,0x00); delay1(1000); chn_disp (tab1); delay1(1000); con_disp (0xff,0xff,0x81,0x80,1,8); delay1 (4000); clrram(); lat_disp (0x00,0x00); img_disp1 (tab32); delay1 (4000); clrram(); img_disp (tab5); delay1 (8000); } } 12864液晶 串行口传输程序-C语言 2007年09月20日 星期四 下午 03:49 //12864(ST7920)串口C51程序 #include sbit E_CLK =P3^2;//clock input 同步时钟输入端 sbit RW_SID=P3^1;//data input/output 串行数据输入、输出端 void delay(unsigned int n) { unsigned int i; for(i=0; i //串行发送一字节数据 24 void SendByte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { E_CLK=0; if(dat&0x80)RW_SID=1;else RW_SID=0; E_CLK=1; dat=dat<<1; } } //串行接收一字节数据 unsigned char ReceieveByte(void) { unsigned char i,d1,d2; for(i=0;i<8;i++) { E_CLK=0;delay(100); E_CLK=1; if(RW_SID)d1++; d1=d1<<1; } for(i=0;i<8;i++) { E_CLK=0;delay(100); E_CLK=1; if(RW_SID)d2++; d2=d2<<1; } return (d1&0xF0+d2&0x0F); } //写控制命令 void SendCMD(unsigned char dat) { SendByte(0xF8);//11111,00,0 RW=0,RS=0 志 SendByte(dat&0xF0);//高四位 SendByte((dat&0x0F)<<4);//低四位 } 25 同步标