首页 > 评测 > 评测列表 > MCU

【CuriosityNano测评报告】+PIC16F15244 HT1621驱动液晶显示ADC

  
  • 作者:
  • 来源:
  • [导读]
  • 今天用HT1621液晶模块显示一路AD的值。代码外设配置用MCC生成,我们这里开启调试串口和一路ADC。串口配置:9600,N,8,1 启用printf重定向 S1.png (41.46 KB, 下载次数: 0) 下载附件 保存到相册 2021-

今天用HT1621液晶模块显示一路AD的值。代码外设配置用MCC生成,我们这里开启调试串口和一路ADC。串口配置:9600,N,8,1 启用printf重定向


ADC 用RC3对应的ANC3 ,主意数据格式为右对齐,一开始我选择的左对齐,然后发现与生成的代码里面的算法不匹配,
参考电压选择VDD。软件触发模式~



我们模拟IIC来启动HT1621:

其中HT6121代码如下:
h文件:

 

  1. /*
  2. * File:   HT1621.h
  3. * Author: Administrator
  4. *
  5. * Created on February 21, 2021, 9:01 AM
  6. */
  7.  
  8. #ifndef HT1621_H
  9. #define        HT1621_H
  10.  
  11. #ifdef        __cplusplus
  12. extern "C" {
  13. #endif
  14.    
  15. #include <xc.h>
  16.    
  17. //HT1621??
  18. #define  BIAS     0x52             //0b1000 0101 0010  1/3duty 4com
  19. #define  SYSDIS   0X00             //0b1000 0000 0000  ???????LCD?????
  20. #define  SYSEN    0X02             //0b1000 0000 0010 ???????
  21. #define  LCDOFF   0X04             //0b1000 0000 0100  ?LCD??
  22. #define  LCDON    0X06             //0b1000 0000 0110  ??LCD??
  23. #define  XTAL     0x28             //0b1000 0010 1000 ?????
  24. #define  RC256    0X30             //0b1000 0011 0000  ????
  25. #define  WDTDIS1  0X0A            //0b1000 0000 1010  ?????
  26.    
  27.    
  28. void Ht1621Wr_Data(unsigned char Data,unsigned char cnt) ;
  29. void Ht1621WrCmd(unsigned char Cmd) ;
  30. void Ht1621WrOneData(unsigned char Addr,unsigned char Data);
  31. void Ht1621WrAllData(unsigned char Addr,unsigned char *p,unsigned char cnt);
  32. void Ht1621_Init(void) ;
  33. void Display(void) ;
  34. void Display_lcd_dot(void) ;
  35. void data_convertor(unsigned long adc_value) ;
  36.  
  37.  
  38. #ifdef        __cplusplus
  39. }
  40. #endif
  41.  
  42. #endif        /* HT1621_H */
  43.  
  44.  
复制代码

