找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7926|回复: 25
打印 上一主题 下一主题
收起左侧

51单片机开发板的LCD9648菜单程序无法正常显示

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 5 黑币奖励! 每人限 2 次(中奖概率 90%)
跳转到指定楼层
楼主
普中51单片机,配的LCD9648的屏。直接下载的例程,但无法正常显示。
请那位高手帮忙看下代码有什么问题。

main.c
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit CS0  = P0^0;                //????
  4. sbit RST  = P0^1;                //?′??
  5. sbit RS   = P2^7;                 //êy?Y?üá???????
  6. sbit SCL  = P2^6;                //SPIê±?ó??
  7. sbit SDA  = P2^5;                //SPIêy?Y??

  8. sbit KEY_ADD=P3^3; //按键
  9. sbit KEY_DEC=P3^4;

  10. unsigned char curr,currold;//全局变量,当前箭头位置



  11. unsigned char code user16x16[]={
  12. 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
  13. 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,
  14. };



  15. unsigned char code *MainMenu[]=
  16. {
  17. {"  1.设置1"},
  18. {"  2.设置2"},
  19. {"  3.设置3"},
  20. {"  4.设置4"},
  21. {"  5.设置5"},
  22. {"  6.设置6"},
  23. {"  7.设置7"},
  24. {"  8.设置8"},
  25. {"  9.设置9"},
  26. {"  0.设置0"},
  27. };

  28. void Delay10ms(unsigned int c)   //?ó2? 0us
  29. {
  30.     unsigned char a,b;
  31.     for(;c>0;c--)
  32.         for(b=38;b>0;b--)
  33.             for(a=130;a>0;a--);
  34. }


  35. void  SendDataSPI(unsigned char dat)
  36. {  
  37.    unsigned char i;
  38.    
  39.    for(i=0; i<8; i++)                        
  40.    {  
  41.       if( (dat&0x80)!=0 ) SDA = 1;
  42.         else SDA = 0;

  43.       dat <<= 1;

  44.           SCL = 0;
  45.       SCL = 1;                        
  46.    }
  47. }

  48. void WriteComm(unsigned int i)
  49. {

  50.     CS0 = 0;
  51.         RS  = 0;

  52.         SendDataSPI(i);

  53.         CS0 = 1;

  54. }
  55. void WriteData(unsigned char i)
  56. {
  57.     CS0 = 0;
  58.         RS  = 1;

  59.         SendDataSPI(i);

  60.         CS0 = 1;
  61. }

  62. void LCD_Init(void)
  63. {
  64.         unsigned int i;
  65.         //CS0=0;
  66.         
  67.         RST=1;  
  68.         for(i = 0; i < 1000; i++);
  69.         
  70.         RST=0;
  71.         for(i = 0; i < 1000; i++);

  72.         RST=1;
  73.         for(i = 0; i < 1000; i++);

  74.     WriteComm(0xe2);                  //èí?t?′??
  75.         WriteComm(0xc8);                  //0xC8??í¨·??ò????????·′?ò£?0xC0?a?y3£·??ò
  76.         WriteComm(0xa0);                  //0xA0??·??ò?????y3£·??ò£¨0xA1?a·′·??ò
  77.         WriteComm(0x2f);
  78.         WriteComm(0x26);
  79.         WriteComm(0x81);                  //±3?°1a??±è?è
  80.         WriteComm(0x10);
  81.         WriteComm(0xaf);                  //?a????ê?

  82. }


  83. void Clear()
  84. {
  85.         unsigned char i,j;
  86.         
  87.         for(i=0; i < 9; i++)
  88.         {
  89.                 WriteComm(0x40);
  90.                 WriteComm(0xb0+i);
  91.                 WriteComm(0x10);
  92.                 WriteComm(0x00);
  93.                
  94.                 for(j = 0; j < 96; j++)
  95.                 {
  96.                         WriteData(0x00);        
  97.                 }        
  98.         }               
  99. }

  100. /***********************************************
  101.                 用户自定义字符
  102. ***********************************************/


  103. void CGRAM()
  104. {
  105.      int i;
  106. //     WriteComm(0x30);
  107.    
  108.      WriteComm(0x40);
  109.      for(i=0;i<16;i++)
  110.        {
  111.         WriteData(user16x16[i*2]);
  112.         WriteData(user16x16[i*2+1]);
  113.       }
  114. }  



  115. /***********************************************
  116.                显示用户自定义字符
  117. ***********************************************/
  118. void DisplayCGRAM(unsigned char x,unsigned char y)
  119. {
  120. switch(y)
  121.      {
  122.    case 1: WriteComm(0xb0+x);break;
  123.    case 2: WriteComm(0xb1+x);break;
  124.    case 3: WriteComm(0xb2+x);break;
  125. //   case 4: WriteComm(0x98+x);break;
  126.       default:break;
  127.   }
  128.     WriteData(00);
  129.     WriteData(00);
  130. }         

  131. /***********************************************
  132.                   显示字符串
  133.             x:横坐标值,范围0~8
  134.             y:纵坐标值,范围1~4
  135. ***********************************************/
  136. void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
  137. {
  138. switch(y)
  139.      {
  140.    case 1: WriteComm(0xb0+x);break;
  141.    case 2: WriteComm(0xb1+x);break;
  142.    case 3: WriteComm(0xb2+x);break;
  143. //            case 4: WriteComm(0x98+x);break;
  144.       default:break;
  145.   }
  146. while(*s>0)
  147.    {
  148.       WriteData(*s);
  149.       s++;
  150.       Delay10ms(50);
  151.    }
  152. }

  153. /***********************************************
  154.                      清屏
  155. ***********************************************/
  156. void ClrScreen()
  157. {
  158.    WriteComm(0x01);
  159.    Delay10ms(15);
  160. }
  161.    
  162. /***********************************************
  163.                调用显示更新
  164. ***********************************************/
  165. void DisplayUpdata(void)
  166. {   
  167.     unsigned char num;
  168.   ClrScreen();
  169. num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判断数组中数值个数
  170. if((0+(curr/4)*4)<num)
  171.       LCD_PutString(0,1,MainMenu[0+(curr/4)*4]);
  172. else //如果超出数组最大元素,则写空信息,不判断此信息可能会出现乱码
  173.    LCD_PutString(0,1,"");
  174. if((1+(curr/4)*4)<num)
  175.    LCD_PutString(0,2,MainMenu[1+(curr/4)*4]);
  176. else
  177.    LCD_PutString(0,2,"");
  178. if((2+(curr/4)*4)<num)
  179.    LCD_PutString(0,3,MainMenu[2+(curr/4)*4]);
  180. else
  181.    LCD_PutString(0,3,"");
  182. if((3+(curr/4)*4)<num)
  183.    LCD_PutString(0,4,MainMenu[3+(curr/4)*4]);
  184. else
  185.    LCD_PutString(0,4,"");
  186. DisplayCGRAM(0,curr%4+1);
  187. }

  188. /***********************************************
  189.                  MAIN
  190. ***********************************************/
  191. void main()
  192. {
  193.    LCD_Init();
  194.    CGRAM(); //写入自定义字符
  195.    DisplayUpdata();
  196.    while(1)
  197.    {     
  198.      if(curr!=currold) //光标位置变化,则更新显示
  199.       {
  200.        DisplayUpdata();
  201.        currold=curr;
  202.       }

  203.    if(!KEY_ADD)  
  204.     {
  205.      Delay10ms(10);
  206.      if(!KEY_ADD)     
  207.     {
  208.         while(!KEY_ADD);
  209.       {
  210.     if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)
  211.      //判断数组中数值个数
  212.      { curr++; }
  213.       }
  214.     }
  215. }

  216.   if(!KEY_DEC)
  217.     {
  218.      Delay10ms(10);
  219.      if(!KEY_DEC)     
  220.     {
  221.         while(!KEY_DEC);
  222.       {
  223.        if(curr>0)
  224.      { curr--; }
  225.     }
  226.     }
  227. }  
  228.   }
  229. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2021-1-17 08:16 来自手机 | 只看该作者
