搜索
bottom↓
回复: 17

HT1622驱动

[复制链接]

出0入0汤圆

发表于 2012-8-9 17:30:29 | 显示全部楼层 |阅读模式
本帖最后由 shuxmpx123 于 2012-8-9 17:33 编辑

在网上找了个HT1622的,发现用不了,自己花了2天写了个出来:
  1. #ifndef _HT1622_H_
  2. #define _HT1622_H_

  3. #define HT1622_CS_DDR                 DDRA
  4. #define HT1622_RD_DDR                 DDRA
  5. #define HT1622_WR_DDR                 DDRA
  6. #define HT1622_DATA_DDR         DDRA

  7. #define HT1622_CS_PORT                 PORTA
  8. #define HT1622_RD_PORT                PORTA
  9. #define HT1622_WR_PORT                PORTA
  10. #define HT1622_DATA_PORT        PORTA

  11. #define HT1622_CS_PIN                0x08
  12. #define HT1622_RD_PIN                0x10
  13. #define HT1622_WR_PIN                0x20
  14. #define HT1622_DATA_PIN                0x40


  15. #define HT1622_CS_OUT_HIGH()        (HT1622_CS_PORT |= HT1622_CS_PIN)
  16. #define HT1622_CS_OUT_LOW()                (HT1622_CS_PORT &= ~HT1622_CS_PIN)

  17. #define HT1622_RD_OUT_HIGH()        (HT1622_RD_PORT |= HT1622_RD_PIN)
  18. #define HT1622_RD_OUT_LOW()                (HT1622_RD_PORT &= ~HT1622_RD_PIN)

  19. #define HT1622_WR_OUT_HIGH()        (HT1622_WR_PORT |= HT1622_WR_PIN)
  20. #define HT1622_WR_OUT_LOW()                (HT1622_WR_PORT &= ~HT1622_WR_PIN)

  21. #define HT1622_DATA_OUT_HIGH()        (HT1622_DATA_PORT |= HT1622_DATA_PIN)
  22. #define HT1622_DATA_OUT_LOW()        (HT1622_DATA_PORT &= ~HT1622_DATA_PIN)



  23. #define HT_SYS_DIS                0x00
  24. #define HT_SYS_EN                0x01
  25. #define HT_LCD_OFF                0x02
  26. #define HT_LCD_ON                0x03



  27. void Ht1622_Port_Init(void);

  28. void Lcd_Init(void);
  29. void Lcd_Disp(void);
  30. void Lcd_Clear(uint8_t dat);


  31. void Lcd_Wrcmd(uint8_t cmmd);
  32. void Lcd_Write_Ndata(uint8_t addr,uint8_t *buff,uint8_t num);




  33. #endif



  34. #ifndef _MAIN_H_
  35. #define _MAIN_H_

  36. #define LCD_BUFF_SIZE        64


  37. typedef unsigned char uint8_t;
  38. typedef unsigned int uint16_t;



  39. typedef struct{

  40.         uint8_t lcd_buff[LCD_BUFF_SIZE];
  41.        
  42. }SYS;

  43. extern SYS sys;



  44. #include <avr/io.h>
  45. #include "main.h"
  46. #include "Ht1622.h"



  47. void Ht1622_Port_Init(void)
  48. {
  49.         HT1622_CS_DDR |= HT1622_CS_PIN;       
  50.         HT1622_RD_DDR |= HT1622_RD_PIN;       
  51.         HT1622_WR_DDR |= HT1622_WR_PIN;       
  52.         HT1622_DATA_DDR |= HT1622_DATA_PIN;       

  53.         HT1622_CS_OUT_HIGH();
  54.         HT1622_RD_OUT_HIGH();
  55.         HT1622_WR_OUT_HIGH();
  56.         HT1622_DATA_OUT_HIGH();
  57. }

  58. void Lcd_Wrcmd(uint8_t cmmd)
  59. {
  60.         uint8_t i;
  61.        
  62.         HT1622_DATA_OUT_HIGH();
  63.         HT1622_WR_OUT_LOW();
  64.         HT1622_CS_OUT_LOW();
  65.         asm("nop"); asm("nop"); asm("nop");
  66.         HT1622_WR_OUT_HIGH();        // 1
  67.         asm("nop"); asm("nop"); asm("nop");
  68.         HT1622_WR_OUT_LOW();
  69.         HT1622_DATA_OUT_LOW();
  70.         asm("nop"); asm("nop"); asm("nop");
  71.         HT1622_WR_OUT_HIGH();        // 0
  72.         asm("nop"); asm("nop"); asm("nop");
  73.         HT1622_WR_OUT_LOW();
  74.         asm("nop"); asm("nop"); asm("nop");
  75.         HT1622_WR_OUT_HIGH();        // 0
  76.         asm("nop"); asm("nop"); asm("nop");
  77.         HT1622_WR_OUT_LOW();

  78.         for (i = 0; i < 8; i++)
  79.         {
  80.                 if (cmmd&0x80)
  81.                 {
  82.                         HT1622_DATA_OUT_HIGH();
  83.                 }
  84.                 else
  85.                 {
  86.                         HT1622_DATA_OUT_LOW();
  87.                 }
  88.                 asm("nop"); asm("nop"); asm("nop");
  89.                 HT1622_WR_OUT_HIGH();
  90.                 asm("nop"); asm("nop"); asm("nop");
  91.                 cmmd <<= 1;
  92.                 HT1622_WR_OUT_LOW();
  93.         }
  94.         asm("nop"); asm("nop"); asm("nop");
  95.         HT1622_WR_OUT_HIGH();        //无关位
  96.         asm("nop"); asm("nop"); asm("nop");
  97.         HT1622_CS_OUT_HIGH();  
  98. }

  99. void Lcd_Write_Ndata(uint8_t addr,uint8_t *buff,uint8_t num)
  100. {
  101.         uint8_t i;
  102.         uint8_t j;
  103.         uint8_t dat;
  104.        
  105.         HT1622_DATA_OUT_HIGH();
  106.         HT1622_WR_OUT_LOW();
  107.         HT1622_CS_OUT_LOW();
  108.         asm("nop"); asm("nop"); asm("nop");
  109.         HT1622_WR_OUT_LOW();
  110.         asm("nop"); asm("nop"); asm("nop");
  111.         HT1622_WR_OUT_HIGH();        // 1
  112.         asm("nop"); asm("nop"); asm("nop");
  113.         HT1622_WR_OUT_LOW();
  114.         HT1622_DATA_OUT_LOW();
  115.         asm("nop"); asm("nop"); asm("nop");
  116.         HT1622_WR_OUT_HIGH();        // 0
  117.         asm("nop"); asm("nop"); asm("nop");
  118.         HT1622_WR_OUT_LOW();
  119.         HT1622_DATA_OUT_HIGH();
  120.         asm("nop"); asm("nop"); asm("nop");
  121.         HT1622_WR_OUT_HIGH();        // 1
  122.         asm("nop"); asm("nop"); asm("nop");
  123.         HT1622_WR_OUT_LOW();
  124.         for (i = 0; i < 6; i++)                //send addr
  125.         {
  126.                 if ((addr&0x20) == 0)
  127.                 {
  128.                         HT1622_DATA_OUT_LOW();
  129.                 }
  130.                 else
  131.                 {
  132.                         HT1622_DATA_OUT_HIGH();
  133.                 }
  134.                 asm("nop"); asm("nop"); asm("nop");
  135.                 HT1622_WR_OUT_HIGH();       
  136.                 addr <<= 1;
  137.         }

  138.         for (i = 0; i < num; i++)       
  139.         {
  140.                 dat = buff[i];
  141.                 for (j = 0; j < 4; j++)                //data
  142.                 {
  143.                         HT1622_WR_OUT_LOW();
  144.                         if (dat&0x01)
  145.                         {
  146.                                 HT1622_DATA_OUT_HIGH();
  147.                         }
  148.                         else
  149.                         {
  150.                                 HT1622_DATA_OUT_LOW();
  151.                         }
  152.                         dat >>= 1;
  153.                         //asm("nop"); asm("nop"); asm("nop");
  154.                         HT1622_WR_OUT_HIGH();       
  155.                 }
  156.         }
  157.         HT1622_CS_OUT_HIGH();  
  158. }

  159. void Lcd_Init(void)
  160. {
  161.      Lcd_Wrcmd(HT_SYS_EN);
  162.      Lcd_Wrcmd(HT_LCD_ON);         
  163. }



  164. void Lcd_Clear(uint8_t dat)
  165. {
  166.         uint8_t i;
  167.         for (i = 0; i < LCD_BUFF_SIZE; i++)
  168.         {
  169.              sys.lcd_buff[i] = dat;
  170.         }
  171. }


  172. #include <avr/io.h>
  173. #include <avr/interrupt.h>s
  174. #include "main.h"
  175. #include "Ht1622.h"

  176. SYS sys;

  177. int main(void)
  178. {
  179.         int a;
  180.         int b;
  181.        
  182.         a = 1;
  183.         b = 2;
  184.         //init_devices();
  185.         Ht1622_Port_Init();
  186.         Lcd_Wrcmd(HT_SYS_EN);
  187.     Lcd_Wrcmd(HT_LCD_ON);
  188.         Lcd_Clear(0xFF);
  189.         Lcd_Write_Ndata(0,sys.lcd_buff,64);
  190.         //sei();  //asm("sei");          on interrupt
  191.         cli();  //asm("cli");   off interrupt
  192.         //asm("sei");
  193.        
  194.     while(1)
  195.     {  
  196.                 a++;
  197.                 if (a > 40)        // 200HZ -- 200
  198.                 {
  199.                         a = 0;
  200.                         //Lcd_Write_Ndata(0,sys.lcd_buff,64);
  201.                         //Lcd_Wrcmd(0x03);
  202.                 }
  203.     }
  204. }
