微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个关于无字库12864的奇怪的问题。。

一个关于无字库12864的奇怪的问题。。

时间:10-02 整理:3721RD 点击:
我想在一个无字库的12864上显示出一条竖线。但是总是有断点。不过在仿真上确实正确的。代码在下面,望大神帮我看看。代码是网上下的。

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int          

  4. sbit EN=P1^6;
  5. sbit RW=P2^1;
  6. sbit RS=P2^0;
  7. sbit CS2=P2^3;
  8. sbit CS1=P2^2;                         //端口定义
  9. /***********************************延时大约1ms程序**********************************/
  10. void delay1ms(int j)
  11. {
  12.         int aa,kk;
  13.         for(aa=0;aa<j;aa++)
  14.                 for(kk=120;kk>0;kk--);
  15. }
  16. /**********************************以下是12864液晶驱动函数**************************/
  17. void chekbusy12864(void)
  18. {
  19.         uchar dat;
  20.           RS=0;      
  21.           RW=1;      
  22.         do
  23.         {
  24.                   P0=0x00;                       
  25.                    EN=1;
  26.                    dat=P0&0x80;
  27.                    //delay1ms(2);                         //注意这里:如果这里有延时,显示的时候一顿一顿的!
  28.                    EN=0;
  29.           }while(dat!=0x00);
  30. }
  31. /**************************************12864液晶选屏********************************/
  32. void choose12864(uchar i)
  33. {                                                 
  34.         switch (i)                         
  35.           {
  36.             case 0: CS1=1;CS2=0;break;                //左屏
  37.             case 1: CS1=0;CS2=1;break;                //右屏
  38.                 case 2: CS1=1;CS2=1;break;           //全屏
  39.                 default: break;
  40.           }
  41. }
  42. /******写命令*****/
  43. void write_command(uchar cmd)                //写命令
  44. {
  45.         chekbusy12864();
  46.         RS=0;                    //指令模式
  47.           RW=0;             //写模式
  48.           EN=1;
  49.           P0=cmd;
  50.           //delay1ms(1);   注意这里:有延时的话,他会一顿一顿的!
  51.           EN=0;
  52. }
  53. /****************************************写数据*************************************/
  54. void  write_shuju(uchar dat)
  55. {
  56.         chekbusy12864();
  57.           RS=1;
  58.           RW=0;
  59.           EN=1;
  60.           P0=dat;
  61.           //delay1ms(1);        注意这里,有延时的话,他会一顿一顿的!
  62.           EN=0;
  63. }
  64. /***************************************清屏***************************************/
  65. void clear12864()
  66. {
  67.         uchar i,j;
  68.         CS1=1;
  69.         CS2=1;
  70.         for(i=0;i<8;i++)
  71.         {
  72.                 write_command(0xb8+i);          //页的首地址为0xb8...左半屏的页的首地址为0xb8,右半屏页的首地址也为0xb8
  73.                 write_command(0x40)        ;          //一定要注意:列的首地址为0x40,且列地址会自动加1
  74.                 for(j=0;j<64;j++)
  75.                 {
  76.                         write_shuju(0x00); //清零....其实这里还可以注意到:列地址自动加1从0~3FH。选择的是全屏,左半屏列地址0~3FH,右半屏列地址0~3FH同时清0!
  77.                 }
  78.         }
  79. }
  80. /****************************************初始化**************************************/
  81. void init12864(void)
  82. {
  83.         chekbusy12864();
  84.           write_command(0xc0);          //从第零行开始显示
  85.           write_command(0x3f);
  86.         clear12864();          //LCD显示RAM中的内容即开显示
  87. }

  88. /***************************************读数据************************************/
  89. uchar read_shuju(uchar page,uchar arrange)  //page页地址.arrange列地址)
  90. {
  91.         uchar dat;
  92.           chekbusy12864();
  93.           write_command(page+0xb8);
  94.         write_command(arrange+0x40);
  95.           //EX0=0;                                               
  96.           P0=0xff;
  97.           RW=1;
  98.           RS=1;
  99.           EN=1;
  100.         dat=P0;
  101.           EN=0;       
  102.                            
  103.           EN=1;                                //12864读数据时第二次读才有效,第一次读取的值不采集
  104.           dat=P0;
  105.           EN=0;
  106.           return(dat);
  107.           //EX0=1;
  108. }
  109. /***************************************显示一个点********************************/
  110. void Disp(uchar x,uchar y)
  111. {
  112.   uchar date;
  113.   if(x>63)
  114.   {
  115.     choose12864(1);
  116.         x=x-64;
  117.   }
  118.   else
  119.   {
  120.     choose12864(0);
  121.   }
  122.   date=read_shuju(y/8,x);
  123.   write_command(0x40|x);
  124.   write_command(0xb8|y/8);
  125.   write_shuju((1<<(y%8))|date);
  126. }
  127. /***************************************清除一个点**********************************/
  128. void Misp(uchar x,uchar y)
  129. {
  130.   uchar date,j;
  131.   if(x>63)
  132.   {
  133.     choose12864(1);
  134.         x=x-64;
  135.   }
  136.   else
  137.   {
  138.     choose12864(0);
  139.   }
  140.   date=read_shuju(y/8,x);
  141.   write_command(0x40|x);
  142.   write_command(0xb8|y/8);
  143.   j=~(1<<y%8);
  144.   write_shuju(date&j);
  145. }


  146. void main()
  147. {
  148.         uchar i;
  149.         choose12864(2);
  150.           init12864();

  151. //        Disp(10,10);
  152. //        Disp(10,11);
  153. //        Disp(10,12);
  154. //        Disp(10,13);
  155. //        Disp(10,14);
  156.        
  157. /*-----------------------------画两条竖线--------------------------*/
  158.   for(i=0;i<59;i++)
  159.   {
  160.         Disp(30,1+i);                         //在列30上,从行1~59画一条竖线
  161. //        Disp(127,1+i);                        //在列127上,从行1~59画一条竖线
  162.   }
  163. /*-----------------------------画两条横线---------------------------*/
  164. //  for(i=0;i<98;i++)
  165. //  {
  166. //    Disp(30+i,1);                  //在行1上,从列30~127画一条横线
  167. //        Disp(30+i,59);             //在行59上,从列30~127画一条横线
  168. //  }
  169.         while(1);
  170. }

