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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F104W單片機點亮由FD650B驅動的電子屏(拆機數碼管屏)

[復制鏈接]
跳轉到指定樓層
樓主
功能: 點亮由FD650B ic驅動的電子屏,并實現按一下按鍵就數字加1,本來想時間周期里可以自動加1的,結果好像有沖突,以后再說    芯片型號STC15F104W單片機先找650b的廠家看資料,就看到了幾個說明書。并沒有想象中的源碼,然后網上到處百度,找的的資料是偏面向對象的寫法,看不懂,自己瞎擼吧。顯示屏板子就直接用的拆機設備的前面板,這里我們多。最終效果。



那個面板圖也找了份。


話不多說,直接上源碼吧。
先上hd650.h文件

單片機源程序如下:
  1. #ifndef __FP__FD650__H
  2. #define __FP__FD650__H

  3. /*** type redefine ***/

  4. typedef unsigned char MS_U8;
  5. typedef unsigned short MS_U16;
  6. typedef unsigned long MS_U32;
  7. typedef int MS_S32;
  8. typedef int MS_BOOL;


  9. /****************************begin for FD650 define struct***************************** */
  10. #define LEDMAPNUM 40

  11. //key mapping
  12. typedef struct
  13. {
  14.   MS_U8 keyMapData;
  15.   MS_U8 keyMapLevel;

  16. } MS_KEYMAP;

  17. //led mapping
  18. typedef struct _led_bitmap
  19. {
  20.   MS_U8 character;
  21.   MS_U8 bitmap;
  22. } led_bitmap;

  23. //數碼管顯示常量
  24. static const led_bitmap bcd_decode_tab[LEDMAPNUM] =
  25. {        {'0', 0x3F}, {'1', 0x06}, {'2', 0x5B}, {'3', 0x4F},
  26.     {'4', 0x66}, {'5', 0x6D}, {'6', 0x7D}, {'7', 0x07},
  27.     {'8', 0x7F}, {'9', 0x6F}, {'a', 0x77}, {'A', 0x77},
  28.     {'b', 0x7C}, {'B', 0x7C}, {'c', 0x58}, {'C', 0x39},
  29.     {'d', 0x5E}, {'D', 0x5E}, {'e', 0x79}, {'E', 0x79},
  30.     {'f', 0x71}, {'F', 0x71}, {'H', 0x76}, {'h', 0x74},
  31.     {'o', 0x5C}, {'t', 0x78},
  32.     {'l', 0x30}, {'L', 0x38}, {'N', 0x37},{'n', 0x37},
  33.     {'p', 0x73},{'P', 0x73}, {'O', 0x3F}, {'u', 0x1C},
  34.     {'U', 0x3E},{'S', 0x6D}, {'s', 0x6D},{'-', 0x40},
  35.     {' ', 0x00}
  36. };//BCD decode


  37. /****************************end for FD650 define struct***************************** */

  38. /* *************************************硬件相關*********************************************** */
  39. #define HIGH 1
  40. #define LOW  0

  41. #define FRONTPNL_START_TIME_MS      3   //((1000 / 50) / LED_NUM)
  42. #define FRONTPNL_PERIOD_TIME_MS     150
  43. #define FP_LED_MAX_NUM                 4
  44. #define FrontPnl_MSECS_TICK         100 //100 msecs/tick
  45. #define FrontPnl_TICKS_SEC          1    //10 ticks/sec
  46. /* ********************************************************************************************* */
  47. // 設置系統參數命令

  48. #define FD650_BIT_ENABLE  0x01    // 開啟/關閉位
  49. #define FD650_BIT_SLEEP   0x04    // 睡眠控制位
  50. #define FD650_BIT_7SEG    0x08    // 7段控制位
  51. #define FD650_BIT_INTENS1 0x10    // 1級亮度
  52. #define FD650_BIT_INTENS2 0x20    // 2級亮度
  53. #define FD650_BIT_INTENS3 0x30    // 3級亮度
  54. #define FD650_BIT_INTENS4 0x40    // 4級亮度
  55. #define FD650_BIT_INTENS5 0x50    // 5級亮度
  56. #define FD650_BIT_INTENS6 0x60    // 6級亮度
  57. #define FD650_BIT_INTENS7 0x70    // 7級亮度
  58. #define FD650_BIT_INTENS8 0x00    // 8級亮度

  59. #define FD650_SYSOFF  0x0400      // 關閉顯示、關閉鍵盤
  60. #define FD650_SYSON ( FD650_SYSOFF | FD650_BIT_ENABLE ) // 開啟顯示、鍵盤
  61. #define FD650_SLEEPOFF  FD650_SYSOFF  // 關閉睡眠
  62. #define FD650_SLEEPON ( FD650_SYSOFF | FD650_BIT_SLEEP )  // 開啟睡眠
  63. #define FD650_7SEG_ON ( FD650_SYSON | FD650_BIT_7SEG )  // 開啟七段模式
  64. #define FD650_8SEG_ON ( FD650_SYSON | 0x00 )  // 開啟八段模式
  65. #define FD650_SYSON_1 ( FD650_SYSON | FD650_BIT_INTENS1 ) // 開啟顯示、鍵盤、1級亮度
  66. #define FD650_SYSON_4 ( FD650_SYSON | FD650_BIT_INTENS4 ) // 開啟顯示、鍵盤、4級亮度
  67. #define FD650_SYSON_8 ( FD650_SYSON | FD650_BIT_INTENS8 ) // 開啟顯示、鍵盤、8級亮度


  68. // 加載字數據命令
  69. #define FD650_DIG0    0x1400      // 數碼管位0顯示,需另加8位數據
  70. #define FD650_DIG1    0x1500      // 數碼管位1顯示,需另加8位數據
  71. #define FD650_DIG2    0x1600      // 數碼管位2顯示,需另加8位數據
  72. #define FD650_DIG3    0x1700      // 數碼管位3顯示,需另加8位數據
  73. #define FD650_DOT     0x0080      // 數碼管小數點顯示
  74. // 讀取按鍵代碼命令
  75. #define FD650_GET_KEY 0x0700          // 獲取按鍵,返回按鍵代碼
  76.       
  77. #endif