复制代码

出0入0汤圆

发表于 2012-8-10 09:55:27 | 显示全部楼层
最近也在写这个驱动代码。 还没开始,先参考学习下。

出0入0汤圆

 楼主| 发表于 2012-8-10 16:22:17 | 显示全部楼层
有个函数写错了  地址没有发出去  更正一下:
  1. void Lcd_Write_Ndata(uint8_t addr,uint8_t *buff,uint8_t num)
  2. {
  3.         uint8_t i;
  4.         uint8_t j;
  5.         uint8_t dat;
  6.         uint8_t address;

  7.         address = addr;
  8.        
  9.         HT1622_DATA_OUT_HIGH();
  10.         HT1622_WR_OUT_LOW();
  11.         HT1622_CS_OUT_LOW();
  12.         asm("nop"); asm("nop"); asm("nop");
  13.         HT1622_WR_OUT_LOW();
  14.         asm("nop"); asm("nop"); asm("nop");
  15.         HT1622_WR_OUT_HIGH();        // 1
  16.         asm("nop"); asm("nop"); asm("nop");
  17.         HT1622_WR_OUT_LOW();
  18.         HT1622_DATA_OUT_LOW();
  19.         asm("nop"); asm("nop"); asm("nop");
  20.         HT1622_WR_OUT_HIGH();        // 0
  21.         asm("nop"); asm("nop"); asm("nop");
  22.         HT1622_WR_OUT_LOW();
  23.         HT1622_DATA_OUT_HIGH();
  24.         asm("nop"); asm("nop"); asm("nop");
  25.         HT1622_WR_OUT_HIGH();        // 1
  26.         //asm("nop"); asm("nop"); asm("nop");
  27.         //HT1622_WR_OUT_LOW();
  28.         for (i = 0; i < 6; i++)                //send addr
  29.         {
  30.                 HT1622_WR_OUT_LOW();
  31.                 if ((address&0x20) == 0)
  32.                 {
  33.                         HT1622_DATA_OUT_LOW();
  34.                 }
  35.                 else
  36.                 {
  37.                         HT1622_DATA_OUT_HIGH();
  38.                 }
  39.                 address <<= 1;
  40.                 //asm("nop"); asm("nop"); asm("nop");
  41.                 HT1622_WR_OUT_HIGH();       
  42.                
  43.         }

  44.         for (i = addr; i < (num + addr); i++)       
  45.         {
  46.                 dat = buff[i];
  47.                 for (j = 0; j < 4; j++)                //data
  48.                 {
  49.                         HT1622_WR_OUT_LOW();
  50.                         if (dat&0x01)
  51.                         {
  52.                                 HT1622_DATA_OUT_HIGH();
  53.                         }
  54.                         else
  55.                         {
  56.                                 HT1622_DATA_OUT_LOW();
  57.                         }
  58.                         dat >>= 1;
  59.                         //asm("nop"); asm("nop"); asm("nop");
  60.                         HT1622_WR_OUT_HIGH();       
  61.                 }
  62.         }
  63.         HT1622_CS_OUT_HIGH();  
  64. }
