久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1499|回復: 0
打印 上一主題 下一主題
收起左側

TM1650的驅動程序 在GD32f105單片機已經驗證

[復制鏈接]
跳轉到指定樓層
樓主
ID:281113 發表于 2023-3-16 10:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近用到了TM1650,折騰一下,寫驅動時嚴格按著時序要求。

  1. #include "gd32f10x.h"
  2. #include "Header.h"
  3. #include "systick.h"


  4. //產生IIC總線起始信號
  5. static void TM1650_IIC_start(void)
  6. {
  7.         TM1650_IIC_SCL_HIGH;     //SCL=1
  8.         TM1650_IIC_SDA_HIGH;     //SDA=1
  9.   DelayUs(100);
  10.         TM1650_IIC_SDA_LOW;      //SDA=0
  11.   DelayUs(100);
  12.         TM1650_IIC_SCL_LOW;      //SCL=0
  13. }

  14. //產生IIC總線結束信號
  15. static void TM1650_IIC_stop(void)      
  16. {       
  17.         TM1650_IIC_SDA_LOW;      //SDA=0
  18.         DelayUs(100);
  19.   TM1650_IIC_SCL_HIGH;  
  20.   DelayUs(100);
  21.         TM1650_IIC_SDA_HIGH;     //SDA=1
  22.   DelayUs(100);
  23.   TM1650_IIC_SCL_LOW;      //SCL=0
  24.   TM1650_IIC_SDA_LOW;      //SDA=0
  25. }

  26. //通過IIC總線發送一個字節
  27. static void TM1650_IIC_write_byte(uint8_t dat)
  28. {
  29.         uint8_t i;
  30.        
  31.         TM1650_IIC_SCL_LOW;
  32.         for(i=0;i<8;i++)
  33.         {
  34.                 TM1650_IIC_SDA_WR(dat&0x80);
  35.                 DelayUs(100);
  36.                 TM1650_IIC_SCL_HIGH;
  37.     DelayUs(100);
  38.                 TM1650_IIC_SCL_LOW;
  39.     DelayUs(100);
  40.                 dat<<=1;       
  41.         }
  42. }

  43. //通過IIC總線接收從機響應的ACK信號
  44. void TM1650_IIC_wait_ack(void)
  45. {
  46.        
  47.         TM1650_IIC_SDA_HIGH;       //SDA=1
  48.   DelayUs(100);
  49.   DelayUs(100);
  50.         TM1650_IIC_SCL_HIGH;
  51.        
  52.   //TM1650_IIC_SDA_MODE_IF;   //控制引腳為浮空輸入
  53.         DelayUs(100);
  54.         //while(TM1650_IIC_SDA_RD())                 //ack_signal = 1;         //如果讀取到的是NACK信號

  55.         //TM1650_IIC_SDA_MODE_OD;     // 控制引腳為開漏輸出
  56.   DelayUs(100);
  57.         TM1650_IIC_SCL_LOW;
  58.   DelayUs(100);
  59. }


  60. //TM1650初始化
  61. void TM1650_init(void)
  62. {
  63.         rcu_periph_clock_enable(RCU_AF);
  64.         rcu_periph_clock_enable(RCU_GPIOA);            // 開時基
  65.   rcu_periph_clock_enable(RCU_GPIOC);   
  66.        
  67.   gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);  // 將PA15定義成普通IO
  68.         TM1650_IIC_SCL_MODE_OD;  //SCL開漏輸出
  69.   TM1650_IIC_SDA_MODE_OD;  //SDA開漏輸出

  70.   TM1650_IIC_SDA_HIGH;     //釋放SDA線
  71.   TM1650_IIC_SCL_HIGH;     //釋放SCL線
  72.        
  73.         TM1650_cfg_display(TM1650_BRIGHT5);   //初始化為5級亮度,打開顯示
  74.         TM1650_clear();         //將顯存內容清0
  75.         delay_1ms(20);
  76. }


  77. //作用:設置顯示參數
  78. //備注:這個操作不影響顯存中的數據
  79. //用例:
  80. //        設置亮度并打開顯示:TM1650_cfg_display(TM1650_BRIGHTx)
  81. //        關閉顯示:TM1650_cfg_display(TM1650_DSP_OFF)
  82. void TM1650_cfg_display(uint8_t param)
  83. {
  84.         TM1650_IIC_start();
  85.         TM1650_IIC_write_byte(0x48);  TM1650_IIC_wait_ack();     //固定命令
  86.         TM1650_IIC_write_byte(param); TM1650_IIC_wait_ack();    //參數值
  87.         TM1650_IIC_stop();
  88. }


  89. //將顯存數據全部刷為0,清空顯示
  90. void TM1650_clear(void)
  91. {
  92.         uint8_t dig;
  93.         for(dig = TM1650_DIG1 ; dig<= TM1650_DIG4 ;dig++)
  94.         {
  95.                 TM1650_print(dig,0);   //將顯存數據刷為0
  96.         }
  97. }

  98. //往一個指定的數碼管位寫入指定的顯示數據
  99. //共陰數碼管段碼表:
  100. //const uint8_t TUBE_TABLE_0[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                                  //共陰,0~9的數字
  101. //const uint8_t TUBE_TABLE_0[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};    //共陰,0~9~A~F
  102. //用例:
  103. //        在DIG1位上顯示數字3: TM1650_print(TM1650_DIG1,TUBE_TABLE_0[3]);
  104. void TM1650_print(uint8_t dig,uint8_t seg_data)
  105. {
  106.         TM1650_IIC_start();
  107.         TM1650_IIC_write_byte(dig*2+0x68); TM1650_IIC_wait_ack();  //顯存起始地址為0x68
  108.         TM1650_IIC_write_byte(seg_data); TM1650_IIC_wait_ack();    //發送段碼
  109.         TM1650_IIC_stop();
  110. }
