各位有对LCD1602屏比较熟悉的么 我的屏点的时候显示出现了...

2020-02-01 16:21发布

1602的液晶  采用4位驱动的方式 这个屏只能4位驱动
显示出来的字母数字都是镜像的 摸不清楚怎么回事 有没有懂的朋友指点指点!
   write_com(0x33);          //16*2显示,5*7点阵,8位数据
    delay(100);
    write_com(0x32);         
    delay(100);
    write_com(0x28);         
    delay(100);
    write_com(0x0c);          //显示开,关光标
    delay(100);
                write_com(0x04);          //移动光标
    delay(100);
                while(0);
                write_com(0x01);          //清除LCD的显示内容
    delay(100);

以上是初始化部分的函数!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
HeP028
1楼-- · 2020-02-01 17:27
  1. #include "LCD1602.H"

  2. //mode:bit 4

  3. #define LCD_DATA_DDR  DDRF
  4. #define        LCD_DATA_PORT PORTF
  5. #define LCD_RS_DDR          DDRF
  6. #define LCD_RS_PORT          PORTF
  7. #define LCD_EN_DDR          DDRF
  8. #define LCD_EN_PORT          PORTF
  9. #define        LCD_RS                  BIT(PF2)
  10. #define LCD_EN            BIT(PF3)
  11. #define LCD_DATA          BIT(PF2) | BIT(PF2) | BIT(PF2) | BIT(PF2)       

  12. void LCDWriteEn(void)
  13. {
  14.         LCD_EN_PORT |=  LCD_EN;                                //en  high
  15.         delayNus(10);
  16.         LCD_EN_PORT &= ~LCD_EN;                                //en  low
  17. }

  18. void LCDWriteCommandorWriteData(unsigned char CommandorData,unsigned char Mode)       
  19. {
  20.         delayNus(26);
  21.         switch (Mode)
  22.         {
  23.                  case 0:        LCD_RS_PORT &= ~LCD_RS;        break;  //RS在写命令时候为L
  24.                 case 1:        LCD_RS_PORT |=  LCD_RS;        break;  //RS在写命令时候为H
  25.         }       
  26.         LCD_DATA_PORT &= 0X0F;
  27.         LCD_DATA_PORT |= CommandorData & 0XF0;                //把数据准备好
  28.         LCDWriteEn();
  29.         CommandorData = CommandorData << 4;
  30.         LCD_DATA_PORT &= 0x0f;
  31.         LCD_DATA_PORT |= CommandorData & 0XF0;                //把数据准备好
  32.         LCDWriteEn();
  33. }


  34. void LCDUsePortInitial(void)
  35. {
  36.         LCD_DATA_DDR |= LCD_DATA;
  37.         LCD_RS_DDR   |= LCD_RS;
  38.         LCD_EN_DDR   |= LCD_EN;
  39. }

  40. //--------------------------------------------------
  41. //函数名称:初始化
  42. //            ->RS RW D7 D6 D5 D4 D3 D2 D1 D0
  43. //清屏        ->0  0  0  0  0  0  0  0  0  1
  44. //功能设置    ->0  0  0  0  0  0  1  DL N  F
  45. //显示开关控制->0  0  0  0  1  D  C  B  *  *
  46. //输入方式    ->0  0  0  0  0  0  0  1 I/D S
  47. //--------------------------------------------------
  48. void LCDdisplayInitial(void)
  49. {
  50.         LCDWriteCommandorWriteData(0x28,0);        LCDWriteEn();
  51.         LCDWriteCommandorWriteData(0x28,0); delayNms(10);       
  52.         LCDWriteCommandorWriteData(0x01,0);        delayNms(10);
  53.         LCDWriteCommandorWriteData(0x0c,0); delayNms(10);
  54. }


  55. //----------------------------------
  56. //函数名称:指定位置写数据
  57. //入口参数:unsigned char X,unsigned char Y,unsigned char dataSend
  58. //返回的值:--
  59. //----------------------------------
  60. void LCDWriteoneChar(unsigned char X,unsigned char Y,unsigned char dataSend)
  61. {          
  62.         LCDWriteCommandorWriteData((0x80 + (Y << 6) + X),0);
  63.         LCDWriteCommandorWriteData(dataSend,1);
  64. }                                                                  

  65. //----------------------------------
  66. //函数名称:写字符串
  67. //入口参数:unsigned char X,unsigned char Y,unsigned char *dataSend
  68. //返回的值:--
  69. //----------------------------------
  70. void LCDWriteString(unsigned char X,unsigned char Y,unsigned char *dataSend)
  71. {         
  72.         LCDWriteCommandorWriteData((0x80 + (Y << 6) + X),0);
  73.     while(*dataSend != '')
  74.         {       
  75.                 LCDWriteCommandorWriteData(*dataSend,1);
  76.                 dataSend++;
  77.         }
  78. }

  79. //----------------------------------
  80. //函数名称:写自定义字符
  81. //入口参数:unsigned char Address,unsigned char *Per
  82. //返回的值:--
  83. //备    注:地址Address范围<0-7>
  84. //----------------------------------
  85. void        LCDWriteCgram(unsigned char Address,unsigned char *Per)
  86. {
  87.                 if (Address > 7)
  88.                         {
  89.                                 Address = 0;
  90.                         }
  91.                 LCDWriteCommandorWriteData(0x40 + (Address * 8),0);        //写入自定义数据初始地址
  92.                 while(*Per != '')
  93.                         {
  94.                                 LCDWriteCommandorWriteData(*Per,1);                        //写如自定义数据
  95.                                 Per++;
  96.                         }
  97. }                 
复制代码

抄的~参考吧。可用
caoweidongediy
2楼-- · 2020-02-01 19:20
HeP028 发表于 2013-1-8 22:23
抄的~参考吧。可用

谢谢LS的这位朋友 屏现在能正常的点 只是点出来的字符是镜像的! 查阅了很多1602的寄存器配置中没有对字符做镜像处理的配置!所以觉得无从下手!

一周热门 更多>