找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2116|回复: 10
收起左侧

单片机ht1621驱动问题

[复制链接]
ID:1059305 发表于 2023-3-24 09:01 | 显示全部楼层 |阅读模式
50黑币
问题:以下是我写的ht1621驱动,驱动后显示屏显示图像不对,目前怀疑send_bit函数不能准确发送相应数据,求大家帮忙解答一下,谢谢。PS附件为数据手册

单片机源程序如下:
  1. #include "lcd.h"

  2. void delay(void)//延时10us
  3. {
  4.       int i;
  5.       for(i=0;i<10;i++)
  6.      {
  7.            __NOP();
  8.       }
  9. }

  10. void send_bit(uint8_t data,uint8_t cnt) //data为发送数据,cnt为发送位数
  11. {
  12.        int i;
  13.        for(i=0;i<cnt;i++)
  14.      {
  15.           WR_L;
  16.           delay();
  17.            if(data&0x80)
  18.            {
  19.                DATA_H;
  20.             }
  21.            else
  22.            {
  23.                  DATA_L;
  24.             }
  25.             WR_H;
  26.             delay();
  27.             data<<=1;
  28.          }
  29. }

  30. void write_cmd(uint8_t data) //发送命令
  31. {
  32.         CS_L;
  33.        send_bit(0x80,3);
  34.        send_bit(data,9);
  35.        delay();
  36.        CS_H;
  37. }

  38. void write_data(uint8_t addr,uint8_t data)
  39. {
  40.           CS_L;
  41.          addr<<=2;
  42.           data<<=4;
  43.           send_bit(0xa0,3);
  44.            send_bit(addr,6);
  45.            send_bit(data,4);
  46.           delay();
  47.             CS_H;
  48. }

  49. void clean_screen(void)
  50. {
  51.       int i,temp=0;
  52.        for(i=0;i<32;i++)
  53.       {
  54.            write_data(temp,0);
  55.              temp++;
  56.        }
  57. }

  58. void show_all_screen(void)
  59. {
  60.         int i,temp=0;
  61.           for(i=0;i<32;i++)
  62.        {
  63.           write_data(temp,1);
  64.           temp++;
  65.         }
  66. }

  67. void LCD_init(void)
  68. {
  69.      write_cmd(SYS_EN);/ /打开系统振荡器
  70.      write_cmd(RC256);//内部时钟
  71.      write_cmd(BIAS);//1/3duty  4com
  72.      write_cmd(LCD_ON);打开LCD偏压
  73.      clean_screen();
  74. }
复制代码
以下是头文件里面一些定义
  1. #define COMMAND        0x80  // 命令码-100
  2. #define WRITE_DATA     0xA0  //写命令-101
  3. #define READ_DATA      0xC0  //读命令-110

  4. #define BIAS           0X52  // 1/3duty  4com
  5. #define SYS_EN         0x02  // 打开系统振荡器
  6. #define LCD_ON         0x06  // 打开LCD偏压
  7. #define RC256          0x30  // 内部时钟

复制代码





DJM6040规格书.pdf

3.26 MB, 下载次数: 7

最佳答案

查看完整内容

1.代码不会撸,你的send_bit就是高位在前的发送,看着跟时序能对上; 2.注意下这货的ADDRESS和DATA发送数据不一样,ADDRESS高位在前,DATA是低位在前。 3.没有细细看手册,不行编不下去了...
回复

使用道具 举报

ID:45879 发表于 2023-3-24 09:01 | 显示全部楼层
1.代码不会撸,你的send_bit就是高位在前的发送,看着跟时序能对上;
2.注意下这货的ADDRESS和DATA发送数据不一样,ADDRESS高位在前,DATA是低位在前。
3.没有细细看手册,不行编不下去了...
回复

使用道具 举报

ID:195496 发表于 2023-3-24 13:17 | 显示全部楼层
1621驱动不难,主要难点在取显示字模上,你要有实物才能更好进行程序调试,我没有实物,只能帮到这里
回复

使用道具 举报

ID:1059305 发表于 2023-3-24 16:52 | 显示全部楼层
yueguang3048 发表于 2023-3-24 10:59
1.代码不会撸,你的send_bit就是高位在前的发送,看着跟时序能对上;
2.注意下这货的ADDRESS和DATA发送数 ...