复制代码

出0入0汤圆

发表于 2012-8-10 16:29:03 | 显示全部楼层
牛牛牛顶顶顶

出0入0汤圆

发表于 2013-7-11 10:26:09 | 显示全部楼层
你好,最近我在做ht1622驱动断码LCD,试过你写的驱动,但是SEG脚的电平没有变化,不知道是什么原因,请大侠指教,谢谢!

出0入0汤圆

 楼主| 发表于 2013-7-11 15:51:54 | 显示全部楼层
sbgavin 发表于 2013-7-11 10:26
你好,最近我在做ht1622驱动断码LCD,试过你写的驱动,但是SEG脚的电平没有变化,不知道是什么原 ...

#define HT1622_CS_DDR                 DDRA
#define HT1622_RD_DDR                 DDRA
#define HT1622_WR_DDR                 DDRA
#define HT1622_DATA_DDR         DDRA

这几个引脚设置对吗,有波形没有,你的硬件有没有问题,是用STM8? 时钟是多少?

出0入0汤圆

发表于 2013-7-13 14:52:45 | 显示全部楼层
shuxmpx123 发表于 2013-7-11 15:51
#define HT1622_CS_DDR                 DDRA
#define HT1622_RD_DDR                 DDRA
#define HT16 ...


你好,我用的是LPC1114,电路如图,我不能确定没有错误,请指正,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-13 16:52:52 | 显示全部楼层
        uint8_t i;
        
        HT1622_DATA_OUT_HIGH();
        HT1622_WR_OUT_LOW();
        HT1622_CS_OUT_LOW();
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_HIGH();        // 1
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_LOW();
        HT1622_DATA_OUT_LOW();
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_HIGH();        // 0
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_LOW();
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_HIGH();        // 0
        asm("nop"); asm("nop"); asm("nop");
        HT1622_WR_OUT_LOW();