看屏幕出现那么多黑点,可能已经挂了
回复

使用道具 举报

板凳
ID:462723 发表于 2021-1-17 09:59 | 只看该作者
我写入显示图片或者文字的程序,都可以正常显示。
回复

使用道具 举报

地板
ID:235954 发表于 2021-1-19 08:16 | 只看该作者
屏幕初始化卡住
回复

使用道具 举报

5#
ID:462723 发表于 2021-1-19 12:57 | 只看该作者
请问能帮忙指出一下屏幕初始化的问题吗?
回复

使用道具 举报

6#
ID:748788 发表于 2021-1-20 08:34 | 只看该作者
在我的普中a5上试了一下,结果也是花屏,与你那个差不多。看来是程序的问题
回复

使用道具 举报

7#
ID:748788 发表于 2021-1-20 11:00 | 只看该作者
又用排除法将main里的“CGRAM(); //写入自定义字符”一句注掉,就不会花屏,怀疑该函数将数据写到了不该写入的地方。
回复

使用道具 举报

8#
ID:462723 发表于 2021-1-20 14:08 | 只看该作者
我将main里的“CGRAM(); ”注掉了。但仍旧出现花屏。
回复

使用道具 举报

9#
ID:879166 发表于 2021-1-20 14:14 | 只看该作者
图象是静态的还是动态的
回复

