搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2013-1-8 21:10:51 | 显示全部楼层 |阅读模式
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);

以上是初始化部分的函数!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-1-8 22:23:56 | 显示全部楼层
  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 != '\0')
  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 != '\0')
  93.                         {
  94.                                 LCDWriteCommandorWriteData(*Per,1);                        //写如自定义数据
  95.                                 Per++;
  96.                         }
  97. }                 
复制代码


抄的~参考吧。可用

出0入0汤圆

 楼主| 发表于 2013-1-8 22:27:40 | 显示全部楼层
HeP028 发表于 2013-1-8 22:23
抄的~参考吧。可用

谢谢LS的这位朋友 屏现在能正常的点 只是点出来的字符是镜像的! 查阅了很多1602的寄存器配置中没有对字符做镜像处理的配置!所以觉得无从下手!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 10:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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