我的时钟也12M
这里的延时asm("nop"); asm("nop"); asm("nop"); 是需要的,代码就这些,没有什么要注意的了,你用示波器看波形吧!

出0入0汤圆

发表于 2013-7-15 09:26:57 | 显示全部楼层
shuxmpx123 发表于 2013-7-13 16:52
uint8_t i;
        
        HT1622_DATA_OUT_HIGH();

你好,不显示的问题找到了,是因为我的rd引脚初始化时没有设置高电平,设置低电平就可以了。但是显示不清楚,还请指教。

出0入0汤圆

 楼主| 发表于 2013-7-15 10:19:58 | 显示全部楼层
sbgavin 发表于 2013-7-15 09:26
你好,不显示的问题找到了,是因为我的rd引脚初始化时没有设置高电平,设置低电平就可以了。但是显示不清 ...

你是说显示的色度吗,可以调节LCD电压偏置电压,对比度那些,具体看你的LCD资料

出0入0汤圆

发表于 2013-7-15 12:57:21 | 显示全部楼层
本帖最后由 sbgavin 于 2013-7-15 12:58 编辑
shuxmpx123 发表于 2013-7-15 10:19
你是说显示的色度吗,可以调节LCD电压偏置电压,对比度那些,具体看你的LCD资料 ...