我是菜狗,我之前没注意到,现在我重新写了,但还是不行,现在什么都没有显示

  1. void write_cmd(uint8_t cmd)
  2. {
  3.         int i;
  4.         uchar j=0x80;
  5.         CS_L;
  6.         for(i=0;i<3;i++)
  7.         {
  8.                 if(j&0x80)
  9.                 {
  10.                         DATA_H;
  11.                 }
  12.                 else
  13.                 {
  14.                         DATA_L;
  15.                 }
  16.                 WR_L;
  17.                 delay();
  18.                 WR_H;
  19.                 delay();
  20.                 j<<=1;
  21.         }
  22.         for(i=0;i<9;i++)
  23.         {
  24.                 if(cmd&0x80)
  25.                 {
  26.                         DATA_H;
  27.                 }
  28.                 else
  29.                 {
  30.                         DATA_L;
  31.                 }
  32.                 WR_L;
  33.                 delay();
  34.                 WR_H;
  35.                 delay();
  36.                 cmd<<=1;
  37.         }
  38.         CS_H;
  39. }

  40. void write_data(uint8_t addr,uint8_t data)
  41. {
  42.         int i;
  43.         uchar j=0xa0;
  44.         CS_L;
  45.         for(i=0;i<3;i++)
  46.         {
  47.                 if(j&0x80)
  48.                 {
  49.                         DATA_H;
  50.                 }
  51.                 else
  52.                 {
  53.                         DATA_L;
  54.                 }
  55.                 WR_L;
  56.                 delay();
  57.                 WR_H;
  58.                 delay();
  59.                 j<<=1;
  60.         }
  61.         addr<<=2;
  62.         for(i=0;i<6;i++)
  63.         {
  64.                 if(addr&0x80)
  65.                 {
  66.                         DATA_H;
  67.                 }
  68.                 else
  69.                 {
  70.                         DATA_L;
  71.                 }
  72.                 WR_L;
  73.                 delay();
  74.                 WR_H;
  75.                 delay();
  76.                 addr<<=1;
  77.         }

  78.         for(i=0;i<4;i++)
  79.         {
  80.                 if(data&0x01)
  81.                 {
  82.                         DATA_H;
  83.                 }
  84.                 else
  85.                 {
  86.                         DATA_L;
  87.                 }
  88.                 WR_L;
  89.                 delay();
  90.                 WR_H;
  91.                 delay();
  92.                 data>>=1;
  93.         }
  94.         CS_H;
  95. }
复制代码
回复

使用道具 举报

ID:1059305 发表于 2023-3-24 16:55 | 显示全部楼层
大漠落日 发表于 2023-3-24 13:17
1621驱动不难,主要难点在取显示字模上,你要有实物才能更好进行程序调试,我没有实物,只能帮到这里

我有实物调试,但就是不行。明明感觉已经跟住时序发送数据了
回复

使用道具 举报

ID:1067559 发表于 2023-3-24 17:41 | 显示全部楼层
这个简单,我知道是哪里的问题,你关闭正常,点亮不正常
回复

使用道具 举报

ID:1059305 发表于 2023-3-25 08:56 | 显示全部楼层
13510432506 发表于 2023-3-24 17:41
这个简单,我知道是哪里的问题,你关闭正常,点亮不正常

好像是关闭和点亮都不正常
回复

使用道具 举报

ID:1059305 发表于 2023-3-25 08:59 | 显示全部楼层
谢谢大家!!问题已经找出了,有两个问题,第一个问题是像二楼说的ADDRESS和DATA发送数据不一样,ADDRESS高位在前,DATA是低位在前,我改了代码后发现不行,又去看了数据手册,发现第二个问题我的命令码写错了,现在已经调试成功了。
回复

使用道具 举报

ID:45879 发表于 2023-3-25 09:21 | 显示全部楼层
LLL2022 发表于 2023-3-25 08:59
谢谢大家!!问题已经找出了,有两个问题,第一个问题是像二楼说的ADDRESS和DATA发送数据不一样,ADDRESS高 ...

下次调试时,配个逻辑分析仪,会事半功倍的。
回复

使用道具 举报

ID:466997 发表于 2024-1-2 23:01 | 显示全部楼层
我也调了很久了,按楼主以上代码跑,还是没有点亮。
楼主提及到的第二个问题命令代码错误,具体是怎么样修正的?
我的命令代码如下:
#define SYSEN      0x01
#define RC256K     0x18
#define BIAS       0x28|0x01 //0x52       //0x28
#define LCDON      0x03
#define SYSDIS     0x00
#define WDTDIS     0x0A
#define LCDOFF     0x02
回复

使用道具 举报

ID:466997 发表于 2024-1-2 23:19 | 显示全部楼层
  1. void HT1621_1_Init(void)  
  2. {
  3.         //HT1621B_1_CS = 1;
  4.         HT1621B_CS_SET();
  5.         //HT1621B_1_WR = 1;
  6.         HT1621B_WR_SET();
  7.         //HT1621B_1_DA = 1;
  8.         HT1621B_DA_SET();
  9.         delay100us(2);
  10.          
  11.         HT1621_1_WriteCMD(SYSDIS);         
  12.         delay10us(1);
  13.         //HT1621_1_WriteCMD(0x02);
  14.         delay10us(1);
  15.         HT1621_1_WriteCMD(SYSEN);
  16.         HT1621_1_WriteCMD(RC256K);
  17.         HT1621_1_WriteCMD(WDTDIS);
  18.         HT1621_1_WriteCMD(BIAS);
  19.         HT1621_1_WriteCMD(LCDON);
  20.        
  21.         //HT1621_1_WriteCMD(0xE3);
  22.         Clean_Screen();
  23.         //HT1621_1_WriteCMD(LCDOFF);
  24.         STK_BL_OFF();        
  25.         }
复制代码
  1. <blockquote>void Clean_Screen(void)
复制代码
HT1621_1_WriteOneData(temp,0);HT1621_1_WriteCMD(SYSEN);
与楼主函数相同,目前还是无法点亮。请教一下哪里出问题了。谢谢!


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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