復制代碼




然后上主程序文件
  1. /********************************************************************
  2. 日    期:2022/05/28
  3. 功    能: 點亮由FD650Bic驅動的電子屏,并實現按一下按鍵就數字加1,本來想時間周期里可以自動加1的,結果好像有沖突再說    芯片型號STC15F104W         
  4. 編    寫:勁松電腦通訊
  5. */
  6. #include <stc15.h>
  7. #include <fd650.h>
  8. #define uchar unsigned char
  9. #define FOSC  18432000L
  10. //定義主時鐘
  11. #define TIMS (65536-FOSC/1000)    //1T模式,18.432MHz晶振
  12. #define uint unsigned int  //宏定義無符號整型,16位的unsigned int允許的取值范圍是0~65535。

  13. sbit FD650_SCL = P3^4;    //屏驅動口
  14. sbit FD650_SDA = P3^5;                     
  15. sbit LED1=P3^3;        //燈
  16. sbit key1=P3^2;         //定義單片機P3口的第2位 (即P3.2)//為輸入           這里是7腳,就是按鍵

  17. //        微秒級延時
  18. void DELAY(uchar i){
  19.         while(i--);
  20. }

  21. //顯示屏開始信號:保持 CLK 為“1”電平,DAT 從“1”跳“0”,認為是開始信號
  22. static  void MDrv_FD650_Start( void ){
  23.         FD650_SDA = 1;
  24.         FD650_SCL = 1;
  25.         DELAY(5);
  26.         FD650_SDA = 0;
  27.         DELAY(5);
  28.         FD650_SCL = 0;
  29. }

  30. //顯示屏結束信號:保持 CLK 為“1”電平,DAT 從“0”跳“1”,認為是結束信號
  31. static  void MDrv_FD650_Stop( void ){
  32.         FD650_SDA = 0;
  33.         FD650_SCL = 1;
  34.         DELAY(5);
  35.         FD650_SDA = 1;
  36. }

  37. //寫一個數據
  38. static void MDrv_FD650_WrByte( MS_U8 dat )
  39. {
  40.     MS_U8 i;
  41.     for( i = 0; i != 8; i++ )   //數據循環8次,每一位判斷數據是1還是0
  42.     {
  43.         if( dat & 0x80 ){          //如dat為10010001,& 0x80,與10000000,結果為10000000,大于0,條件為真
  44.             FD650_SDA = 1;     //所以只跟最前面的一位有關,首位為1結果為1,符合則讓DTA輸出1
  45.         }else{
  46.             FD650_SDA = 0;
  47.         }
  48.         DELAY(5);
  49.         FD650_SCL = 1;     //一個時鐘脈沖傳輸一位數據//CLK為高電平時數據必須保持不變
  50.         dat <<= 1;
  51.         DELAY(5);
  52.         FD650_SCL = 0;      //直到CLK為低電平,一位數據傳輸結束
  53.     }
  54.     FD650_SDA = 1;     //寫入,CLK從0跳到1,再從1跳到0        //寫入650的內存
  55.     DELAY(5);
  56.     FD650_SCL = 1;
  57.     DELAY(5);
  58.     FD650_SCL = 0;
  59. }

  60. //寫命令
  61. static void MDrv_FD650_Write( MS_U16 cmd ) //write cmd
  62. {
  63.     MDrv_FD650_Start();
  64.     MDrv_FD650_WrByte(((MS_U8)(cmd>>7)&0x3E)|0x40);
  65.     MDrv_FD650_WrByte((MS_U8)cmd);
  66.     DELAY(2);
  67.     MDrv_FD650_Stop();
  68.     return;
  69. }
  70. /*讀取要顯示內容的對應地址 */
  71. static MS_U8 MDrv_Led_Get_Code(MS_U8 cTemp)
  72. {
  73.     MS_U8 i, bitmap = 0x00;
  74.     for(i = 0; i < LEDMAPNUM; i++){
  75.         if(bcd_decode_tab[i].character == cTemp){
  76.                      bitmap = bcd_decode_tab[i].bitmap;
  77.              break;
  78.          }
  79.     }
  80.     return bitmap;
  81. }

  82. /*
  83. *更新數據(文本數據地址,是否帶中間兩點)
  84. *點亮數碼管,注意,如果只有3位的話依次是點亮2,3,4管
  85. */
  86. static void MDrv_FrontPnl_Update(MS_U8 *u8str, MS_BOOL Colon_flag)
  87. {
  88.     int i;
  89.     MS_U8 LedBuffer[4];
  90.     if(!u8str) return;
  91.     for(i = 0; i < FP_LED_MAX_NUM; i++){           // FP_LED_MAX_NUM 最大顯示位數,在.h文件里定義了,這里是4
  92.         LedBuffer[i] = MDrv_Led_Get_Code(u8str[i]);
  93.     }
  94.     MDrv_FD650_Write(FD650_SYSON_4);// 開啟顯示和鍵盤,4段顯示方式
  95.     //發顯示數據
  96.     MDrv_FD650_Write( FD650_DIG0 | LedBuffer[0] ); //點亮第一個數碼管
  97.     if(Colon_flag){
  98.                 MDrv_FD650_Write( FD650_DIG1 | LedBuffer[1] | FD650_DOT ); //點亮小數點
  99.         }
  100.         MDrv_FD650_Write( FD650_DIG1 | LedBuffer[1] );
  101.         MDrv_FD650_Write( FD650_DIG2 | LedBuffer[2]); //點亮第三個數碼管
  102.         MDrv_FD650_Write( FD650_DIG3 | LedBuffer[3] | 0); //點亮第四個數碼管               
  103. }

  104. //數字轉文本(待轉換數字)
  105. static  MS_U8 *mystring(int Num){
  106.         static  MS_U8 dat[4];
  107.         dat[0]=Num%10000/1000+'0';
  108.         dat[1]=Num%1000/100+'0';
  109.         dat[2]=Num%100/10+'0';
  110.         dat[3]=Num%10+'0';
  111.         return dat;
  112. }

  113. //延遲
  114. void  delayms(unsigned int ms)
  115. {
  116. unsigned int i;
  117. do{
  118.     i = FOSC/13000;
  119.     while(--i);   
  120.    }
  121.          while(--ms);
  122. }
  123. //========================================================================
  124. // 函數: void tm0_isr  (void) interrupt TIMER0_VECTOR
  125. // 描述:  timer0中斷函數. 相當于于時間周期,大約1毫秒一個周期
  126. // 參數: none.
  127. // 返回: none.
  128. //========================================================================
  129. void tm0_isr (void) interrupt 1 using 1
  130. {
  131.    static uint  key_time = 0;   //局部計時
  132.    static int mymun  = 0;
  133.          key_time++;
  134.          if(key_time>=(1000*2)){
  135.                  mymun++;
  136.                  LED1 = ~LED1;
  137.                 //MDrv_FrontPnl_Update(mystring(mymun),0);   //本來想讓他按2秒走的,不曉得哪里沖突了,以后再說
  138.             key_time =0 ;
  139.    }
  140.    
  141. }
  142. //========================================================================
  143. // 函數: TIME_INIT
  144. // 描述: 定時器初始
  145. // 參數: none.
  146. // 返回: none.
  147. //========================================================================
  148. void TIME_INIT(){
  149.         AUXR |=0x80;      //定時器0設置為1t模式
  150.         TMOD = 0x00;         //設置定時器為模式0(16位自動裝載)
  151.         TL0 = TIMS;         //計時器初始化開始計時
  152.         TH0 = TIMS >> 8 ;      //向右移動8位搞什么
  153.         TR0 = 1;
  154.         ET0 = 1;
  155.         EA = 1;
  156. }
  157. ///============================================== //

  158. void main(void)
  159. {           
  160.          int mm = 0;
  161.         TIME_INIT();               
  162.     MDrv_FrontPnl_Update((MS_U8*)" OFF",0);           //來個初始顯示,可以直接顯示字符串的,傳入文本指針
  163.         while(1)
  164.         {
  165.                 if(key1==0)
  166.                 {
  167.                         delayms(30);    //這里判斷按鍵時長
  168.                         if(key1==0)
  169.                         {
  170.                                 while(!key1);           //這個必須加,表示判斷按鍵是否松開,不然按鍵時燈閃爍
  171.                                 mm++;
  172.                                 MDrv_FrontPnl_Update(mystring(mm),0);    //顯示按鍵加1
  173.                                 
  174.                         }
  175.                 }
  176.         }
  177. }