我的显示屏的供电电压是3V,HT1622的偏压可调范围是0~3V,这个范围的电压都试过了,但是没有用,很模糊,正面看基本上看不清楚,SEG脚和COM脚的波形如附图,绿色的是COM脚,黄色的是SEG脚。请指教!谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-15 13:31:03 | 显示全部楼层
能显示说明通信没有问题了,看不清楚的话,就是配置的问题,仔细看看1622有哪些需要配置的都试试吧。

出0入0汤圆

发表于 2013-7-15 16:00:00 | 显示全部楼层
shuxmpx123 发表于 2013-7-15 13:31
能显示说明通信没有问题了,看不清楚的话,就是配置的问题,仔细看看1622有哪些需要配置的都试试吧。 ...

HT1622的com口输出1/4偏压,分别是:0、1/3V、2/3V、V,和我之前理解的不太一样,我想1/3偏压是:0、1/2V、V,不知道这样理解是否正确,请指教?

出0入0汤圆

发表于 2013-7-16 17:26:58 | 显示全部楼层
太及时了

出0入0汤圆

发表于 2015-3-3 10:36:20 | 显示全部楼层
16C22 不是I2C 驱动呀?就SCL和SDA ,,怎么有WR CS  DATA?  求解

出0入0汤圆

发表于 2016-5-12 10:23:05 | 显示全部楼层
你好,我写这个命令是不是正确的,我研究两天都没点亮我的屏!
        HT1622_CMD(0x30); //内部晶振
        HT1622_CMD(0x00); //关闭系统振荡器和LCD偏置发生器
        HT1622_CMD(0x0a); //禁止 WDT 溢出标志输出
        HT1622_CMD(0x02); //打开系统振荡器
        HT1622_CMD(0x06); // 打开 LCD

出0入0汤圆

发表于 2016-5-12 10:23:35 | 显示全部楼层
这是我的完整程序

#include <stdint.h>
#include "LPC17xx.h"
#include "type.h"
#include "1754_IO.h"
#include "1754_LCD.h"

#define uchar unsigned char
#define uint unsigned int
#define tim 50

/*********************************************************************************************************
** Function name:       delay
** Descriptions:        软件延时 100us

*********************************************************************************************************/

void delay(uint  t)
{
        uint i,j;
        for(i = 0;i < t;i++)
        {
                for(j = 0;j < 1000;j++) ;
        }
}

extern  void Write_Bit_L(uint data, uchar cnt);
extern void Write_Bit_H(uint data, uchar cnt);

uchar a[22]={0xff,0xff,0xff,0x00,0xaa,0xff,0x55};

//////////////////////////////////////////////////////

//延时 us
void delayus(uchar us)
{
        while(us--);
}

//延时 ms
void delayms(uint ms)
{
        uint i,j;
        for(i=0;i<ms;i++)
        for(j=0;j<65;j++)
        {
                delayus(tim);
        }
}

//写字节
void HT1622_WR_Data(uchar data,uchar cnt)
{
        uchar i;
        for(i=0;i<cnt;i++)
        {
                HT1622_WR_L;
                delayus(tim);
                if((data&0x80)==0x80)
                {
                        HT1622_DATA_H;
                }
                else
                {
                        HT1622_DATA_L;
                }
                delayus(tim);
                HT1622_WR_H;
                delayus(tim);
                data<<=1;
               
        }
}

