找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1230|回复: 0
收起左侧

单片机数码管集成编译不成功,求助

[复制链接]
ID:26229 发表于 2021-4-16 10:24 | 显示全部楼层 |阅读模式
  1. 数码管集成编译不成功,求助
  2. /**
  3. * @file            FD612.C           数码管显示驱动芯片 客户代码
  4. * @brief       FD612 的驱动
  5. * @author      ywaby
  6. * @version     1B3
  7. * @date            2014-03-31   
  8. * @note
  9. * @details  
  10. * @copyright   Copyright (c) 2013 by FUZHOU FUDA HISI MICROELECTRONICS CO.,LTD.              
  11. */


  12. #include"FD612.H"
  13. /** @addtogroup FD612_DRIVER FD612 驱动
  14.   @{
  15. */
  16. #define         FD612_DELAY_LOW                             FD612_DELAY_1US         ///<时钟低电平延时                                    
  17. #define                FD612_DELAY_HIGH                      FD612_DELAY_1US                            ///<时钟高电平延时                                                                                                                                         
  18. #define          FD612_DELAY_WAIT                                FD612_DELAY_1US                                        ///<数据读取等待时间
  19. #define                FD612_DELAY_SU_STA      FD612_DELAY_1US                                        ///<起始信号建立时间
  20. #define                FD612_DELAY_HD_STA      FD612_DELAY_1US                                        ///<起始信号保持时间                                         
  21. #define                FD612_DELAY_SU_STO      FD612_DELAY_1US                                        ///<停止信号建立时间  


  22. /** @addtogroup  FD612_FUNCTION  函数
  23.   @{
  24. */
  25. /** @addtogroup  FD612_COMMUNICATION  通信时序
  26.   @{
  27. */
  28. /**
  29. *  @brief  启动FD612通信
  30. *  @param  void
  31. *  @return void
  32. *  @note   在SCL高电平期间捕获到SDA的下降沿,FD612开始通信   
  33. */
  34. static void FD612_Start( void )                          
  35. {
  36.         FD612_SDA_SET;                                   
  37.         FD612_SCL_SET;
  38.         FD612_SDA_D_OUT;                                 //设置SDA为输出方向
  39.         FD612_SCL_D_OUT;                                 //设置SCL为输出方向         
  40.         FD612_DELAY_SU_STA;
  41.         FD612_SDA_CLR;                                         //发送起始信号
  42.         FD612_DELAY_HD_STA;      
  43.         FD612_SCL_CLR;                                         
  44.         FD612_DELAY_LOW;
  45. }               

  46. /**
  47. *  @brief  停止FD612通信
  48. *  @param  void
  49. *  @return void
  50. *  @note   在SCL高电平期间捕获到SDA的上升沿,FD612停止通信  
  51. */
  52. static void FD612_Stop( void )
  53. {  
  54.          FD612_SCL_SET;                                          /* 设置SCL为高电平 */
  55.         FD612_SDA_CLR;                                          /* 设置SDA为低电平 */
  56.         FD612_SDA_D_OUT;                                  /* 设置SDA为输出方向 */
  57.         FD612_DELAY_SU_STO;                                  /* 停止信号建立时间: */
  58.         FD612_SDA_SET;                                          /* 设置SDA为高电平 */
  59.         FD612_SDA_D_IN;                                          /* 设置SDA为输入方向 */
  60. }
  61. /**
  62. *  @brief  发送一个字节数据给FD612,并读取应答位
  63. *  @param  dat 发送的一字节数据
  64. *  @retval  bit  
  65. *  @return 读取的ACK应答位
  66. *  @note   数据传输低位在前,高位在后
  67. */
  68. static bit FD612_WrByte( uint8 dat )
  69. {
  70.         uint8 i;                                        /* 移位写出的位数寄存器 */
  71.   bit ACKTemp=0;
  72.         FD612_SDA_D_OUT;                        /* 设置SDA为输出方向 */
  73.         for( i = 0; i != 8; i++ )            /* 输出8 bit的数据 */        
  74.         {                  
  75.                 if( dat & 0x80 )
  76.                 {
  77.                     FD612_SDA_SET;                    /* 设置SDA为高电平 */
  78.                 }
  79.                 else
  80.                 {
  81.                     FD612_SDA_CLR;                        /* 设置SDA为低电平 */
  82.                 }
  83.   FD612_SCL_SET;                                /* 设置SCL为高电平 */
  84.   dat <<= 1;                                        /* 输出数据右移一位,数据从高到低的输出 */
  85.   FD612_DELAY_HIGH;           /* SCL时钟高电平时间:*/
  86.   FD612_SCL_CLR;                                /* 设置SCL为低电平 */
  87.   FD612_DELAY_LOW;        
  88.         }        
  89.   //////读取ACK位/////
  90.   FD612_SDA_SET;                                 /* 设置SDA为高电平 */            
  91.   FD612_SDA_D_IN;                                    /* 设置SDA为输入方向 */
  92.   FD612_SCL_SET;                                          /* SCL时钟的高电平时间:*/
  93.   if(FD612_SDA_IN==0) ACKTemp=0; /* 读入1 bit值 */
  94.   else ACKTemp=1;
  95.   FD612_DELAY_HIGH;                 /* SCL时钟高电平时间*/
  96.   FD612_SCL_CLR;                                      /* SCL时钟的低电平*/
  97.   FD612_DELAY_LOW;        
  98.   return  ACKTemp ;  
  99. }        
  100. /**
  101. *  @brief  从FD612读取一个字节数据
  102. *  @param  MSACK 发送的ACK值 发送不应答位 ACK=1;发送应答位 ACK=0
  103. *  @retval  uint8  
  104. *  @return 读取的一字节数据
  105. *  @note   数据传输高位在前,低位在后
  106. */
  107. static uint8  FD612_RdByte( bit MSACK )
  108. {
  109.         uint8 i;                           
  110.         uint8 dat=0;                   /* 移位读入的位数寄存器i */
  111.         FD612_SDA_SET;                             /* 设置SDA为高电平 */
  112.         FD612_SDA_D_IN;                             /* 设置SDA为输入方向 */
  113.         for( i = 0; i != 8; i++ )                 /* 读入8 bit的数据 */
  114.         {                                                                 
  115.                 FD612_SCL_SET;                                      /* 设置SCL为高电平 */
  116.                 FD612_DELAY_HIGH;                               /* SCL时钟高电平时间:*/
  117.                  dat <<= 1;                                          /* 读入数据右移一位,数据从高到低的读入 */
  118.                 if( FD612_SDA_IN ) dat++;                 /* 读入1 bit值 */
  119.                 FD612_SCL_CLR;                                        /* 设置SCL为低电平 */
  120.                 FD612_DELAY_LOW;                        
  121.         }
  122.    //////发送ACK位/////
  123.   if(MSACK==0)             /* 发送ACK应答位*/
  124.     FD612_SDA_CLR;
  125.   else FD612_SDA_SET;        
  126.         FD612_SDA_D_OUT;             /* 设置SDA为输出方向 */
  127.         FD612_SCL_SET;                                 /* 设置SCL为高电平 */
  128.         FD612_DELAY_HIGH;                         /* SCL 时钟高电平时间:*/
  129.         FD612_SCL_CLR;                                 /* 设置SCL为低电平 */
  130.         FD612_DELAY_LOW;                           
  131.         return dat;                                                         /* 返回接收到的数据 */
  132. }
  133. /* @} FD612_COMMUNICATION */
  134. /** @addtogroup  FD612_API_FUNTION  应用函数
  135.   @{
  136. */
  137. /**
  138. *  @brief  向FD612发送一字节的命令
  139. *  @param  CMD 发送一字节的命令
  140. *  @return void
  141. *  @note   CMD是控制命令中的宏
  142. *  @par Example
  143. *  @code
  144. *  FD612_Command(FD612_7SEG_CMD);
  145. *  @endcode
  146. */
  147. void FD612_Command( uint8 CMD )                                 
  148. {                                                                        
  149.         FD612_Start();
  150.         FD612_WrByte(CMD);
  151.         FD612_Stop();        
  152. }
  153. /**
  154. *  @brief  刷新FD612的显示数据
  155. *  @param  void
  156. *  @return void
  157. *  @note   使用该函数需要打开 FD612_DISP_BUFF_EN
  158. */
  159. void FD612_DispDataRefresh(void)
  160. {
  161.         uint8 i;
  162.         FD612_Command(FD612_ADDR_INC_DIGWR_CMD);        
  163.         FD612_Start();               
  164.         FD612_WrByte(FD612_DIGADDR_WRCMD|FD612_DISP_MIN_ADDR) ;
  165.         for(i=FD612_DISP_MIN_ADDR;i<=FD612_DISP_MAX_ADDR;i++)
  166.                 FD612_WrByte(FD612_DispBuff.DispData[i]) ;[/i][i]
  167.         FD612_Stop();
  168. }
  169. /**
  170. *  @brief  刷新FD612的相关数据
  171. *  @param  void
  172. *  @return void
  173. *  @note   
  174. *  @note   使用该函数需要打开 FD612_DISP_BUFF_EN
  175. */
  176. void FD612_Refresh(void)
  177. {
  178.         FD612_Command(FD612_DispBuff.DispSEG_MODE);
  179.         FD612_DispDataRefresh();
  180.         FD612_Command(FD612_DispBuff.DispState);
  181. }
  182. /* @} FD612_API_FUNTION */
  183. #if FD612_DECODE_TAB_EN!=0

  184. #define FD612_DECODE_TAB_NUM 64///<FD612_DecodeTab[]的字符个数
  185. typedef struct
  186. {
  187.         uint8 Character; ///<字符
  188.         uint8 Bitmap;     ///<字符对应的码值
  189. } Struct_LED_Bitmap; ///<数码管的码值和字符的对应结构体,用于查表
  190. ///<数码管的码值和字符的对应表格,用于查表
  191. Struct_LED_Bitmap FD612_DecodeTab[FD612_DECODE_TAB_NUM] = {
  192. {'0', FD612_DISP_0_DATA}, {'1', FD612_DISP_1_DATA}, {'2', FD612_DISP_2_DATA}, {'3', FD612_DISP_3_DATA},
  193.     {'4', FD612_DISP_4_DATA}, {'5', FD612_DISP_5_DATA}, {'6', FD612_DISP_6_DATA}, {'7', FD612_DISP_7_DATA},
  194.     {'8', FD612_DISP_8_DATA}, {'9', FD612_DISP_9_DATA}, {'a', FD612_DISP_a_DATA}, {'A', FD612_DISP_A_DATA},
  195.     {'b', FD612_DISP_b_DATA}, {'B', FD612_DISP_B_DATA}, {'c', FD612_DISP_c_DATA}, {'C', FD612_DISP_C_DATA},
  196.     {'d', FD612_DISP_d_DATA}, {'D', FD612_DISP_D_DATA}, {'e', FD612_DISP_e_DATA}, {'E', FD612_DISP_E_DATA},
  197.     {'f', FD612_DISP_f_DATA}, {'F', FD612_DISP_F_DATA}, {'g', FD612_DISP_g_DATA}, {'G', FD612_DISP_G_DATA},
  198.     {'h', FD612_DISP_h_DATA}, {'i', FD612_DISP_i_DATA}, {'j', FD612_DISP_j_DATA}, {'k', FD612_DISP_k_DATA},
  199.     {'l', FD612_DISP_l_DATA}, {'m', FD612_DISP_m_DATA}, {'n', FD612_DISP_n_DATA}, {'o', FD612_DISP_o_DATA},
  200.     {'p', FD612_DISP_p_DATA}, {'q', FD612_DISP_q_DATA}, {'r', FD612_DISP_r_DATA}, {'s', FD612_DISP_s_DATA},
  201.     {'t', FD612_DISP_t_DATA}, {'u', FD612_DISP_u_DATA}, {'v', FD612_DISP_v_DATA}, {'w', FD612_DISP_w_DATA},
  202.     {'x', FD612_DISP_x_DATA}, {'y', FD612_DISP_y_DATA}, {'z', FD612_DISP_z_DATA},
  203.     {'H', FD612_DISP_H_DATA}, {'I', FD612_DISP_I_DATA}, {'J', FD612_DISP_J_DATA}, {'K', FD612_DISP_K_DATA},
  204.     {'L', FD612_DISP_L_DATA}, {'M', FD612_DISP_M_DATA}, {'N', FD612_DISP_N_DATA}, {'O', FD612_DISP_O_DATA},
  205.     {'P', FD612_DISP_P_DATA}, {'Q', FD612_DISP_Q_DATA}, {'R', FD612_DISP_R_DATA}, {'S', FD612_DISP_S_DATA},
  206.     {'T', FD612_DISP_T_DATA}, {'U', FD612_DISP_U_DATA}, {'V', FD612_DISP_V_DATA}, {'W', FD612_DISP_W_DATA},
  207.     {'X', FD612_DISP_X_DATA}, {'Y', FD612_DISP_Y_DATA}, {'Z', FD612_DISP_Z_DATA},
  208. };

  209. /**
  210. *  @brief  数码管的查表函数
  211. *  @param  cTemp 查找的字符
  212. *  @retval uint8  
  213. *  @return 字符对应的数码管码值
  214. *  @note   使用该函数需要打开 FD612_DECODE_TAB_EN
  215. *  @par Example
  216. *  @code
  217. *  char CTmp;
  218. *  CTmp=DispGetCode('S');
  219. *  @endcode
  220. */

  221. uint8 DispGetCode(char cTemp)
  222. {
  223.         uint8 i, Bitmap=0x00;
  224.         for(i=0; i<FD612_DECODE_TAB_NUM; i++)
  225.         {
  226.                 if(FD612_DecodeTab[i].Character == cTemp)[/i][i]
  227.                 {
  228.                         Bitmap = FD612_DecodeTab[i].Bitmap;[/i][i]
  229.                         break;
  230.                 }
  231.         }
  232.         return Bitmap;
  233. }
  234. #endif
  235. #if FD628_NEGA_DISP==0
  236. typedef struct
  237. {
  238.         uint8 NegaAddr; ///<对应的共阴数码管数据地址
  239.         uint8 BitAddr;     ///<对应段地址
  240. } Struct_PotiveTNage_Bitmap; ///<数码管的码值和字符的对应结构体,用于查表
  241. ///<共阳对应共阴的表格,用于查表,根据具体的应用电路进行修改
  242. Struct_PotiveTNage_Bitmap FD612_PotiveTNage_Bitmap[12][8] = {
  243.     { {0x04,0x01},{0x05,0x01},{0x06,0x01},{0x07,0x01},  {0x08,0x01},{0x09,0x01},{0x0a,0x01},{0x0b,0x01}},         
  244.     { {0x04,0x02},{0x05,0x02},{0x06,0x02},{0x07,0x02},  {0x08,0x02},{0x09,0x02},{0x0a,0x02},{0x0b,0x02}},  
  245.     { {0x04,0x04},{0x05,0x04},{0x06,0x04},{0x07,0x04},  {0x08,0x04},{0x09,0x04},{0x0a,0x04},{0x0b,0x04}},
  246.     { {0x04,0x08},{0x05,0x08},{0x06,0x08},{0x07,0x08},  {0x08,0x08},{0x09,0x08},{0x0a,0x08},{0x0b,0x08}},

  247.     { {0x00,0x01},{0x01,0x01},{0x02,0x01},{0x03,0x01},  {0x08,0x10},{0x09,0x10},{0x0a,0x10},{0x0b,0x10}},
  248.     { {0x00,0x02},{0x01,0x02},{0x02,0x02},{0x03,0x02},  {0x08,0x20},{0x09,0x20},{0x0a,0x20},{0x0b,0x20}},
  249.     { {0x00,0x04},{0x01,0x04},{0x02,0x04},{0x03,0x04},  {0x08,0x40},{0x09,0x40},{0x0a,0x40},{0x0b,0x40}},
  250.     { {0x00,0x08},{0x01,0x08},{0x02,0x08},{0x03,0x08},  {0x08,0x80},{0x09,0x80},{0x0a,0x80},{0x0b,0x80}},

  251.     { {0x00,0x10},{0x01,0x10},{0x02,0x10},{0x03,0x10},  {0x04,0x10},{0x05,0x10},{0x06,0x10},{0x07,0x10}},
  252.     { {0x00,0x20},{0x01,0x20},{0x02,0x20},{0x03,0x20},  {0x04,0x20},{0x05,0x20},{0x06,0x20},{0x07,0x20}},
  253.     { {0x00,0x40},{0x01,0x40},{0x02,0x40},{0x03,0x40},  {0x04,0x40},{0x05,0x40},{0x06,0x40},{0x07,0x40}},
  254.     { {0x00,0x80},{0x01,0x80},{0x02,0x80},{0x03,0x80},  {0x04,0x80},{0x05,0x80},{0x06,0x80},{0x07,0x80}}
  255. };

  256. /** @addtogroup FD612_API_FUNTION
  257.   @{
  258. */

  259. /** @addtogroup FD612_PT_API 共阳数码管应用函数
  260.   @{
  261. */
  262.   /**
  263. *  @brief  共阳数码管的某一位写入显示数据
  264. *  @param  Addr 共阳数码管的位
  265. *  @param  Dat   显示的数据
  266. *  @retval void  
  267. *  @return
  268. *  @note   使用该函数需要打开 FD612_DECODE_TAB_EN FD612_DISP_BUFF_EN FD628_NEGA_DISP
  269. *  @par Example
  270. *  @code
  271. *  PotiveTNage(1,0X3F); //第一位数码管显示‘0’
  272. *  @endcode
  273. */
  274. void FD612_PotiveTNage(uint8 Addr,uint8 Dat){
  275.   uint8 i;
  276.   for(i=0;i<8;i++){
  277.     if(Dat&(0x01<<i))
  278.       FD612_DispBuff.DispData[FD612_PotiveTNage_Bitmap[Addr][i].NegaAddr]|=FD612_PotiveTNage_Bitmap[Addr][i].BitAddr;[/i][/i][i][i]
  279.     else
  280.       FD612_DispBuff.DispData[FD612_PotiveTNage_Bitmap[Addr][i].NegaAddr]&=(~FD612_PotiveTNage_Bitmap[Addr][i].BitAddr);   [/i][/i][i][i]
  281.   }
  282. }
  283.   /**
  284. *  @brief FD612 某个显示地址开始显示相应的字符串
  285. *  @param  Addr 字符串显示的起始地址
  286. *  @param  PStr 指向相应的字符串
  287. *  @retval uint8  
  288. *  @return 返回函数执行结果,0为执行成功,1为起始地址超出最大地址
  289. *  @note   使用该函数需要打开 FD612_DECODE_TAB_EN
  290. *  @par Example
  291. *  @code
  292. *  FD612_DispString(FD612_DIG3_ADDR,"FD612");
  293. *  @endcode
  294. */
  295. #if FD612_DECODE_TAB_EN!=0
  296. uint8 FD612_DispString( uint8 Addr,char *PStr)
  297. {
  298.         uint8 i;
  299.         if (Addr>FD612_DISP_MAX_ADDR)return 1;
  300.          for(i=0;i+Addr<=FD612_DISP_MAX_ADDR;i++)
  301.         {
  302.                 if(PStr[i]=='\0')break;//判断是否到达字符串的尾部[/i][i]
  303.     FD612_PotiveTNage(i+Addr,DispGetCode(PStr[i]));[/i][i]
  304.         }
  305.   FD612_Refresh();
  306.   return 0;
  307. }
  308. #endif
  309. #else
  310. /* @} FD612_PT_API */
  311. /** @addtogroup FD612_NG_API 共阴数码管应用函数
  312.   @{
  313. */
  314. /**
  315. *  @brief  向共阴数码管某个显示地址写入一字节的显示数据
  316. *  @param  Addr      写入的显示地址
  317. *  @param  DispData  写入的显示数据
  318. *  @return void
  319. *  @note 地址固定方式写入显示数据
  320. *  @par Example
  321. *  @code
  322. *  FD612_SingleDisp(FD612_DIG3_ADDR,FD612_DISP_0);
  323. *  @endcode
  324. */
  325. void FD612_SingleDisp(uint8 Addr,uint8 DispData)
  326. {
  327.         FD612_Command(FD612_ADDR_STATIC_DIGWR_CMD);        
  328.         FD612_DispBuff.DispData[Addr]=DispData;
  329.         FD612_Start();               
  330.         FD612_WrByte(FD612_DIGADDR_WRCMD|Addr ) ;
  331.         FD612_WrByte(DispData ) ;
  332.         FD612_Stop();
  333. }

  334.   /**
  335. *  @brief FD612 某个显示地址开始显示相应的字符串
  336. *  @param  Addr 字符串显示的起始地址
  337. *  @param  PStr 指向相应的字符串
  338. *  @retval uint8  
  339. *  @return 返回函数执行结果,0为执行成功,1为起始地址超出最大地址
  340. *  @note   使用该函数需要打开 FD612_DECODE_TAB_EN
  341. *  @par Example
  342. *  @code
  343. *  FD612_DispString(FD612_DIG3_ADDR,"FD612");
  344. *  @endcode
  345. */
  346. #if FD612_DECODE_TAB_EN!=0
  347. uint8 FD612_DispString( uint8 Addr,char *PStr)
  348. {
  349.         uint8 i;
  350.         if (Addr>FD612_DISP_MAX_ADDR)return 1;
  351.         FD612_Command(FD612_ADDR_INC_DIGWR_CMD);        
  352.         FD612_Start();               
  353.         FD612_WrByte(FD612_DIGADDR_WRCMD|Addr) ;
  354.         for(i=0;i+Addr<=FD612_DISP_MAX_ADDR;i++)
  355.         {
  356.                 if(PStr[i]=='\0')break;//判断是否到达字符串的尾部[/i][i]
  357.                 FD612_DispBuff.DispData[i+Addr]=DispGetCode(PStr[i]);[/i][i]
  358.                 FD612_WrByte(FD612_DispBuff.DispData[i+Addr]) ;
  359.         }
  360.         FD612_Stop();
  361.         return 0;
  362. }
  363. #endif
  364. /* @} FD612_NG_API */
  365. #endif
  366. /**
  367. *  @brief  初始化FD612
  368. *  @param  void
  369. *  @return void
  370. *  @note 用户程序开始时调用该函数对FD612进行初始化
  371. *  @note 用户可以根据需要进行修改
  372. *  @par Example
  373. *  @code 共阴参考
  374.   uint8 i;
  375.   FD612_8SEG_MODE;
  376.   for(i=0;i<12;i++){
  377.     FD612_DispBuff.DispData[i]= 0X00;[/i][i]
  378.   }
  379.    FD612_DispBuff.DispData[FD612_DIG1_ADDR]=FD612_DISP_F;
  380.    FD612_DispBuff.DispData[FD612_DIG2_ADDR]=FD612_DISP_d;   
  381.   FD612_DispString(FD612_DIG3_ADDR,"612");
  382.   FD612_DispStateWr(FD612_INTENS8|FD612_DISP_ON);  
  383.   FD612_Refresh();
  384. *   @endcode
  385. *   @code 共阳参考
  386.   uint8 i;
  387.   FD612_8SEG_MODE;
  388.   for(i=0;i<12;i++){
  389.     FD612_DispBuff.DispData[i]= 0X00;[/i][i]
  390.   }
  391. FD612_PotiveTNage(FD612_DIG1_ADDR,FD612_DISP_F);
  392. FD612_PotiveTNage(FD612_DIG2_ADDR,FD612_DISP_d);  
  393.   FD612_DispString(FD612_DIG3_ADDR,"612");
  394.   FD612_DispStateWr(FD612_INTENS8|FD612_DISP_ON);  
  395.   FD612_Refresh();
  396. *  @endcode  
  397. */

  398.   void FD612_Init( void)//<共阳参考
  399. {

  400. }
  401. /* @} FD612_API_FUNTION */
  402. /* @} FD612_FUNTION */
  403. /* @} FD612_DRIVER */


  404. /******************* (C) COPYRIGHT 2013 FDHISI *****END OF FILE****/

  405. //海矽数显宝移植生成
  406. #ifndef __FD612_H__
  407. #define __FD612_H__


  408. #include "intrins.h"
  409. #include "STC12LE5A60S2.H"


  410. typedef char sint8;
  411. typedef short int sint16;
  412. typedef long int sint32;
  413. typedef unsigned char  uint8;
  414. typedef unsigned short uint16;
  415. typedef unsigned long  uint32;
  416. typedef bit boolean;                        //bit可用unsigned char 替代
  417. typedef bit BOOLEAN;                        //bit可用unsigned char 替代


  418. //DelayConfig2:适用于2线协议的配置, 例如:FD632
  419. //时钟:11.0592MHz
  420. //8051指令集:STC-Y3
  421. //适用单片机:STC12Cxx/STC12LExx/STC11Fxx/STC11Lxx/STC10Fxx/STC10Lxx等
  422. #define DELAY {unsigned char i;_nop_();i = 16;while (--i);} ///<延时时序宏,控制SCL以及SDA的速率,建议在5uS以上


  423. //IoConfig2:适用于2线协议的配置, 例如:FD632
  424. sbit I2C_SCL = P0 ^ 0;
  425. sbit I2C_SDA = P0 ^ 1;


  426. #define FD612_SCL_SET   {I2C_SCL = 1;}    ///<将SCL设置为高电平
  427. #define FD612_SCL_CLR   {I2C_SCL = 0;}    ///<将SCL设置为低电平
  428. #define FD612_SCL_D_OUT {}                ///<设置SCL为输出方向,对于双向I/O需切换为输出


  429. #define FD612_SDA_SET   {I2C_SDA = 1;}    ///<将SDA设置为高电平
  430. #define FD612_SDA_CLR   {I2C_SDA = 0;}    ///<将SDA设置为低电平
  431. #define FD612_SDA_IN    {I2C_SDA = 1;}    ///<当SDA设为输入方向时,读取的电平值
  432. #define FD612_SDA_D_OUT {}                ///<设置SDA为输出方向,对于双向I/O需切换为输出,建议不要设置成推挽,避免ACK处的阶梯状波形出现。
  433. #define FD612_SDA_D_IN  I2C_SDA           ///<设置SDA为输入方向,对于双向I/O需切换为输入


  434. //数码管码字定义,可根据相应硬件连接对应
  435. #define DISP_BIT_A  (1<<0)    //<对应A段,根据硬件的连接配置
  436. #define DISP_BIT_B  (1<<1)    //<对应B段,根据硬件的连接配置
  437. #define DISP_BIT_C  (1<<2)    //<对应C段,根据硬件的连接配置
  438. #define DISP_BIT_D  (1<<3)    //<对应D段,根据硬件的连接配置
  439. #define DISP_BIT_E  (1<<4)    //<对应E段,根据硬件的连接配置
  440. #define DISP_BIT_F  (1<<5)    //<对应F段,根据硬件的连接配置
  441. #define DISP_BIT_G  (1<<6)    //<对应G段,根据硬件的连接配置
  442. #define DISP_BIT_DP (1<<7)    //<对应dp段,根据硬件的连接配置




  443. /********FD612.C的内部宏定义 *********/
  444. #define        FD612_DELAY_1US                        DELAY        ///< 延时的宏定义,最小延时时间为1uS
  445. #define FD628_NEGA_DISP                        1                ///<1为共阴数码管,0为共阳数码管
  446. #define        FD612_DECODE_TAB_EN                1                ///<是否开启FD612_DecodeTab[]功能 0为关闭,关闭该功能可以省CODE
  447. #define        FD612_COMBINA_SW_EN     1                 ///<是否开启组合键功能 0为关闭,关闭该功能可以省RAM


  448. /* @} FD612_REMOVE_CHANGE */
  449. /**
  450. * @addtogroup  FD612_REMOVE_CHANGEABLE   可以修改
  451. * 根据应用需要进行相应的修改
  452. * 可以修改的函数 FD612_Init();FD612_Refresh();
  453. * @{
  454. */
  455. /* @} FD612_REMOVE_CHANGEABLE */
  456. /* @} FD612_REMOVE */
  457. /** @addtogroup  FD612_APP 应用相关
  458.   * @{
  459. */
  460. /** @addtogroup  FD612_APP_MACRO   宏定义
  461.   * @{
  462. */


  463. /* ********数码管显示字符宏定义 ******** */
  464. #define FD612_DISP_NONE_DATA 0X00
  465. #define FD612_DISP_0_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  466. #define FD612_DISP_1_DATA  DISP_BIT_B|DISP_BIT_C
  467. #define FD612_DISP_2_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  468. #define FD612_DISP_3_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_G
  469. #define FD612_DISP_4_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_F|DISP_BIT_G
  470. #define FD612_DISP_5_DATA  DISP_BIT_A|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  471. #define FD612_DISP_6_DATA  DISP_BIT_A|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  472. #define FD612_DISP_7_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C
  473. #define FD612_DISP_8_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  474. #define FD612_DISP_9_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  475. #define FD612_DISP_A_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  476. #define FD612_DISP_a_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  477. #define FD612_DISP_B_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  478. #define FD612_DISP_b_DATA  DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  479. #define FD612_DISP_C_DATA  DISP_BIT_A|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  480. #define FD612_DISP_c_DATA  DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  481. #define FD612_DISP_d_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  482. #define FD612_DISP_D_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  483. #define FD612_DISP_E_DATA  DISP_BIT_A|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  484. #define FD612_DISP_e_DATA  DISP_BIT_A|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  485. #define FD612_DISP_F_DATA  DISP_BIT_A|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  486. #define FD612_DISP_f_DATA  FD612_DISP_F_DATA
  487. #define FD612_DISP_G_DATA  DISP_BIT_A|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  488. #define FD612_DISP_g_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  489. #define FD612_DISP_H_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  490. #define FD612_DISP_h_DATA  DISP_BIT_C|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  491. #define FD612_DISP_I_DATA  DISP_BIT_B|DISP_BIT_C
  492. #define FD612_DISP_i_DATA  DISP_BIT_C
  493. #define FD612_DISP_J_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E
  494. #define FD612_DISP_j_DATA  FD612_DISP_J_DATA
  495. #define FD612_DISP_L_DATA  DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  496. #define FD612_DISP_l_DATA  FD612_DISP_J_DATA
  497. #define FD612_DISP_N_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_E|DISP_BIT_F
  498. #define FD612_DISP_n_DATA  DISP_BIT_C|DISP_BIT_E|DISP_BIT_G
  499. #define FD612_DISP_O_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  500. #define FD612_DISP_o_DATA  DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  501. #define FD612_DISP_P_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  502. #define FD612_DISP_p_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  503. #define FD612_DISP_Q_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_F|DISP_BIT_G
  504. #define FD612_DISP_q_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_F|DISP_BIT_G
  505. #define FD612_DISP_R_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_C|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  506. #define FD612_DISP_r_DATA  DISP_BIT_B|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  507. #define FD612_DISP_S_DATA  DISP_BIT_A|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  508. #define FD612_DISP_s_DATA  DISP_BIT_A|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  509. #define FD612_DISP_T_DATA  DISP_BIT_A|DISP_BIT_E|DISP_BIT_F
  510. #define FD612_DISP_t_DATA  DISP_BIT_D|DISP_BIT_E|DISP_BIT_F|DISP_BIT_G
  511. #define FD612_DISP_U_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_E|DISP_BIT_F
  512. #define FD612_DISP_u_DATA  DISP_BIT_C|DISP_BIT_D|DISP_BIT_E
  513. #define FD612_DISP_Y_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  514. #define FD612_DISP_y_DATA  DISP_BIT_B|DISP_BIT_C|DISP_BIT_D|DISP_BIT_F|DISP_BIT_G
  515. #define FD612_DISP_Z_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G
  516. #define FD612_DISP_z_DATA  DISP_BIT_A|DISP_BIT_B|DISP_BIT_D|DISP_BIT_E|DISP_BIT_G




  517. /********ACK位********/
  518. #define FD612_NACK 1///<无应答信号
  519. #define FD612_ACK  0///<有应答信号


  520. #define        FD612_DISP_MAX_ADDR 11    ///<FD612显示地址的最大值
  521. #define        FD612_DISP_MIN_ADDR 0     ///<FD612显示地址的最小值
  522. /** @addtogroup  FD612_APP_MACRO_CMD    控制命令
  523.   * @{
  524. */
  525. //显示模式命令设置
  526. #define FD612_8SEG_CMD        0x00                ///<8段12位
  527. #define FD612_7SEG_CMD        0x03                ///<7段10位
  528. //数据命令设置
  529. #define FD612_ADDR_INC_DIGWR_CMD                      0x40                    ///< 自动地址增加,写数据        
  530. #define FD612_ADDR_STATIC_DIGWR_CMD                          0x4c                    ///< 固定地址模式。写显示
  531. //地址命令设置
  532. /**
  533. *  @brief 写入显示数据的地址的命令
  534. *  @note  使用方法:FD612_DIGADDR_WRCMD|相应的地址
  535. *  @par Example
  536. *  @code
  537. *  FD612_Command(FD612_DIGADDR_WRCMD|FD612_DIG5_ADDR);
  538. *  @endcode
  539. */
  540. #define FD612_DIGADDR_WRCMD        0xc0      
  541. //显示位相应的地址
  542. #define FD612_DIG1_ADDR 0x00
  543. #define FD612_DIG2_ADDR 0x01
  544. #define FD612_DIG3_ADDR 0x02
  545. #define FD612_DIG4_ADDR 0x03
  546. #define FD612_DIG5_ADDR 0x04
  547. #define FD612_DIG6_ADDR 0x05
  548. #define FD612_DIG7_ADDR 0x06
  549. #define FD612_DIG8_ADDR 0x07
  550. #define FD612_DIG9_ADDR 0x08
  551. #define FD612_DIG10_ADDR 0x09
  552. #define FD612_DIG11_ADDR 0x0A
  553. #define FD612_DIG12_ADDR 0x0B
  554. //显示亮度和显示开关之间用或的关系
  555. #define FD612_INTENS1                0x80                ///< 1级亮度        
  556. #define FD612_INTENS2                0x81                ///< 2级亮度        
  557. #define FD612_INTENS3                0x82                ///< 3级亮度
  558. #define FD612_INTENS4                0x83                ///< 4级亮度        
  559. #define FD612_INTENS5                0x84          ///< 5级亮度        
  560. #define FD612_INTENS6                0x85                ///< 6级亮度
  561. #define FD612_INTENS7                0x86                ///< 7级亮度        
  562. #define FD612_INTENS8                0x87                ///< 8级亮度


  563. #define FD612_DISP_ON   0x88          ///<打开FD612显示
  564. #define FD612_DISP_OFF  0x80                ///<关闭FD612显示
  565. /* @} FD612_APP_MACRO_CMD */


  566. /** @brief  FD612 8段12位模式显示 */
  567. #define FD612_8SEG_MODE   do{ \
  568.                           FD612_DispBuff.DispSEG_MODE=FD612_8SEG_CMD;   \
  569.                           FD612_Command(FD612_8SEG_CMD);  \
  570.                           } while(0)
  571. /** @brief  FD612 7段10位模式显示 */                     
  572. #define FD612_7SEG_MODE do{  \
  573.                           FD612_DispBuff.DispSEG_MODE=FD612_7SEG_CMD;   \               \
  574.                           FD612_Command(FD612_7SEG_CMD);  \
  575.                           }while(0)
  576. /**
  577. *  @brief  FD612显示亮度和显示开关控制
  578. *  @note   显示亮度和显示开关之间使用或的关系
  579. *  @par Example
  580. *  @code
  581. *  FD612_DispStateWr(FD612_INTENS6|FD612_DISP_ON);
  582. *  @endcode
  583. */                        
  584. #define FD612_DispStateWr(DispStateTemp)  do{  \
  585.                                         FD612_DispBuff.DispState=DispStateTemp; \
  586.                                         FD612_Command(DispStateTemp); \
  587.                                         }while(0)


  588. /* @} FD612_APP_MACRO */
  589. /** @addtogroup  FD612_APP_DATA   相关数据
  590.   * @{
  591. */
  592. extern          uint8 DISP_TAB[0x10]; ///<数码管码值表
  593. /* @} FD612_APP_DATA */
  594. /** @addtogroup  FD612_APP_FUNC   相关函数
  595.   * @{
  596. */
  597. void  FD612_Command(uint8 CMD ); //发送一字节的命令
  598. void FD612_Init(void);  //初始化FD612芯片
  599. #if FD612_DECODE_TAB_EN!=0
  600. uint8 DispGetCode(char cTemp);  //数码管的查表函数
  601. uint8 FD612_DispString( uint8 Addr,char *PStr); //某个显示地址开始显示相应的字符串
  602. #endif
  603. #if FD628_NEGA_DISP==1
  604. void FD612_SingleDisp(uint8 addr,uint8 dat); //向共阴数码管某个显示地址写入一字节的显示数据
  605. #else
  606. void FD612_PotiveTNage(uint8 addr,uint8 dat); //向共阳数码管某个显示地址写入一字节的显示数据
  607. #endif
  608. void FD612_Refresh(void); //刷新FD612的相关数据
  609. void  FD612_DispDataRefresh(void);  //刷新FD612的显示数据
  610. /* @} FD612_APP_FUNC */
  611. /**
  612. * @addtogroup  FD612_APP_DATA   相关数据
  613. * @{
  614. */
  615. typedef struct {
  616.         uint8 DispData[FD612_DISP_MAX_ADDR-FD612_DISP_MIN_ADDR+1]; ///<12位显示数据缓存器
  617.         uint8 DispState;      ///<显示亮度和开关状态缓存器
  618.         uint8 DispSEG_MODE;   ///<显示位段模式缓存器
  619. } FD612_Struct_DispBuff;
  620. /**  
  621. *  @brief  显示数据和状态缓存器
  622. *  @note   可以通过宏FD612_DISP_BUFF_EN开启和关闭该功能
  623. *  @note   使用刷新功能必须先打开该功能
  624. */
  625. extern   FD612_Struct_DispBuff FD612_DispBuff;
  626. /* @} FD612_APP_DATA */
  627. /* @} FD612_APP */
  628. /* @} FD612_DRIVER */


  629. #endif



复制代码

数码管显示.rar

982.54 KB, 下载次数: 3

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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