复制代码

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int          

  4. sbit EN=P1^6;
  5. sbit RW=P2^1;
  6. sbit RS=P2^0;
  7. sbit CS2=P2^3;
  8. sbit CS1=P2^2;                         //端口定义
  9. /***********************************延时大约1ms程序**********************************/
  10. void delay1ms(int j)
  11. {
  12.         int aa,kk;
  13.         for(aa=0;aa<j;aa++)
  14.                 for(kk=120;kk>0;kk--);
  15. }
  16. /**********************************以下是12864液晶驱动函数**************************/
  17. void chekbusy12864(void)
  18. {
  19.         uchar dat;
  20.           RS=0;      
  21.           RW=1;      
  22.         do
  23.         {
  24.                   P0=0x00;                       
  25.                    EN=1;
  26.                    dat=P0&0x80;
  27.                    //delay1ms(2);                         //注意这里:如果这里有延时,显示的时候一顿一顿的!
  28.                    EN=0;
  29.           }while(dat!=0x00);
  30. }
  31. /**************************************12864液晶选屏********************************/
  32. void choose12864(uchar i)
  33. {                                                 
  34.         switch (i)                         
  35.           {
  36.             case 0: CS1=1;CS2=0;break;                //左屏
  37.             case 1: CS1=0;CS2=1;break;                //右屏
  38.                 case 2: CS1=1;CS2=1;break;           //全屏
  39.                 default: break;
  40.           }
  41. }
  42. /******写命令*****/
  43. void write_command(uchar cmd)                //写命令
  44. {
  45.         chekbusy12864();
  46.         RS=0;                    //指令模式
  47.           RW=0;             //写模式
  48.           EN=1;
  49.           P0=cmd;
  50.           //delay1ms(1);   注意这里:有延时的话,他会一顿一顿的!
  51.           EN=0;
  52. }
  53. /****************************************写数据*************************************/
  54. void  write_shuju(uchar dat)
  55. {
  56.         chekbusy12864();
  57.           RS=1;
  58.           RW=0;
  59.           EN=1;
  60.           P0=dat;
  61.           //delay1ms(1);        注意这里,有延时的话,他会一顿一顿的!
  62.           EN=0;
  63. }
  64. /***************************************清屏***************************************/
  65. void clear12864()
  66. {
  67.         uchar i,j;
  68.         CS1=1;
  69.         CS2=1;
  70.         for(i=0;i<8;i++)
  71.         {
  72.                 write_command(0xb8+i);          //页的首地址为0xb8...左半屏的页的首地址为0xb8,右半屏页的首地址也为0xb8
  73.                 write_command(0x40)        ;          //一定要注意:列的首地址为0x40,且列地址会自动加1
  74.                 for(j=0;j<64;j++)
  75.                 {
  76.                         write_shuju(0x00); //清零....其实这里还可以注意到:列地址自动加1从0~3FH。选择的是全屏,左半屏列地址0~3FH,右半屏列地址0~3FH同时清0!
  77.                 }
  78.         }
  79. }
  80. /****************************************初始化**************************************/
  81. void init12864(void)
  82. {
  83.         chekbusy12864();
  84.           write_command(0xc0);          //从第零行开始显示
  85.           write_command(0x3f);
  86.         clear12864();          //LCD显示RAM中的内容即开显示
  87. }

  88. /***************************************读数据************************************/
  89. uchar read_shuju(uchar page,uchar arrange)  //page页地址.arrange列地址)
  90. {
  91.         uchar dat;
  92.           chekbusy12864();
  93.           write_command(page+0xb8);
  94.         write_command(arrange+0x40);
  95.           //EX0=0;                                               
  96.           P0=0xff;
  97.           RW=1;
  98.           RS=1;
  99.           EN=1;
  100.         dat=P0;
  101.           EN=0;       
  102.                            
  103.           EN=1;                                //12864读数据时第二次读才有效,第一次读取的值不采集
  104.           dat=P0;
  105.           EN=0;
  106.           return(dat);
  107.           //EX0=1;
  108. }
  109. /***************************************显示一个点********************************/
  110. void Disp(uchar x,uchar y)
  111. {
  112.   uchar date;
  113.   if(x>63)
  114.   {
  115.     choose12864(1);
  116.         x=x-64;
  117.   }
  118.   else
  119.   {
  120.     choose12864(0);
  121.   }
  122.   date=read_shuju(y/8,x);
  123.   write_command(0x40|x);
  124.   write_command(0xb8|y/8);
  125.   write_shuju((1<<(y%8))|date);
  126. }
  127. /***************************************清除一个点**********************************/
  128. void Misp(uchar x,uchar y)
  129. {
  130.   uchar date,j;
  131.   if(x>63)
  132.   {
  133.     choose12864(1);
  134.         x=x-64;
  135.   }
  136.   else
  137.   {
  138.     choose12864(0);
  139.   }
  140.   date=read_shuju(y/8,x);
  141.   write_command(0x40|x);
  142.   write_command(0xb8|y/8);
  143.   j=~(1<<y%8);
  144.   write_shuju(date&j);
  145. }


  146. void main()
  147. {
  148.         uchar i;
  149.         choose12864(2);
  150.           init12864();

  151. //        Disp(10,10);
  152. //        Disp(10,11);
  153. //        Disp(10,12);
  154. //        Disp(10,13);
  155. //        Disp(10,14);
  156.        
  157. /*-----------------------------画两条竖线--------------------------*/
  158.   for(i=0;i<59;i++)
  159.   {
  160.         Disp(30,1+i);                         //在列30上,从行1~59画一条竖线
  161. //        Disp(127,1+i);                        //在列127上,从行1~59画一条竖线
  162.   }
  163. /*-----------------------------画两条横线---------------------------*/
  164. //  for(i=0;i<98;i++)
  165. //  {
  166. //    Disp(30+i,1);                  //在行1上,从列30~127画一条横线
  167. //        Disp(30+i,59);             //在行59上,从列30~127画一条横线
  168. //  }
  169.         while(1);
  170. }

复制代码

太棒了,太棒了太棒了太棒了太棒了太棒了太棒了太棒了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top