//指定地址写数据
void HT1622_WR_Addr_Data(uchar addr,uchar data)
{
        HT1622_CS_L;
        HT1622_WR_Data(0xa0,3);//101
        HT1622_WR_Data(addr,6);//addre
        HT1622_WR_Data(data,4); //data
        HT1622_CS_H;
}

//连续写数据
void HT1622_ALL_Data(void)
{
        uchar i;
        HT1622_CS_L;
        HT1622_WR_Data(0xa0,3);
        HT1622_WR_Data(0x00<<2,6);
        for(i=0;i<16;i++)
        {
                HT1622_WR_Data(0xaa,8);
        }
       
        HT1622_CS_H;
}

//写命令
void HT1622_CMD(uchar cmd)
{
        HT1622_CS_L;
        delayus(tim);
//         HT1622_WR_Data(0x80,3);
//         HT1622_WR_Data(cmd,8);

        HT1622_WR_Data(0x80,3);
        HT1622_WR_Data(cmd,9);
       
        HT1622_CS_H;
}

//初始化
void HT1622Int(void)
{
        HT1622_CS_H;
        HT1622_WR_H;
        HT1622_DATA_H;
        delayms(20);
        HT1622_CMD(0x30); //内部晶振
        HT1622_CMD(0x00); //关闭系统振荡器和LCD偏置发生器
        HT1622_CMD(0x0a); //禁止 WDT 溢出标志输出
        HT1622_CMD(0x02); //打开系统振荡器
        HT1622_CMD(0x06); // 打开 LCD

}





///TES1**********
/////////////////////////////////////////////////////
int main(void)
{
        unsigned char i;
        SystemInit();
        GPIO_Init(); //初始化GPIO
//        HT1622_Init();
        /////////////////////////

        HT1622Int();
        delayms(50);
       
       
        while(1)
        {
                //HT1622_ALL_Data();
                delayms(500);
                HT1622_WR_Addr_Data(0x80,0x55);
                delayms(500);
               
   
        }
       
       

       
}


出0入0汤圆

 楼主| 发表于 2017-2-7 13:35:52 | 显示全部楼层
本帖最后由 shuxmpx123 于 2017-2-7 22:39 编辑