C文件:

  1. #include "HT1621.h"
  2. #include "pin_manager.h"
  3.  
  4. unsigned int tmp;
  5. unsigned int n1, n2, n3, n4;
  6. unsigned char DispTab[]={0xEB,0x0A,0xAD,0x8F,0x4E,0xC7,0xE7,0x8A,0xEF,0xCF,0x85,0xEE, 0x67, 0xE1,0x2F,0xE5,0xE4};
  7. //??????
  8. void Ht1621_CS_0() { HT1621_CS_SetLow() ;}  //
  9. void Ht1621_CS_1() { HT1621_CS_SetHigh() ;}
  10.  
  11. void Ht1621_WR_0() { HT1621_WR_SetLow();}  //
  12. void Ht1621_WR_1() { HT1621_WR_SetHigh();}
  13.  
  14. void Ht1621_DAT_0() { HT1621_DATA_SetLow();}  //
  15. void Ht1621_DAT_1() { HT1621_DATA_SetHigh();}
  16.  
  17. void Ht1621_GND_0() { HT1621_GND_SetLow();}  //
  18. void Ht1621_GND_1() { HT1621_GND_SetLow();}
  19.  
  20. void Ht1621_VCC_0() { HT1621_VCC_SetLow();}  //
  21. void Ht1621_VCC_1() { HT1621_VCC_SetHigh();}
  22.  
  23. /*******************************************************************************
  24. ****????:
  25. ****????:1621?????
  26. ****??:V1.0
  27. ****??:14-2-2014
  28. ****????:Data-??????  cnt-????????
  29. ****????:
  30. ****??:
  31. ********************************************************************************/
  32. void Ht1621Wr_Data(unsigned char Data,unsigned char cnt)
  33. {
  34.   unsigned char i;
  35.   for (i=0;i<cnt;i++)
  36.    {   
  37.      Ht1621_WR_0();
  38.      if((Data & 0x80)==0x80)
  39.         {Ht1621_DAT_1();}
  40.      else
  41.         {Ht1621_DAT_0();}
  42.      Ht1621_WR_1();
  43.      Data<<=1;
  44.    }
  45. }
  46. /*******************************************************************************
  47. ****????:
  48. ****????:1621?????
  49. ****??:V1.0
  50. ****??:14-2-2014
  51. ****????:Cmd ??
  52. ****????:
  53. ****??:
  54. ********************************************************************************/
  55. void Ht1621WrCmd(unsigned char Cmd)
  56. {
  57.    Ht1621_CS_0();
  58.    Ht1621Wr_Data(0x80,4);          //??????100
  59.    Ht1621Wr_Data(Cmd,8);           //??????
  60.    Ht1621_CS_1();
  61. }
  62. /*******************************************************************************
  63. ****????:
  64. ****????:1621???????
  65. ****??:V1.0
  66. ****??:14-2-2014
  67. ****????:Addr--?? Data--??
  68. ****????:
  69. ****??:
  70. ********************************************************************************/
  71. void Ht1621WrOneData(unsigned char Addr,unsigned char Data)
  72. {
  73.   Ht1621_CS_0();
  74.   Ht1621Wr_Data(0xa0,3);  //??????101
  75.   Ht1621Wr_Data(Addr<<2,6); //??????
  76.   Ht1621Wr_Data(Data,4); //???????? 7  6  5  4
  77.   Ht1621_CS_1();
  78. }
  79. /*******************************************************************************
  80. ****????:
  81. ****????:1621???????
  82. ****??:V1.0
  83. ****??:14-2-2014
  84. ****????:Addr--?? p--??  cnt????
  85. ****????:
  86. ****??:
  87. ********************************************************************************/
  88. void Ht1621WrAllData(unsigned char Addr,unsigned char *p,unsigned char cnt)
  89. {
  90.   unsigned char i;
  91.   Ht1621_CS_0();
  92.   Ht1621Wr_Data(0xa0,3); //??????101
  93.   Ht1621Wr_Data(Addr<<2,6); //??????
  94.   for (i=0;i<cnt;i++)
  95.    {
  96.     Ht1621Wr_Data(*p,8); //????
  97.     p++;
  98.    }
  99.   Ht1621_CS_1();
  100. }
  101. /*******************************************************************************
  102. ****????:
  103. ****????:1621?????
  104. ****??:V1.0
  105. ****??:14-2-2014
  106. ****????:
  107. ****????:
  108. ****??:
  109. ********************************************************************************/
  110. void Ht1621_Init(void)
  111. {
  112.     Ht1621_GND_0();       //HT1621 power on
  113.     Ht1621_VCC_1();
  114.    Ht1621WrCmd(BIAS);
  115.    Ht1621WrCmd(RC256);             //???????
  116.    //Ht1621WrCmd(XTAL);             //???????
  117.    Ht1621WrCmd(SYSDIS);
  118.    Ht1621WrCmd(WDTDIS1);
  119.    Ht1621WrCmd(SYSEN);
  120.    Ht1621WrCmd(LCDON);
  121. }
  122. /*******************************************************************************
  123. ****????:
  124. ****????:1621????
  125. ****??:V1.0
  126. ****??:14-2-2014
  127. ****????:
  128. ****????:
  129. ****??:
  130. ********************************************************************************/
  131. void Display(void)
  132. {
  133.  
  134.    Ht1621WrOneData(0 , DispTab[n4]);
  135.    Ht1621WrOneData(1 , DispTab[n4]<<4);
  136.  
  137.    Ht1621WrOneData(2 , DispTab[n3]);
  138.    Ht1621WrOneData(3 , DispTab[n3]<<4);
  139.    
  140.    Ht1621WrOneData(4 , DispTab[n2]);
  141.    Ht1621WrOneData(5 , DispTab[n2]<<4);
  142.   
  143.    Ht1621WrOneData(6 , DispTab[n1]);
  144.    Ht1621WrOneData(7 , DispTab[n1]<<4);
  145.    
  146. }
  147. /*******************************************************************************
  148. ****????:
  149. ****????:??????
  150. ****??:V1.0
  151. ****??:14-2-2014
  152. ****????:Addr--?? Data--??
  153. ****????:
  154. ****??:
  155. ********************************************************************************/
  156. void Display_lcd_dot(void)
  157. {
  158.   //Ht1621WrOneData(0 , DispTab[n4]|0x10);//P1
  159.    Ht1621WrOneData(2 , DispTab[n3]|0x10);    //2P
  160.    //Ht1621WrOneData(4 , DispTab[n2]|0x10);    //3P
  161.    //Ht1621WrOneData(6 , DispTab[n1]|0x10);    //4P
  162. }
  163. /*******************************************************************************
  164. ****????:
  165. ****????:??????
  166. ****??:V1.0
  167. ****??:14-2-2014
  168. ****????:adc_value-???????
  169. ****????:
  170. ****??:
  171. ********************************************************************************/
  172. void data_convertor(unsigned long adc_value)
  173. {  
  174.     tmp=adc_value;         //adc
  175.     n4=tmp/1000;
  176.     tmp=tmp%1000;
  177.     n3=tmp/100;
  178.     tmp=tmp%100;       
  179.     n2=tmp/10;
  180.     tmp=tmp%10;               
  181.     n1=tmp;
  182. }