復制代碼


TM1650.h
  1. #ifndef TM1650_H_
  2. #define TM1650_H_

  3. #include "header.h"
  4. #include "gd32f10x.h"

  5. #define GPIO_SCL       GPIOC
  6. #define GPIO_Pin_SCL   GPIO_PIN_12

  7. #define GPIO_SDA       GPIOA
  8. #define GPIO_Pin_SDA   GPIO_PIN_15

  9. //==========【配置IIC驅動引腳】========

  10. //配置驅動SCL的gpio為開漏輸出模式
  11. #define  TM1650_IIC_SCL_MODE_OD   gpio_init(GPIO_SCL, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_Pin_SCL)

  12. //配置驅動SDA的gpio為開漏輸出模式
  13. #define  TM1650_IIC_SDA_MODE_OD  gpio_init(GPIO_SDA, GPIO_MODE_OUT_PP , GPIO_OSPEED_50MHZ, GPIO_Pin_SDA)

  14. #define  TM1650_IIC_SDA_MODE_IF  gpio_init(GPIO_SDA, GPIO_MODE_IN_FLOATING , GPIO_OSPEED_50MHZ, GPIO_Pin_SDA)


  15. //=====================================


  16. //========【配置IIC總線的信號讀寫和時序】=======
  17. //主機拉高SCL
  18. #define TM1650_IIC_SCL_HIGH     gpio_bit_set(GPIO_SCL,GPIO_Pin_SCL)

  19. //主機拉低SCL
  20. #define TM1650_IIC_SCL_LOW      gpio_bit_reset(GPIO_SCL,GPIO_Pin_SCL)


  21. //主機拉高SDA
  22. #define TM1650_IIC_SDA_HIGH     gpio_bit_set(GPIO_SDA,GPIO_Pin_SDA)

  23. //主機拉低SDA
  24. #define TM1650_IIC_SDA_LOW      gpio_bit_reset(GPIO_SDA,GPIO_Pin_SDA)

  25. //參數b為0時主機拉低SDA,非0則拉高SDA
  26. #define TM1650_IIC_SDA_WR(b)    do{                                       \
  27.                                if(b) gpio_bit_set(GPIO_SDA,GPIO_Pin_SDA);   \
  28.                                else  gpio_bit_reset(GPIO_SDA,GPIO_Pin_SDA); \
  29.                               }while(0)


  30. //主機讀取SDA線電平狀態,返回值為0為低電平,非0則為高電平
  31. #define TM1650_IIC_SDA_RD()    gpio_input_bit_get(GPIO_SDA,GPIO_Pin_SDA)

  32. //軟件延時2us
  33. //#define TM1650_IIC_DELAY_2US   do{for(int ii_=0;ii_<22;ii_++);}while(0)

  34. //軟件延時4us
  35. //#define TM1650_IIC_DELAY_4US   do{for(int ii_=0;ii_<40;ii_++);}while(0)
  36. //================================


  37. //顯示參數
  38. #define TM1650_BRIGHT1       0x11   /*一級亮度,打開LED顯示*/
  39. #define TM1650_BRIGHT2       0x21   /*二級亮度,打開LED顯示*/
  40. #define TM1650_BRIGHT3       0x31   /*三級亮度,打開LED顯示*/
  41. #define TM1650_BRIGHT4       0x41   /*四級亮度,打開LED顯示*/
  42. #define TM1650_BRIGHT5       0x51   /*五級亮度,打開LED顯示*/
  43. #define TM1650_BRIGHT6       0x61   /*六級亮度,打開LED顯示*/
  44. #define TM1650_BRIGHT7       0x71   /*七級亮度,打開LED顯示*/
  45. #define TM1650_BRIGHT8       0x01   /*八級亮度,打開LED顯示*/
  46. #define TM1650_DSP_OFF       0x00   /*關閉LED顯示*/

  47. //數碼管位選
  48. #define TM1650_DIG1     0
  49. #define TM1650_DIG2     1
  50. #define TM1650_DIG3     2
  51. #define TM1650_DIG4     3

  52. void TM1650_init(void);
  53. void TM1650_cfg_display(uint8_t param);
  54. void TM1650_clear(void);
  55. void TM1650_print(uint8_t dig,uint8_t seg_data);

  56. #endif //TM1650_H_
復制代碼



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂久久新 | 欧美成人自拍 | 综合久| 国产亚洲精品精品国产亚洲综合 | 免费观看黄网站 | 日韩一区二区三区视频 | 一区二区三区不卡视频 | 久久久久久av | 国产成人啪免费观看软件 | 欧美精选一区二区 | 成人精品在线观看 | 久久国产精品免费 | 国产视频久久 | 精品亚洲一区二区三区 | 久久久夜色精品亚洲 | 久久久久电影 | 欧美成人a | 国产日韩久久 | 亚洲精品一区二 | 国产精品视频专区 | 国产成人亚洲精品 | 久久久99精品免费观看 | 在线一区 | 成人欧美一区二区三区视频xxx | 欧美又大粗又爽又黄大片视频 | 亚洲精品99 | 天天玩夜夜操 | 午夜欧美 | 精品国产一区二区三区免费 | 狠狠爱网址 | 国产一级一级 | 亚洲美女一区 | 日本精品一区二区三区视频 | 一区二区在线观看免费视频 | 亚洲精品1| 国产精品久久久久久久久久久免费看 | 高清av一区| 亚洲视频一区在线观看 | 亚洲三级在线观看 | 91婷婷韩国欧美一区二区 | 日本成人免费网站 |