久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機控制三個獨立按鍵,長按加減鍵四位數(shù)碼管就顯示0000
[打印本頁]
作者:
fmdpj
時間:
2019-8-20 18:07
標題:
單片機控制三個獨立按鍵,長按加減鍵四位數(shù)碼管就顯示0000
本帖最后由 fmdpj 于 2019-8-20 21:21 編輯
小白求助高手,在網(wǎng)上找到的FM發(fā)射控制程序,三個獨立按鍵分別是頻率加減鍵與立體聲開關(guān),加減鍵是短按步進0.1MHz,長按自動加減,釋放停止加減,剛開始是一按加減鍵四位數(shù)碼管就顯示0000,按鍵也同時失效,后來把消抖延時加長到8000(原300)短按加減鍵會再顯示0000可以正常加減,但是長按還是不正常,長按可以加減10到20秒就又顯示0000按鍵同時失效,求高手指點
下面是源代碼,請高手幫忙看看程序那里有問題,應該怎樣改,謝謝!
//使用AT89S52單片機,12MHz晶振,使用4位共陽數(shù)碼管作為頻率顯示。
//P1口輸出段碼,P2口掃描。
//頻率范圍87.5MHz--108.0MHz
//***********************************************************************
#include <reg52.h>
#include <intrins.h> //_nop_();延時函數(shù)調(diào)用
#define LED_DATA P1 // 數(shù)碼管段碼輸出
#define LED_WEI P2 // 數(shù)碼管位碼輸出,掃描口
#define uchar unsigned char
#define uint unsigned int
sbit key_fr_up =P2^3; //頻率增加鍵
sbit key_fr_down =P2^2; //頻率遞減鍵
sbit key_LTS_KZ =P2^1; //立體聲控制鍵
sbit LTS_LED =P3^3; //立體聲顯示//INT1
sbit CE =P3^4; //鎖存信號//CE
sbit CLK =P3^5; //時鐘信號//CLK
sbit DA =P3^6; //數(shù)據(jù)信號//DA
sbit dg =P1^7; //數(shù)碼管小數(shù)點
//sbit SDA=P3^2;//24C01 數(shù)據(jù)線
//sbit SCL=P3^1;//24c01 時鐘線
uint f_data; //頻率數(shù)值
//uchar DataBye;//從24C01中讀出的暫時存儲區(qū)
bit modo; //立體聲數(shù)據(jù)寄存器
uchar key_temp; //鍵盤有鍵按下標志位
uint i;
uchar code DATA[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
//數(shù)碼管顯示字0-9,不顯示
uchar code WEI[4]={0x1f,0x2f,0x4f,0x8f}; //數(shù)碼管掃描控制
uchar data display[4]={0x00,0x00,0x00,0x00}; //數(shù)碼管顯示數(shù)據(jù)緩沖區(qū)
//************************延時函數(shù)1******************************
void Delay1(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
///***********************延時函數(shù)***********************************
void delay(uint t)
{
for(;t>0;t--);
}
///***************************顯示函數(shù)******************************
/// 4位數(shù)碼管動態(tài)掃描
///*****************************************************************
void xianshi(void)
{
uchar k;
for(k=0;k<4;k++) //4位數(shù)碼管顯示
{
LED_DATA=DATA[display[k]];
LED_WEI=WEI[k]; //先顯示百位
if(k==2){ dg=0; } //顯示小數(shù)點
delay(35);
}
LED_DATA=0xff; //清除顯示
}
///*************************顯示數(shù)值處理函數(shù)***************************
//*********************************************************************
void xianshi_turn(void) //頻率數(shù)據(jù)轉(zhuǎn)換為顯示用BCD碼函數(shù)
{
uint fr;
display[0]=f_data/1000; //求顯示百位數(shù)
if(display[0]==0)
{
display[0]=10;
}
fr=f_data%1000;
display[1]=fr/100; //求顯示十位數(shù)
fr=fr%100;
display[2]=fr/10; //求顯示個位數(shù)
display[3]=fr%10; //求顯示小數(shù)位
}
//***********************綜合顯示函數(shù)*********************************
//********************************************************************
void T_Display(void)
{
xianshi_turn();
xianshi();
}
///*************************寫數(shù)據(jù)函數(shù)*********************************
//將數(shù)據(jù)送入BH1415中
//*********************************************************************
void send_16data(uint Data,uchar MODO)
{
uchar i;
CLK=0;
CE=0;
CE=1; //連續(xù)保存高電平,可輸入數(shù)據(jù)
for(i=11;i>0;i--)
{
DA=Data & 0x01;
//傳輸BH1415F2個字節(jié)頻率控制11位D0-D10頻率數(shù)據(jù)
Data>>=1;
Delay1();
CLK=1;
Delay1();
CLK=0;
}
DA=MODO;
Delay1();
CLK=1; //MONO
Delay1();
CLK=0;
Delay1();
DA=0;
Delay1(); //PD0
CLK=1;
Delay1();
CLK=0;
Delay1();
DA=0;
Delay1(); //PD1
CLK=1;
Delay1();
CLK=0;
Delay1();
DA=1;
Delay1(); //測試模式控制關(guān)閉
CLK=1;
Delay1();
CLK=0;
Delay1();
DA=0;
Delay1(); //測試模式控制關(guān)閉
CLK=1;
Delay1();
CLK=0;
CE=0; //輸入數(shù)據(jù)結(jié)束
}
//*************************鍵盤處理函數(shù)*************************//
//
//
//****************************************************************
void KEY(void)
{
uint ii=0,jj=0; //記錄頻率增加的個數(shù),若ii>4,f以5為增量增加
uchar key_data; //若jj>4,f以5為增量減小
P2=0x0F;
P1=0x0F; //鍵盤掃描口斷碼輸出初始化//
if((P2&0x0F)!=0x0F)
{
delayms(10);
if((P2&0x0F)!=0x0F) //防抖動測試
{
key_temp=1; //鍵盤有鍵按下標志位//
key_data=P2&0x0F;
switch(key_data)
{
case 0x07: //頻率自動加//
{
f_data++;
if(f_data>1080)
f_data=875;
T_Display();
while(key_fr_up==0)
{
for(i=400;i>0;i--) //設(shè)置等待自動加頻率的時間
{
delay(50);
if(key_fr_up==1)break;
}
while(key_fr_up==0) //開始自動加頻率
{
f_data++;
ii++;
if(ii>4)f_data+=5;
if(f_data>1080)f_data=875;
T_Display();
for(i=110;i>0;i--) //設(shè)置長時間按鍵
//后,自動加數(shù)字的速度//
{
delay(25);
if(key_fr_up==1)break;
}
}
}
break;
}
case 0x0B://頻率自動減//
{
f_data--;
if(f_data<875)f_data=1080;
T_Display();
while(key_fr_down==0)
{
for(i=400;i>0;i--) //設(shè)置等待自動減頻率的時間
{
delay(50);
if(key_fr_down==1)break;
}
while(key_fr_down==0) //開始自動減頻率
{
f_data--;
ii++;
if(ii>4) f_data-=5;
if(f_data<875) f_data=1080;
T_Display();
for(i=110;i>0;i--) //設(shè)置長時間按鍵后,自動減數(shù)字的速度//
{
delay(25);
if(key_fr_down==1) break;
}
}
}
break;
}
case 0x0D: //立體聲控制
{
if(key_LTS_KZ==0)
{
modo=~modo;
LTS_LED=~modo; //打開關(guān)閉立體聲
//WriteIIC_24C01(0x02,modo);
}
while(key_LTS_KZ==0);
break;
}
default:
{
key_temp=0;
break;
}
}
}
else
key_temp=0;
}
else
key_temp=0;
}
//**************************初始化程序**********************************//
void CSH (void)
{ uint i;
CE=0;
CLK=0;
DA=0;
P2=0x0F;
P1=0x0FF; //鍵盤接口、掃描口、段碼輸出口初始化
for(i=0;i<4;i++) //開機
display[i]=8; //顯示
for(i=0;i<500;i++) //顯示
xianshi(); //顯示8888
f_data=875;
modo=1;//立體聲關(guān)閉
key_temp=0;
}
//***************************主程序MAIN()*******************************
//TMOD:定時/計數(shù)器方式控制寄存器
//TH0 TL0:定時計數(shù)器0
//TR0:定時計數(shù)器0工作啟停位
//ET0:定時計數(shù)器0允許中斷位
//EA:中斷允許/禁止位
//***********************************************************************
main()
{
CSH();//開機初始化
delay(50);
//modo=(bit)(DataByte);
delay(50);
send_16data(f_data,modo); //向1415送初始數(shù)據(jù)
//DENGDAI();
LTS_LED=~modo; //立體聲打開
TMOD=0x01; //定時計數(shù)器0工作方式1,16位自動啟動方式
TH0=0xEA;
TL0=0xD0;
TR0=1;
ET0=1;
EA=1; //開中斷
while(1) //啟動鍵盤處理程序,同時等待中斷
{
KEY();
} //啟動鍵盤處理程序,同時等待中斷
}
//*****************************中斷服務程序******************************
//5.424ms中斷一次
//***********************************************************************
void t0(void) interrupt 1 using 0
{
ET0=0;
if(key_temp==1)
{
send_16data(f_data,modo); //向BH1415F發(fā)送數(shù)據(jù)
}
key_temp=0;
xianshi_turn(); //顯示數(shù)據(jù)轉(zhuǎn)換
xianshi();
key_temp=1;
TH0=0xEA;
TL0=0xD0;
ET0=1;
}
復制代碼
作者:
wulin
時間:
2019-8-21 08:15
樓主的數(shù)碼管位碼和按鍵分別用了P2口的高4位和低4位,但是程序中并沒有把P2口的高4位和低4位隔離操作,也沒有分時操作。混在一起操作當然玩不轉(zhuǎn)。
作者:
fmdpj
時間:
2019-8-21 20:24
wulin 發(fā)表于 2019-8-21 08:15
樓主的數(shù)碼管位碼和按鍵分別用了P2口的高4位和低4位,但是程序中并沒有把P2口的高4位和低4位隔離操作,也沒 ...
要怎樣修改呢,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久精品欧美一区二区三区不卡
|
涩涩视频在线观看
|
日韩一区二区三区视频在线播放
|
成人精品在线视频
|
91麻豆产精品久久久久久
|
天堂一区二区三区
|
99久久婷婷国产亚洲终合精品
|
国产美女永久免费无遮挡
|
人人人艹
|
www精品
|
99精品国产一区二区三区
|
av网站免费观看
|
午夜免费网站
|
91九色婷婷
|
91精品国产综合久久久亚洲
|
成人免费观看男女羞羞视频
|
日韩精品一区二区在线
|
91热在线
|
日韩综合在线
|
免费在线观看成人
|
在线国产中文字幕
|
久久av一区二区三区
|
天天操天天射综合
|
狠狠爱综合网
|
亚洲二区视频
|
手机av在线
|
国产精品一区二区欧美黑人喷潮水
|
日韩久久久久久久久久久
|
久久精品一级
|
欧美影院久久
|
www.亚洲精品
|
欧美三级三级三级爽爽爽
|
超碰在线久
|
九九综合
|
在线视频第一页
|
国产精品久久久久久久久久妇女
|
久久久久成人精品
|
国产一级在线观看
|
九一精品
|
日本一二三区在线观看
|
男女羞羞视频在线免费观看
|