使用道具 举报

10#
ID:748788 发表于 2021-1-20 14:46 | 只看该作者
你在初始化后面插入一段延时,看看延时结束之前会不会花屏
回复

使用道具 举报

11#
ID:748788 发表于 2021-1-20 14:56 | 只看该作者
另外先确认你的9648屏有没有插错接口
回复

使用道具 举报

12#
ID:462723 发表于 2021-1-20 17:25 | 只看该作者
屏的接口连接是正确的。因为我写入文字和图片显示程序时,都能正常显示。我试了在初始后面加了不同的延时时间,但仍旧是花屏。
回复

使用道具 举报

13#
ID:462723 发表于 2021-1-20 17:50 | 只看该作者
接口没有插错。因为文字和图片程序,都能正常显示。试了在初始化后面加不同的延时时间,但仍旧是花屏。
回复

使用道具 举报

14#
ID:748788 发表于 2021-1-21 08:34 | 只看该作者

你再看看



回复

使用道具 举报

15#
ID:462723 发表于 2021-1-21 11:59 | 只看该作者
我这个连接口没有错,是连到你发的一个图片的位置。我又下载了文字显示程序试了,可以正常显示。

IMG_20210121_110730.jpg (2.35 MB, 下载次数: 74)

IMG_20210121_110730.jpg
回复

使用道具 举报

16#
ID:748788 发表于 2021-1-21 21:33 | 只看该作者
能正常显示说明两个接口有部分线路相通,不等于另一个接口是多余的。为什么厂家要提供一个12864接口,算计精明的厂家不会随便堆料吧
回复

使用道具 举报

17#
ID:722618 发表于 2021-1-25 12:16 | 只看该作者
将main里的“CGRAM();修改成其他的。另外可能是接触问题,由于显示屏管脚比较多,某一个接触不好也有可能。
回复

使用道具 举报

18#
ID:462723 发表于 2021-1-25 18:47 | 只看该作者
接触应该没问题,因为我试了显示文字和图片,都能正常显示。能具体说一下怎么将main里的“CGRAM();修改成其他的吗?
回复

使用道具 举报

19#
ID:811405 发表于 2021-1-27 11:30 | 只看该作者
屏幕本身如果没有问题,那就是程序问题,我的是屏幕根本没有任何显示
回复

使用道具 举报

20#
ID:462723 发表于 2021-1-28 21:08 | 只看该作者
是的,应该是程序的问题。有那位高手能帮忙看下是什么问题吗?
回复

使用道具 举报

21#
ID:860433 发表于 2021-3-19 02:52 来自手机 | 只看该作者
遇到了同样的问题,错误出在头文件里的字模是写成"字",点阵。而字模提取的软件里生成的直接就是点阵。我刚开始也没注意直接复制粘贴了,找了好久
回复

使用道具 举报

22#
ID:860433 发表于 2021-3-19 03:41 来自手机 | 只看该作者
除此之外,代码还有bug,用lcd9648的话显示不了文字“三”,包括判断和点阵那里都改用“③”,屏幕里会显示“三”。我已经气个半死了。
回复

使用道具 举报

23#
ID:462723 发表于 2021-3-21 22:42 | 只看该作者
hvdvsjd 发表于 2021-3-19 03:41
除此之外,代码还有bug,用lcd9648的话显示不了文字“三”,包括判断和点阵那里都改用“③”,屏幕里会显示 ...

能帮忙发送一下你修改了的给我吗?
回复

使用道具 举报

24#
ID:884042 发表于 2021-4-11 11:26 | 只看该作者
wwh2382 发表于 2021-1-20 08:34
在我的普中a5上试了一下,结果也是花屏,与你那个差不多。看来是程序的问题

大哥,LCD9648是插在12864上的,你咋整到1602上了呢?
回复

使用道具 举报

25#
ID:884042 发表于 2021-4-11 11:29 | 只看该作者
zhanghu29 发表于 2021-3-21 22:42
能帮忙发送一下你修改了的给我吗?

这是由于KELL软件的BUG,不能显示“三”,要在前面加上'"/",如:/三
回复

使用道具 举报

26#
ID:1019630 发表于 2022-4-19 08:45 | 只看该作者
楼主的lcd9648显示屏还在吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表