[51单片机] 求救LCD1602的问题

[复制链接]
 楼主| 淡定的牙粉 发表于 2015-9-7 19:24 | 显示全部楼层 |阅读模式
本帖最后由 淡定的牙粉 于 2015-9-7 19:26 编辑

我将在STC89C52RC上调试成功的LCD1602程序移植到STC12C5A60S2上,延迟什么的都扩大了;但是只有数字以及标点符号显示正常,但是字母显示的是乱码,这是什么原因如果你有移植成功的程序,可以让我参考一下吗

ayb_ice 发表于 2015-9-8 07:59 | 显示全部楼层
调试吧,
扩大了不等于OK了,移植也不等于成功
NE5532 发表于 2015-9-8 08:43 | 显示全部楼层
如果所有位置上显示数字都可以正常,说明底层传输是OK的,找字符和数字之间的区别把(很有可能是编译问题)。
ningling_21 发表于 2015-9-8 09:19 | 显示全部楼层
贴程序,跟程序有很大关系
 楼主| 淡定的牙粉 发表于 2015-9-9 12:14 | 显示全部楼层
  1. #include "stc12c5a60s2.h"
  2. #include<intrins.h>
  3. typedef unsigned char uchar;

  4. sbit LCD1602_RS=P1^0;
  5. sbit LCD1602_RW=P1^1;
  6. sbit LCD1602_E=P2^5;
  7. sbit du=P2^6;
  8. sbit we=P2^7;

  9. void Delayms(unsigned int ms)
  10. {
  11.     int i,j;
  12.     for(i=ms;i>0;i--)
  13.             for(j=110;j>0;j--);        
  14. }
  15. void CloseSmg()                                   //关数码管
  16. {
  17.         P0=0;
  18.         du=1;
  19.         du=0;
  20. }
  21. void LCD1602_Ready()
  22. {
  23.         P0=0XFF;
  24.         LCD1602_RS=0;
  25.         LCD1602_RW=1;
  26.         LCD1602_E=1;
  27.         while(P0&0X80);
  28.         LCD1602_E=0;
  29. }
  30. void LCD1602_WriteCMD(uchar date)
  31. {
  32.         LCD1602_Ready();         
  33.         LCD1602_RS=0;           
  34.         LCD1602_RW=0;
  35.         P0=date;
  36.         LCD1602_E=1;
  37.         Delayms(5);
  38.         LCD1602_E=0;
  39. }
  40. void LCD1602_WriteDate(uchar date)
  41. {
  42.         LCD1602_Ready();
  43.         LCD1602_RS=1;
  44.         LCD1602_RW=0;
  45.         P0=date;
  46.         LCD1602_E=1;
  47.         Delayms(5);
  48.         LCD1602_E=0;
  49. }

  50. /***********设置光标所处位置**********/
  51. void LCD1602_Position(uchar row,uchar list)        // 光标所处位置
  52. {
  53.         if(row==0) LCD1602_WriteCMD(list|0x80);
  54.         else       LCD1602_WriteCMD(list|0xC0);
  55. }
  56. /*********显示单个字符到LCD1602上**********/
  57. void LCD1602_ShowChar(uchar row,uchar list,uchar address)
  58. {
  59.         LCD1602_Position(row,list);        
  60.         LCD1602_WriteDate(address);
  61. }
  62. /*********显示字符串到LCD1602上**********/
  63. void LCD1602_ShowStr(uchar row,uchar list,uchar *str)  
  64. {
  65.         LCD1602_Position(row,list);
  66.         while(*str!='\0')
  67.                 {
  68.                         LCD1602_WriteDate(*str++);
  69.                 }        
  70. }
  71. /********初始化LCD1602************/
  72. void LCD1602_Init ()
  73. {
  74.         CloseSmg();                                                 //关数码管
  75.         LCD1602_E=0;
  76.         LCD1602_WriteCMD(0x38);                                //数据写入设置
  77.         LCD1602_WriteCMD(0x01);                                //清屏                        
  78.         LCD1602_WriteCMD(0x06);             //光标及液晶屏移动
  79.         LCD1602_WriteCMD(0x0C);                             //光标及液晶屏显示
  80. }
  81. void main()
  82. {
  83.         LCD1602_Init ();
  84.         LCD1602_ShowStr(0,0,"()';123zj");
  85.         while(1);
  86. }
 楼主| 淡定的牙粉 发表于 2015-9-9 12:16 | 显示全部楼层
ningling_21 发表于 2015-9-8 09:19
贴程序,跟程序有很大关系

你好,我已经贴上程序;麻烦您帮我看一下
ningling_21 发表于 2015-9-9 15:18 | 显示全部楼层
淡定的牙粉 发表于 2015-9-9 12:16
你好,我已经贴上程序;麻烦您帮我看一下
  1. lcdwrdata('C');
  2.                                         lcdwrdata('R');
  3.                                         lcdwrdata('C');
  4.                                         lcdwrdata('O');
  5.                                         lcdwrdata('K');


像这样单独显示一个字符能否正常?
 楼主| 淡定的牙粉 发表于 2015-9-9 15:42 | 显示全部楼层
ningling_21 发表于 2015-9-9 15:18
像这样单独显示一个字符能否正常?

不行,数字显示正常,但字母确显示的是符号(如 , ; ? !等等)而不是字母
ningling_21 发表于 2015-9-9 16:26 | 显示全部楼层
淡定的牙粉 发表于 2015-9-9 15:42
不行,数字显示正常,但字母确显示的是符号(如 , ; ? !等等)而不是字母 ...

是不是电路上1602和数码管互相影响
 楼主| 淡定的牙粉 发表于 2015-9-9 16:28 | 显示全部楼层
淡定的牙粉 发表于 2015-9-9 15:42
不行,数字显示正常,但字母确显示的是符号(如 , ; ? !等等)而不是字母 ...

我弄好了,麻烦你了;原来单片机的一个IO口坏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

34

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部