一个关于无字库12864的奇怪的问题。。
时间:10-02
整理:3721RD
点击:
我想在一个无字库的12864上显示出一条竖线。但是总是有断点。不过在仿真上确实正确的。代码在下面,望大神帮我看看。代码是网上下的。
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit EN=P1^6;
- sbit RW=P2^1;
- sbit RS=P2^0;
- sbit CS2=P2^3;
- sbit CS1=P2^2; //端口定义
- /***********************************延时大约1ms程序**********************************/
- void delay1ms(int j)
- {
- int aa,kk;
- for(aa=0;aa<j;aa++)
- for(kk=120;kk>0;kk--);
- }
- /**********************************以下是12864液晶驱动函数**************************/
- void chekbusy12864(void)
- {
- uchar dat;
- RS=0;
- RW=1;
- do
- {
- P0=0x00;
- EN=1;
- dat=P0&0x80;
- //delay1ms(2); //注意这里:如果这里有延时,显示的时候一顿一顿的!
- EN=0;
- }while(dat!=0x00);
- }
- /**************************************12864液晶选屏********************************/
- void choose12864(uchar i)
- {
- switch (i)
- {
- case 0: CS1=1;CS2=0;break; //左屏
- case 1: CS1=0;CS2=1;break; //右屏
- case 2: CS1=1;CS2=1;break; //全屏
- default: break;
- }
- }
- /******写命令*****/
- void write_command(uchar cmd) //写命令
- {
- chekbusy12864();
- RS=0; //指令模式
- RW=0; //写模式
- EN=1;
- P0=cmd;
- //delay1ms(1); 注意这里:有延时的话,他会一顿一顿的!
- EN=0;
- }
- /****************************************写数据*************************************/
- void write_shuju(uchar dat)
- {
- chekbusy12864();
- RS=1;
- RW=0;
- EN=1;
- P0=dat;
- //delay1ms(1); 注意这里,有延时的话,他会一顿一顿的!
- EN=0;
- }
- /***************************************清屏***************************************/
- void clear12864()
- {
- uchar i,j;
- CS1=1;
- CS2=1;
- for(i=0;i<8;i++)
- {
- write_command(0xb8+i); //页的首地址为0xb8...左半屏的页的首地址为0xb8,右半屏页的首地址也为0xb8
- write_command(0x40) ; //一定要注意:列的首地址为0x40,且列地址会自动加1
- for(j=0;j<64;j++)
- {
- write_shuju(0x00); //清零....其实这里还可以注意到:列地址自动加1从0~3FH。选择的是全屏,左半屏列地址0~3FH,右半屏列地址0~3FH同时清0!
- }
- }
- }
- /****************************************初始化**************************************/
- void init12864(void)
- {
- chekbusy12864();
- write_command(0xc0); //从第零行开始显示
- write_command(0x3f);
- clear12864(); //LCD显示RAM中的内容即开显示
- }
- /***************************************读数据************************************/
- uchar read_shuju(uchar page,uchar arrange) //page页地址.arrange列地址)
- {
- uchar dat;
- chekbusy12864();
- write_command(page+0xb8);
- write_command(arrange+0x40);
- //EX0=0;
- P0=0xff;
- RW=1;
- RS=1;
- EN=1;
- dat=P0;
- EN=0;
-
- EN=1; //12864读数据时第二次读才有效,第一次读取的值不采集
- dat=P0;
- EN=0;
- return(dat);
- //EX0=1;
- }
- /***************************************显示一个点********************************/
- void Disp(uchar x,uchar y)
- {
- uchar date;
- if(x>63)
- {
- choose12864(1);
- x=x-64;
- }
- else
- {
- choose12864(0);
- }
- date=read_shuju(y/8,x);
- write_command(0x40|x);
- write_command(0xb8|y/8);
- write_shuju((1<<(y%8))|date);
- }
- /***************************************清除一个点**********************************/
- void Misp(uchar x,uchar y)
- {
- uchar date,j;
- if(x>63)
- {
- choose12864(1);
- x=x-64;
- }
- else
- {
- choose12864(0);
- }
- date=read_shuju(y/8,x);
- write_command(0x40|x);
- write_command(0xb8|y/8);
- j=~(1<<y%8);
- write_shuju(date&j);
- }
- void main()
- {
- uchar i;
- choose12864(2);
- init12864();
- // Disp(10,10);
- // Disp(10,11);
- // Disp(10,12);
- // Disp(10,13);
- // Disp(10,14);
-
- /*-----------------------------画两条竖线--------------------------*/
- for(i=0;i<59;i++)
- {
- Disp(30,1+i); //在列30上,从行1~59画一条竖线
- // Disp(127,1+i); //在列127上,从行1~59画一条竖线
- }
- /*-----------------------------画两条横线---------------------------*/
- // for(i=0;i<98;i++)
- // {
- // Disp(30+i,1); //在行1上,从列30~127画一条横线
- // Disp(30+i,59); //在行59上,从列30~127画一条横线
- // }
- while(1);
- }
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit EN=P1^6;
- sbit RW=P2^1;
- sbit RS=P2^0;
- sbit CS2=P2^3;
- sbit CS1=P2^2; //端口定义
- /***********************************延时大约1ms程序**********************************/
- void delay1ms(int j)
- {
- int aa,kk;
- for(aa=0;aa<j;aa++)
- for(kk=120;kk>0;kk--);
- }
- /**********************************以下是12864液晶驱动函数**************************/
- void chekbusy12864(void)
- {
- uchar dat;
- RS=0;
- RW=1;
- do
- {
- P0=0x00;
- EN=1;
- dat=P0&0x80;
- //delay1ms(2); //注意这里:如果这里有延时,显示的时候一顿一顿的!
- EN=0;
- }while(dat!=0x00);
- }
- /**************************************12864液晶选屏********************************/
- void choose12864(uchar i)
- {
- switch (i)
- {
- case 0: CS1=1;CS2=0;break; //左屏
- case 1: CS1=0;CS2=1;break; //右屏
- case 2: CS1=1;CS2=1;break; //全屏
- default: break;
- }
- }
- /******写命令*****/
- void write_command(uchar cmd) //写命令
- {
- chekbusy12864();
- RS=0; //指令模式
- RW=0; //写模式
- EN=1;
- P0=cmd;
- //delay1ms(1); 注意这里:有延时的话,他会一顿一顿的!
- EN=0;
- }
- /****************************************写数据*************************************/
- void write_shuju(uchar dat)
- {
- chekbusy12864();
- RS=1;
- RW=0;
- EN=1;
- P0=dat;
- //delay1ms(1); 注意这里,有延时的话,他会一顿一顿的!
- EN=0;
- }
- /***************************************清屏***************************************/
- void clear12864()
- {
- uchar i,j;
- CS1=1;
- CS2=1;
- for(i=0;i<8;i++)
- {
- write_command(0xb8+i); //页的首地址为0xb8...左半屏的页的首地址为0xb8,右半屏页的首地址也为0xb8
- write_command(0x40) ; //一定要注意:列的首地址为0x40,且列地址会自动加1
- for(j=0;j<64;j++)
- {
- write_shuju(0x00); //清零....其实这里还可以注意到:列地址自动加1从0~3FH。选择的是全屏,左半屏列地址0~3FH,右半屏列地址0~3FH同时清0!
- }
- }
- }
- /****************************************初始化**************************************/
- void init12864(void)
- {
- chekbusy12864();
- write_command(0xc0); //从第零行开始显示
- write_command(0x3f);
- clear12864(); //LCD显示RAM中的内容即开显示
- }
- /***************************************读数据************************************/
- uchar read_shuju(uchar page,uchar arrange) //page页地址.arrange列地址)
- {
- uchar dat;
- chekbusy12864();
- write_command(page+0xb8);
- write_command(arrange+0x40);
- //EX0=0;
- P0=0xff;
- RW=1;
- RS=1;
- EN=1;
- dat=P0;
- EN=0;
-
- EN=1; //12864读数据时第二次读才有效,第一次读取的值不采集
- dat=P0;
- EN=0;
- return(dat);
- //EX0=1;
- }
- /***************************************显示一个点********************************/
- void Disp(uchar x,uchar y)
- {
- uchar date;
- if(x>63)
- {
- choose12864(1);
- x=x-64;
- }
- else
- {
- choose12864(0);
- }
- date=read_shuju(y/8,x);
- write_command(0x40|x);
- write_command(0xb8|y/8);
- write_shuju((1<<(y%8))|date);
- }
- /***************************************清除一个点**********************************/
- void Misp(uchar x,uchar y)
- {
- uchar date,j;
- if(x>63)
- {
- choose12864(1);
- x=x-64;
- }
- else
- {
- choose12864(0);
- }
- date=read_shuju(y/8,x);
- write_command(0x40|x);
- write_command(0xb8|y/8);
- j=~(1<<y%8);
- write_shuju(date&j);
- }
- void main()
- {
- uchar i;
- choose12864(2);
- init12864();
- // Disp(10,10);
- // Disp(10,11);
- // Disp(10,12);
- // Disp(10,13);
- // Disp(10,14);
-
- /*-----------------------------画两条竖线--------------------------*/
- for(i=0;i<59;i++)
- {
- Disp(30,1+i); //在列30上,从行1~59画一条竖线
- // Disp(127,1+i); //在列127上,从行1~59画一条竖线
- }
- /*-----------------------------画两条横线---------------------------*/
- // for(i=0;i<98;i++)
- // {
- // Disp(30+i,1); //在行1上,从列30~127画一条横线
- // Disp(30+i,59); //在行59上,从列30~127画一条横线
- // }
- while(1);
- }
太棒了,太棒了太棒了太棒了太棒了太棒了太棒了太棒了
