欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15F104W單片機點亮由FD650B驅動的電子屏(拆機數碼管屏)
[打印本頁]
作者:
金滿斗
時間:
2022-5-28 15:59
標題:
STC15F104W單片機點亮由FD650B驅動的電子屏(拆機數碼管屏)
功能: 點亮由FD650B
ic驅動的電子屏,并實現按一下按鍵就數字加1,本來想時間周期里可以自動加1的,結果好像有沖突,以后再說 芯片型號STC15F104W單片機先找650b的廠家看資料,就看到了幾個說明書。并沒有想象中的源碼,然后網上到處百度,找的的資料是偏面向對象的寫法,看不懂,自己瞎擼吧。顯示屏板子就直接用的拆機設備的前面板,這里我們多。最終效果。
1.jpg
(42.68 KB, 下載次數: 34)
下載附件
2022-5-28 17:22 上傳
那個面板圖也找了份。
2.jpg
(85.86 KB, 下載次數: 50)
下載附件
2022-5-28 17:19 上傳
話不多說,直接上源碼吧。
先上hd650.h文件
單片機源程序如下:
#ifndef __FP__FD650__H
#define __FP__FD650__H
/*** type redefine ***/
typedef unsigned char MS_U8;
typedef unsigned short MS_U16;
typedef unsigned long MS_U32;
typedef int MS_S32;
typedef int MS_BOOL;
/****************************begin for FD650 define struct***************************** */
#define LEDMAPNUM 40
//key mapping
typedef struct
{
MS_U8 keyMapData;
MS_U8 keyMapLevel;
} MS_KEYMAP;
//led mapping
typedef struct _led_bitmap
{
MS_U8 character;
MS_U8 bitmap;
} led_bitmap;
//數碼管顯示常量
static const led_bitmap bcd_decode_tab[LEDMAPNUM] =
{ {'0', 0x3F}, {'1', 0x06}, {'2', 0x5B}, {'3', 0x4F},
{'4', 0x66}, {'5', 0x6D}, {'6', 0x7D}, {'7', 0x07},
{'8', 0x7F}, {'9', 0x6F}, {'a', 0x77}, {'A', 0x77},
{'b', 0x7C}, {'B', 0x7C}, {'c', 0x58}, {'C', 0x39},
{'d', 0x5E}, {'D', 0x5E}, {'e', 0x79}, {'E', 0x79},
{'f', 0x71}, {'F', 0x71}, {'H', 0x76}, {'h', 0x74},
{'o', 0x5C}, {'t', 0x78},
{'l', 0x30}, {'L', 0x38}, {'N', 0x37},{'n', 0x37},
{'p', 0x73},{'P', 0x73}, {'O', 0x3F}, {'u', 0x1C},
{'U', 0x3E},{'S', 0x6D}, {'s', 0x6D},{'-', 0x40},
{' ', 0x00}
};//BCD decode
/****************************end for FD650 define struct***************************** */
/* *************************************硬件相關*********************************************** */
#define HIGH 1
#define LOW 0
#define FRONTPNL_START_TIME_MS 3 //((1000 / 50) / LED_NUM)
#define FRONTPNL_PERIOD_TIME_MS 150
#define FP_LED_MAX_NUM 4
#define FrontPnl_MSECS_TICK 100 //100 msecs/tick
#define FrontPnl_TICKS_SEC 1 //10 ticks/sec
/* ********************************************************************************************* */
// 設置系統參數命令
#define FD650_BIT_ENABLE 0x01 // 開啟/關閉位
#define FD650_BIT_SLEEP 0x04 // 睡眠控制位
#define FD650_BIT_7SEG 0x08 // 7段控制位
#define FD650_BIT_INTENS1 0x10 // 1級亮度
#define FD650_BIT_INTENS2 0x20 // 2級亮度
#define FD650_BIT_INTENS3 0x30 // 3級亮度
#define FD650_BIT_INTENS4 0x40 // 4級亮度
#define FD650_BIT_INTENS5 0x50 // 5級亮度
#define FD650_BIT_INTENS6 0x60 // 6級亮度
#define FD650_BIT_INTENS7 0x70 // 7級亮度
#define FD650_BIT_INTENS8 0x00 // 8級亮度
#define FD650_SYSOFF 0x0400 // 關閉顯示、關閉鍵盤
#define FD650_SYSON ( FD650_SYSOFF | FD650_BIT_ENABLE ) // 開啟顯示、鍵盤
#define FD650_SLEEPOFF FD650_SYSOFF // 關閉睡眠
#define FD650_SLEEPON ( FD650_SYSOFF | FD650_BIT_SLEEP ) // 開啟睡眠
#define FD650_7SEG_ON ( FD650_SYSON | FD650_BIT_7SEG ) // 開啟七段模式
#define FD650_8SEG_ON ( FD650_SYSON | 0x00 ) // 開啟八段模式
#define FD650_SYSON_1 ( FD650_SYSON | FD650_BIT_INTENS1 ) // 開啟顯示、鍵盤、1級亮度
#define FD650_SYSON_4 ( FD650_SYSON | FD650_BIT_INTENS4 ) // 開啟顯示、鍵盤、4級亮度
#define FD650_SYSON_8 ( FD650_SYSON | FD650_BIT_INTENS8 ) // 開啟顯示、鍵盤、8級亮度
// 加載字數據命令
#define FD650_DIG0 0x1400 // 數碼管位0顯示,需另加8位數據
#define FD650_DIG1 0x1500 // 數碼管位1顯示,需另加8位數據
#define FD650_DIG2 0x1600 // 數碼管位2顯示,需另加8位數據
#define FD650_DIG3 0x1700 // 數碼管位3顯示,需另加8位數據
#define FD650_DOT 0x0080 // 數碼管小數點顯示
// 讀取按鍵代碼命令
#define FD650_GET_KEY 0x0700 // 獲取按鍵,返回按鍵代碼
#endif
復制代碼
然后上主程序文件
/********************************************************************
日 期:2022/05/28
功 能: 點亮由FD650Bic驅動的電子屏,并實現按一下按鍵就數字加1,本來想時間周期里可以自動加1的,結果好像有沖突再說 芯片型號STC15F104W
編 寫:勁松電腦通訊
*/
#include <stc15.h>
#include <fd650.h>
#define uchar unsigned char
#define FOSC 18432000L
//定義主時鐘
#define TIMS (65536-FOSC/1000) //1T模式,18.432MHz晶振
#define uint unsigned int //宏定義無符號整型,16位的unsigned int允許的取值范圍是0~65535。
sbit FD650_SCL = P3^4; //屏驅動口
sbit FD650_SDA = P3^5;
sbit LED1=P3^3; //燈
sbit key1=P3^2; //定義單片機P3口的第2位 (即P3.2)//為輸入 這里是7腳,就是按鍵
// 微秒級延時
void DELAY(uchar i){
while(i--);
}
//顯示屏開始信號:保持 CLK 為“1”電平,DAT 從“1”跳“0”,認為是開始信號
static void MDrv_FD650_Start( void ){
FD650_SDA = 1;
FD650_SCL = 1;
DELAY(5);
FD650_SDA = 0;
DELAY(5);
FD650_SCL = 0;
}
//顯示屏結束信號:保持 CLK 為“1”電平,DAT 從“0”跳“1”,認為是結束信號
static void MDrv_FD650_Stop( void ){
FD650_SDA = 0;
FD650_SCL = 1;
DELAY(5);
FD650_SDA = 1;
}
//寫一個數據
static void MDrv_FD650_WrByte( MS_U8 dat )
{
MS_U8 i;
for( i = 0; i != 8; i++ ) //數據循環8次,每一位判斷數據是1還是0
{
if( dat & 0x80 ){ //如dat為10010001,& 0x80,與10000000,結果為10000000,大于0,條件為真
FD650_SDA = 1; //所以只跟最前面的一位有關,首位為1結果為1,符合則讓DTA輸出1
}else{
FD650_SDA = 0;
}
DELAY(5);
FD650_SCL = 1; //一個時鐘脈沖傳輸一位數據//CLK為高電平時數據必須保持不變
dat <<= 1;
DELAY(5);
FD650_SCL = 0; //直到CLK為低電平,一位數據傳輸結束
}
FD650_SDA = 1; //寫入,CLK從0跳到1,再從1跳到0 //寫入650的內存
DELAY(5);
FD650_SCL = 1;
DELAY(5);
FD650_SCL = 0;
}
//寫命令
static void MDrv_FD650_Write( MS_U16 cmd ) //write cmd
{
MDrv_FD650_Start();
MDrv_FD650_WrByte(((MS_U8)(cmd>>7)&0x3E)|0x40);
MDrv_FD650_WrByte((MS_U8)cmd);
DELAY(2);
MDrv_FD650_Stop();
return;
}
/*讀取要顯示內容的對應地址 */
static MS_U8 MDrv_Led_Get_Code(MS_U8 cTemp)
{
MS_U8 i, bitmap = 0x00;
for(i = 0; i < LEDMAPNUM; i++){
if(bcd_decode_tab[i].character == cTemp){
bitmap = bcd_decode_tab[i].bitmap;
break;
}
}
return bitmap;
}
/*
*更新數據(文本數據地址,是否帶中間兩點)
*點亮數碼管,注意,如果只有3位的話依次是點亮2,3,4管
*/
static void MDrv_FrontPnl_Update(MS_U8 *u8str, MS_BOOL Colon_flag)
{
int i;
MS_U8 LedBuffer[4];
if(!u8str) return;
for(i = 0; i < FP_LED_MAX_NUM; i++){ // FP_LED_MAX_NUM 最大顯示位數,在.h文件里定義了,這里是4
LedBuffer[i] = MDrv_Led_Get_Code(u8str[i]);
}
MDrv_FD650_Write(FD650_SYSON_4);// 開啟顯示和鍵盤,4段顯示方式
//發顯示數據
MDrv_FD650_Write( FD650_DIG0 | LedBuffer[0] ); //點亮第一個數碼管
if(Colon_flag){
MDrv_FD650_Write( FD650_DIG1 | LedBuffer[1] | FD650_DOT ); //點亮小數點
}
MDrv_FD650_Write( FD650_DIG1 | LedBuffer[1] );
MDrv_FD650_Write( FD650_DIG2 | LedBuffer[2]); //點亮第三個數碼管
MDrv_FD650_Write( FD650_DIG3 | LedBuffer[3] | 0); //點亮第四個數碼管
}
//數字轉文本(待轉換數字)
static MS_U8 *mystring(int Num){
static MS_U8 dat[4];
dat[0]=Num%10000/1000+'0';
dat[1]=Num%1000/100+'0';
dat[2]=Num%100/10+'0';
dat[3]=Num%10+'0';
return dat;
}
//延遲
void delayms(unsigned int ms)
{
unsigned int i;
do{
i = FOSC/13000;
while(--i);
}
while(--ms);
}
//========================================================================
// 函數: void tm0_isr (void) interrupt TIMER0_VECTOR
// 描述: timer0中斷函數. 相當于于時間周期,大約1毫秒一個周期
// 參數: none.
// 返回: none.
//========================================================================
void tm0_isr (void) interrupt 1 using 1
{
static uint key_time = 0; //局部計時
static int mymun = 0;
key_time++;
if(key_time>=(1000*2)){
mymun++;
LED1 = ~LED1;
//MDrv_FrontPnl_Update(mystring(mymun),0); //本來想讓他按2秒走的,不曉得哪里沖突了,以后再說
key_time =0 ;
}
}
//========================================================================
// 函數: TIME_INIT
// 描述: 定時器初始
// 參數: none.
// 返回: none.
//========================================================================
void TIME_INIT(){
AUXR |=0x80; //定時器0設置為1t模式
TMOD = 0x00; //設置定時器為模式0(16位自動裝載)
TL0 = TIMS; //計時器初始化開始計時
TH0 = TIMS >> 8 ; //向右移動8位搞什么
TR0 = 1;
ET0 = 1;
EA = 1;
}
///============================================== //
void main(void)
{
int mm = 0;
TIME_INIT();
MDrv_FrontPnl_Update((MS_U8*)" OFF",0); //來個初始顯示,可以直接顯示字符串的,傳入文本指針
while(1)
{
if(key1==0)
{
delayms(30); //這里判斷按鍵時長
if(key1==0)
{
while(!key1); //這個必須加,表示判斷按鍵是否松開,不然按鍵時燈閃爍
mm++;
MDrv_FrontPnl_Update(mystring(mm),0); //顯示按鍵加1
}
}
}
}
復制代碼
單片機用的是那種最小開發板,幾元錢的那種
最后源碼也傳到開源平臺了,希望大家用的開心
作者:
飛騰網絡
時間:
2022-6-30 19:36
您好 請教師傅 我看您的是8條線 其中在電容那是電源 排線那四根 有一根數據 一根時鐘 那么剩下兩個是什么 還有 兩根紫色和白色的 通道哪里 謝謝老師指點一下
作者:
飛騰網絡
時間:
2022-6-30 19:36
您好 請教師傅 我看您的是8條線
其中在電容那是電源
排線那四根 有一根數據 一根時鐘 那么剩下兩個是什么
還有 兩根紫色和白色的 通道哪里 謝謝老師指點一下
作者:
zmc419
時間:
2022-7-24 20:45
太好了,我搞了FD650很久,可以正常顯示,無按鍵功能,這下好了
作者:
zmc419
時間:
2022-9-9 14:16
我用普中開發板也調通了?能否再寫個按鍵讀取程序,并顯示
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1