復制代碼
單片機用的是那種最小開發板,幾元錢的那種
最后源碼也傳到開源平臺了,希望大家用的開心

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:488937 發表于 2022-6-30 19:36 | 只看該作者
您好  請教師傅  我看您的是8條線    其中在電容那是電源   排線那四根 有一根數據 一根時鐘 那么剩下兩個是什么 還有 兩根紫色和白色的 通道哪里  謝謝老師指點一下
回復

使用道具 舉報

板凳
ID:488937 發表于 2022-6-30 19:36 | 只看該作者
您好  請教師傅  我看您的是8條線  
其中在電容那是電源  
排線那四根 有一根數據 一根時鐘 那么剩下兩個是什么
還有 兩根紫色和白色的 通道哪里  謝謝老師指點一下
回復

使用道具 舉報

地板
ID:137736 發表于 2022-7-24 20:45 | 只看該作者
太好了,我搞了FD650很久,可以正常顯示,無按鍵功能,這下好了
回復

使用道具 舉報

5#
ID:137736 發表于 2022-9-9 14:16 | 只看該作者
我用普中開發板也調通了?能否再寫個按鍵讀取程序,并顯示
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 羞羞的视频免费在线观看 | 精品日本久久久久久久久久 | 日韩插插| 日本在线免费观看 | 天天av综合| 色婷婷一区二区三区四区 | 99久久精品免费看国产四区 | 奇米超碰 | 在线精品亚洲欧美日韩国产 | 国产高清一区二区三区 | 欧美午夜剧场 | www.天天操| 亚洲欧美综合精品另类天天更新 | 天天草天天 | 国产目拍亚洲精品99久久精品 | 成人av在线大片 | 久久大陆 | 在线成人精品视频 | 国产精品一二三区 | 99久久婷婷| 欧美日韩一区二区三区在线观看 | 黄色网址免费在线观看 | 一区二区三区久久 | 国产精品一区二区福利视频 | 久久久国产精品视频 | 亚洲欧美精品 | 亚洲一区高清 | 亚洲欧美一区二区三区视频 | 日韩和的一区二在线 | 国产精品久久久久久久粉嫩 | 欧美久久国产 | 伊人网99 | 国产精品久久久久久久久久久久久 | 亚洲精品一区二区三区在线 | 久久久国产一区二区三区四区小说 | 日韩在线一区二区三区 | 日韩一区二区三区在线观看视频 | 日韩欧美一区二区三区四区 | 二区不卡| 国产精品视频久久久久 | 国产精品久久久久久久久久久免费看 |