复制代码

下面,我们在main函数里面调用:

  1. #include "mcc_generated_files/mcc.h"
  2. #include "mcc_generated_files/HT1621.h"
  3.  
  4. unsigned char Ht1621Tab[]={0x00,0x00,0x00,0x00};
  5. /*
  6.                          Main application
  7. */
  8. void main(void)
  9. {
  10.     //unsigned char i=0;
  11.     uint16_t u16_adc1_value;   
  12.     uint16_t VoltageValue;
  13.     // initialize the device
  14.     SYSTEM_Initialize();
  15.  
  16.     __delay_ms(5000);
  17.    
  18.     Ht1621_Init();        //?????LCD
  19.     __delay_ms(5000);           //??????
  20.     Ht1621WrAllData(0,Ht1621Tab,16);// Clear LCD display
  21.   
  22.     // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
  23.     // Use the following macros to:
  24.  
  25.     // Enable the Global Interrupts
  26.     //INTERRUPT_GlobalInterruptEnable();
  27.  
  28.     // Enable the Peripheral Interrupts
  29.     //INTERRUPT_PeripheralInterruptEnable();
  30.  
  31.     // Disable the Global Interrupts
  32.     //INTERRUPT_GlobalInterruptDisable();
  33.  
  34.     // Disable the Peripheral Interrupts
  35.     //INTERRUPT_PeripheralInterruptDisable();
  36.    
  37.    
  38.     while (1)
  39.     {
  40.         //u16_adc1_value=ADC_GetConversion(channel_ANC3);
  41.         //u16_adc1_value=ADC_GetConversion(channel_AVSS);
  42.         u16_adc1_value=ADC_GetConversion(channel_FVR_BUF1);
  43.         VoltageValue=u16_adc1_value*3300UL/1024UL;
  44.         data_convertor(VoltageValue);
  45.         Display();
  46.         Display_lcd_dot();
  47.         printf("the ADCVALUE is %d ,the VoltageValue is %d\r\n",u16_adc1_value,VoltageValue);
  48.         __delay_ms(1000);
  49.     }
  50. }
复制代码

为了验证不同电压的ADC采样,我开启了FVR,并设定其为:2.048V
编译下载代码,分别测试3V3和2.048:



其中,观察了FVR的电压,会从2.049 来回跳到2.056 ,有(2.056-2.049)=0.007V的波动
查看串口输出的信息:

发现采样到的ADC值就相差2个最小单位,0.007/2=0.0035与官方精度(3.3/1024=0.0032)几乎接近。

 

  • 本文系21ic原创,未经许可禁止转载!

网友评论