400KHz读写24AA64,调试OK;

  1. /*******************************************************************
  2. *
  3. *
  4. *                I2C drive
  5. *
  6. *******************************************************************/
  7. void I2C_Delay(void)
  8. {
  9.         /*
  10.         asm("nop"); asm("nop"); asm("nop");
  11.         asm("nop"); asm("nop"); asm("nop");    // clock 16MHz   I2C frequency 243KHz

  12.         asm("nop"); asm("nop"); asm("nop");
  13.         asm("nop"); asm("nop"); asm("nop");    // clock 16MHz   I2C frequency 243KHz

  14.         asm("nop"); asm("nop"); asm("nop");
  15.         asm("nop"); asm("nop"); asm("nop");    // clock 16MHz   I2C frequency 243KHz

  16.         asm("nop"); asm("nop"); asm("nop");
  17.         asm("nop"); asm("nop"); asm("nop");   
  18.         */
  19.         u8 i;
  20.         for (i = 0; i < 4; i++)                // clock 16MHz   I2C frequency 400KHz
  21.         {
  22.                 asm("nop");
  23.         }
  24. }
  25. void I2C_Delay2(void)
  26. {
  27.         u8 i;
  28.         for (i = 0; i < 6; i++)                // clock 16MHz   I2C frequency 400KHz
  29.         {
  30.                 asm("nop");
  31.         }
  32. }

  33. void I2C_Delay3(void)
  34. {
  35.         u8 i;
  36.         for (i = 0; i < 2; i++)                // clock 16MHz   I2C frequency 400KHz
  37.         {
  38.                 asm("nop");
  39.         }
  40. }



  41. void _I2C_Start(void)
  42. {
  43.         disableInterrupts();
  44.         //SCL_LOW();
  45.         //I2C_Delay();
  46.         //SCL_HIGH();
  47.        
  48.         SDA_HIGH();
  49.         SCL_HIGH();
  50.         I2C_Delay();
  51.         SDA_LOW();       
  52.         I2C_Delay();
  53.         SCL_LOW();
  54.         enableInterrupts();
  55. }

  56. void _I2C_Stop(void)
  57. {
  58.         disableInterrupts();
  59.         I2C_Delay();
  60.         I2C_Delay();
  61.         I2C_Delay();
  62.         SDA_LOW();       
  63.         I2C_Delay();
  64.         SCL_HIGH();
  65.         I2C_Delay();
  66.         SDA_HIGH();
  67.        
  68.         /*SCL_LOW();
  69.         I2C_Delay();
  70.         SDA_LOW();       
  71.         I2C_Delay();
  72.         SCL_HIGH();
  73.         I2C_Delay();
  74.         SDA_HIGH();*/
  75.         enableInterrupts();
  76. }

  77. u8 _I2C_Wirte_Byte(u8 data)
  78. {
  79.         u8 ack,i;
  80.         u8 writeData = data;

  81.         disableInterrupts();
  82.         for (i = 0; i < 8; i++)              
  83.     {
  84.            
  85.         SCL_LOW();
  86.                 I2C_Delay3();
  87.         if ((writeData&0x80) == 0)
  88.         {
  89.             SDA_LOW();
  90.         }
  91.         else
  92.         {
  93.             SDA_HIGH();
  94.         }
  95.         writeData <<= 1;
  96.         I2C_Delay3();
  97.         SCL_HIGH();   
  98.                 I2C_Delay();
  99.     }
  100.         //I2C_Delay();
  101.         SCL_LOW();
  102.         I2C_Delay();
  103.         SDA_HIGH();
  104.        
  105.         I2C_Delay();
  106.         SCL_HIGH();
  107.         if (READ_SDA())
  108.         {
  109.                 ack = 1;
  110.         }
  111.         else
  112.         {
  113.                 ack = 0;
  114.         }
  115.        
  116.         I2C_Delay();
  117.         SCL_LOW();
  118.         I2C_Delay();
  119.         SDA_HIGH();
  120.         I2C_Delay();
  121.         enableInterrupts();
  122.        
  123.         return ack;
  124.        
  125. }

  126. void _I2C_Response_ACK(u8 ack)
  127. {
  128.         disableInterrupts();
  129.         SCL_LOW();
  130.         I2C_Delay();
  131.         if (ack)
  132.         {
  133.                 SDA_HIGH();
  134.         }
  135.         else
  136.         {
  137.                 SDA_LOW();
  138.         }
  139.        
  140.         I2C_Delay();
  141.         SCL_HIGH();
  142.         I2C_Delay();
  143.         SCL_LOW();
  144.         I2C_Delay();
  145.         enableInterrupts();
  146. }
  147. //volatile u16 testHCnt;
  148. //volatile u16 testLCnt;

  149. u8 _I2C_Read_Byte(void)
  150. {
  151.         u8 i;
  152.         u8 resValue = 0;

  153.         disableInterrupts();
  154.         SCL_LOW();
  155.         nop();
  156.         nop();
  157.         SDA_HIGH();
  158.         for (i = 0; i < 8; i++)  /*要传送的数据长度为8位*/
  159.         {
  160.                 SCL_LOW();
  161.                 I2C_Delay2();
  162.                 SCL_HIGH();
  163.                 I2C_Delay();
  164.                 resValue <<= 1;
  165.                 if(READ_SDA())
  166.                 {
  167.                         //testHCnt++;
  168.                         resValue |= 0x01;
  169.                 }
  170.                 else
  171.                 {
  172.                         //testLCnt++;
  173.                         resValue &= 0xfe;                       
  174.                 }
  175.         }
  176.         enableInterrupts();
  177.        
  178.         return resValue;
  179. }

  180. u16 i2cOKCnt;
  181. u16 i2cErrCnt;

  182. u8 _24XX_WriteNbytes(uint16_t addr, uint8_t *pInData, uint8_t bytes)
  183. {
  184.     u8 i;
  185.         u8 res = 0;
  186.        
  187.         _I2C_Start();
  188.         if (_I2C_Wirte_Byte(WR_ADD) == 0)
  189.         {
  190.                 i2cOKCnt++;
  191.         }
  192.         else
  193.         {
  194.                 i2cErrCnt++;
  195.                 _I2C_Stop();
  196.                 return 1;
  197.         }
  198.         if (_I2C_Wirte_Byte(addr>>8) == 0)
  199.         {
  200.                 i2cOKCnt++;
  201.         }
  202.         else
  203.         {
  204.                 i2cErrCnt++;
  205.                 _I2C_Stop();
  206.                 return 1;
  207.         }
  208.         if (_I2C_Wirte_Byte(addr&0xFF) == 0)
  209.         {
  210.                 i2cOKCnt++;
  211.         }
  212.         else
  213.         {
  214.                 i2cErrCnt++;
  215.                 _I2C_Stop();
  216.                 return 1;
  217.         }

  218.         for (i = 0; i < bytes; i++)
  219.         {
  220.                 if (_I2C_Wirte_Byte(*pInData++) == 0)
  221.                 {
  222.                         i2cOKCnt++;
  223.                 }
  224.                 else
  225.                 {
  226.                         i2cErrCnt++;
  227.                         _I2C_Stop();
  228.                         res = 1;
  229.                         break;
  230.                 }
  231.         }
  232.     _I2C_Stop();
  233.         return res;
  234. }



  235. u8 _I2C_Read_NBytes(u16 addr, u8* pOutData, u8 bytes)
  236. {
  237.         u8 i;
  238.        
  239.         _I2C_Start();
  240.         if (_I2C_Wirte_Byte(WR_ADD) == 0)
  241.         {
  242.                 i2cOKCnt++;
  243.         }
  244.         else
  245.         {
  246.                 i2cErrCnt++;
  247.                 _I2C_Stop();
  248.                 return 1;
  249.         }
  250.         if (_I2C_Wirte_Byte(addr>>8) == 0)
  251.         {
  252.                 i2cOKCnt++;
  253.         }
  254.         else
  255.         {
  256.                 i2cErrCnt++;
  257.                 _I2C_Stop();
  258.                 return 1;
  259.         }
  260.         if (_I2C_Wirte_Byte(addr&0xFF) == 0)
  261.         {
  262.                 i2cOKCnt++;
  263.         }
  264.         else
  265.         {
  266.                 i2cErrCnt++;
  267.                 _I2C_Stop();
  268.                 return 1;
  269.         }
  270.        
  271.         _I2C_Start();
  272.         if (_I2C_Wirte_Byte(RD_ADD) == 0)
  273.         {
  274.                 i2cOKCnt++;
  275.         }
  276.         else
  277.         {
  278.                 i2cErrCnt++;
  279.                 _I2C_Stop();
  280.                 return 1;
  281.         }
  282.         for (i = 0; i < bytes-1; i++)
  283.         {
  284.                 *pOutData++ = _I2C_Read_Byte();
  285.                 _I2C_Response_ACK(0);
  286.         }
  287.        
  288.         *pOutData = _I2C_Read_Byte();
  289.         _I2C_Response_ACK(1);
  290.         _I2C_Stop();

  291.         return 0;
  292. }

复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-18 15:57

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

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