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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4181|回復: 2
打印 上一主題 下一主題
收起左側(cè)

單片機控制三個獨立按鍵,長按加減鍵四位數(shù)碼管就顯示0000

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:598951 發(fā)表于 2019-8-20 18:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 fmdpj 于 2019-8-20 21:21 編輯

小白求助高手,在網(wǎng)上找到的FM發(fā)射控制程序,三個獨立按鍵分別是頻率加減鍵與立體聲開關,加減鍵是短按步進0.1MHz,長按自動加減,釋放停止加減,剛開始是一按加減鍵四位數(shù)碼管就顯示0000,按鍵也同時失效,后來把消抖延時加長到8000(原300)短按加減鍵會再顯示0000可以正常加減,但是長按還是不正常,長按可以加減10到20秒就又顯示0000按鍵同時失效,求高手指點

下面是源代碼,請高手幫忙看看程序那里有問題,應該怎樣改,謝謝!
  1. //使用AT89S52單片機,12MHz晶振,使用4位共陽數(shù)碼管作為頻率顯示。
  2. //P1口輸出段碼,P2口掃描。
  3. //頻率范圍87.5MHz--108.0MHz
  4. //***********************************************************************
  5. #include  <reg52.h>
  6. #include  <intrins.h>       //_nop_();延時函數(shù)調(diào)用                 
  7. #define    LED_DATA   P1            // 數(shù)碼管段碼輸出
  8. #define    LED_WEI    P2          // 數(shù)碼管位碼輸出,掃描口
  9. #define    uchar unsigned  char
  10. #define    uint unsigned  int
  11. sbit      key_fr_up      =P2^3;          //頻率增加鍵
  12. sbit      key_fr_down    =P2^2;          //頻率遞減鍵
  13. sbit      key_LTS_KZ     =P2^1;          //立體聲控制鍵
  14. sbit      LTS_LED        =P3^3;          //立體聲顯示//INT1
  15. sbit      CE             =P3^4;          //鎖存信號//CE
  16. sbit      CLK            =P3^5;        //時鐘信號//CLK
  17. sbit      DA             =P3^6;          //數(shù)據(jù)信號//DA
  18. sbit      dg             =P1^7;        //數(shù)碼管小數(shù)點                           
  19. //sbit SDA=P3^2;//24C01 數(shù)據(jù)線
  20. //sbit SCL=P3^1;//24c01 時鐘線


  21. uint      f_data;          //頻率數(shù)值
  22. //uchar DataBye;//從24C01中讀出的暫時存儲區(qū)

  23. bit        modo;     //立體聲數(shù)據(jù)寄存器
  24. uchar      key_temp;       //鍵盤有鍵按下標志位
  25. uint  i;
  26. uchar code DATA[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
  27. //數(shù)碼管顯示字0-9,不顯示
  28. uchar  code   WEI[4]={0x1f,0x2f,0x4f,0x8f};    //數(shù)碼管掃描控制
  29. uchar  data    display[4]={0x00,0x00,0x00,0x00};  //數(shù)碼管顯示數(shù)據(jù)緩沖區(qū)
  30. //************************延時函數(shù)1******************************
  31. void Delay1(void)
  32. {
  33. _nop_();
  34. _nop_();
  35. _nop_();
  36. _nop_();
  37. }
  38. ///***********************延時函數(shù)***********************************
  39. void  delay(uint t)
  40. {
  41. for(;t>0;t--);
  42. }
  43. ///***************************顯示函數(shù)******************************
  44. ///        4位數(shù)碼管動態(tài)掃描
  45. ///*****************************************************************
  46. void  xianshi(void)
  47. {
  48. uchar k;
  49. for(k=0;k<4;k++)                    //4位數(shù)碼管顯示
  50. {
  51. LED_DATA=DATA[display[k]];      
  52. LED_WEI=WEI[k];          //先顯示百位
  53. if(k==2){ dg=0; }                    //顯示小數(shù)點
  54. delay(35);
  55. }
  56. LED_DATA=0xff;                  //清除顯示
  57. }
  58. ///*************************顯示數(shù)值處理函數(shù)***************************
  59. //*********************************************************************
  60. void xianshi_turn(void)                  //頻率數(shù)據(jù)轉(zhuǎn)換為顯示用BCD碼函數(shù)
  61. {
  62. uint fr;
  63. display[0]=f_data/1000;                //求顯示百位數(shù)
  64. if(display[0]==0)
  65. {
  66. display[0]=10;
  67. }                                          
  68. fr=f_data%1000;
  69. display[1]=fr/100;                //求顯示十位數(shù)
  70. fr=fr%100;   
  71. display[2]=fr/10;                //求顯示個位數(shù)
  72. display[3]=fr%10;                //求顯示小數(shù)位
  73. }
  74. //***********************綜合顯示函數(shù)*********************************
  75. //********************************************************************
  76. void  T_Display(void)
  77. {
  78. xianshi_turn();
  79. xianshi();
  80. }
  81. ///*************************寫數(shù)據(jù)函數(shù)*********************************
  82. //將數(shù)據(jù)送入BH1415中
  83. //*********************************************************************
  84. void send_16data(uint Data,uchar MODO)
  85. {
  86. uchar i;
  87. CLK=0;
  88. CE=0;
  89. CE=1;  //連續(xù)保存高電平,可輸入數(shù)據(jù)
  90. for(i=11;i>0;i--)
  91. {
  92. DA=Data & 0x01;
  93. //傳輸BH1415F2個字節(jié)頻率控制11位D0-D10頻率數(shù)據(jù)
  94. Data>>=1;
  95. Delay1();
  96. CLK=1;
  97. Delay1();
  98. CLK=0;
  99. }
  100. DA=MODO;
  101. Delay1();
  102. CLK=1;   //MONO
  103. Delay1();
  104. CLK=0;
  105. Delay1();
  106. DA=0;
  107. Delay1();  //PD0
  108. CLK=1;   
  109. Delay1();
  110. CLK=0;
  111. Delay1();
  112. DA=0;
  113. Delay1();  //PD1
  114. CLK=1;  
  115. Delay1();  
  116. CLK=0;   
  117. Delay1();
  118. DA=1;
  119. Delay1();  //測試模式控制關閉
  120. CLK=1;   
  121. Delay1();
  122. CLK=0;
  123. Delay1();
  124. DA=0;
  125. Delay1();  //測試模式控制關閉
  126. CLK=1;   
  127. Delay1();
  128. CLK=0;
  129. CE=0;       //輸入數(shù)據(jù)結(jié)束
  130. }
  131. //*************************鍵盤處理函數(shù)*************************//
  132. //
  133. //
  134. //****************************************************************
  135. void KEY(void)
  136. {
  137. uint ii=0,jj=0;  //記錄頻率增加的個數(shù),若ii>4,f以5為增量增加
  138. uchar key_data;  //若jj>4,f以5為增量減小
  139. P2=0x0F;
  140. P1=0x0F;  //鍵盤掃描口斷碼輸出初始化//

  141. if((P2&0x0F)!=0x0F)
  142. {
  143. delayms(10);            
  144. if((P2&0x0F)!=0x0F)       //防抖動測試                           
  145. {   
  146. key_temp=1;      //鍵盤有鍵按下標志位//                              
  147. key_data=P2&0x0F;
  148. switch(key_data)
  149. {
  150. case  0x07:              //頻率自動加//
  151. {
  152. f_data++;
  153. if(f_data>1080)
  154. f_data=875;
  155. T_Display();
  156. while(key_fr_up==0)                     
  157. {
  158. for(i=400;i>0;i--)  //設置等待自動加頻率的時間
  159. {
  160. delay(50);
  161. if(key_fr_up==1)break;   
  162. }
  163. while(key_fr_up==0) //開始自動加頻率   
  164. {
  165. f_data++;
  166. ii++;
  167. if(ii>4)f_data+=5;
  168. if(f_data>1080)f_data=875;
  169. T_Display();
  170. for(i=110;i>0;i--)   //設置長時間按鍵
  171. //后,自動加數(shù)字的速度//
  172. {
  173. delay(25);
  174. if(key_fr_up==1)break;
  175. }
  176. }
  177. }
  178. break;
  179. }
  180. case 0x0B://頻率自動減//
  181. {
  182. f_data--;
  183. if(f_data<875)f_data=1080;
  184. T_Display();
  185. while(key_fr_down==0)
  186. {
  187. for(i=400;i>0;i--) //設置等待自動減頻率的時間
  188. {
  189. delay(50);
  190. if(key_fr_down==1)break;
  191. }
  192. while(key_fr_down==0) //開始自動減頻率
  193. {
  194. f_data--;
  195. ii++;
  196. if(ii>4) f_data-=5;
  197. if(f_data<875) f_data=1080;
  198. T_Display();
  199. for(i=110;i>0;i--)  //設置長時間按鍵后,自動減數(shù)字的速度//
  200. {
  201. delay(25);
  202. if(key_fr_down==1) break;
  203. }
  204. }
  205. }
  206. break;
  207. }
  208. case 0x0D:   //立體聲控制
  209. {
  210. if(key_LTS_KZ==0)
  211. {
  212. modo=~modo;
  213. LTS_LED=~modo;  //打開關閉立體聲
  214. //WriteIIC_24C01(0x02,modo);
  215. }
  216. while(key_LTS_KZ==0);
  217. break;
  218. }
  219. default:
  220. {
  221. key_temp=0;
  222. break;
  223. }
  224. }
  225. }
  226.   else  
  227. key_temp=0;
  228. }
  229. else  
  230. key_temp=0;
  231. }
  232. //**************************初始化程序**********************************//
  233. void CSH (void)
  234. { uint i;
  235. CE=0;
  236. CLK=0;
  237. DA=0;
  238. P2=0x0F;
  239. P1=0x0FF;    //鍵盤接口、掃描口、段碼輸出口初始化
  240. for(i=0;i<4;i++)      //開機
  241. display[i]=8;         //顯示
  242. for(i=0;i<500;i++)    //顯示
  243. xianshi();           //顯示8888
  244. f_data=875;
  245. modo=1;//立體聲關閉
  246. key_temp=0;
  247. }
  248. //***************************主程序MAIN()*******************************
  249. //TMOD:定時/計數(shù)器方式控制寄存器
  250. //TH0 TL0:定時計數(shù)器0
  251. //TR0:定時計數(shù)器0工作啟停位
  252. //ET0:定時計數(shù)器0允許中斷位
  253. //EA:中斷允許/禁止位
  254. //***********************************************************************
  255. main()
  256. {
  257. CSH();//開機初始化
  258. delay(50);
  259. //modo=(bit)(DataByte);
  260. delay(50);
  261. send_16data(f_data,modo);  //向1415送初始數(shù)據(jù)
  262. //DENGDAI();
  263. LTS_LED=~modo;  //立體聲打開
  264. TMOD=0x01;  //定時計數(shù)器0工作方式1,16位自動啟動方式
  265. TH0=0xEA;
  266. TL0=0xD0;                                                                                                   
  267. TR0=1;
  268. ET0=1;
  269. EA=1; //開中斷
  270. while(1) //啟動鍵盤處理程序,同時等待中斷
  271. {
  272. KEY();
  273. } //啟動鍵盤處理程序,同時等待中斷
  274. }
  275. //*****************************中斷服務程序******************************
  276. //5.424ms中斷一次
  277. //***********************************************************************
  278. void t0(void) interrupt 1 using 0
  279. {
  280. ET0=0;
  281. if(key_temp==1)
  282. {
  283. send_16data(f_data,modo); //向BH1415F發(fā)送數(shù)據(jù)
  284. }
  285. key_temp=0;
  286. xianshi_turn(); //顯示數(shù)據(jù)轉(zhuǎn)換
  287. xianshi();   
  288. key_temp=1;
  289. TH0=0xEA;
  290. TL0=0xD0;
  291. ET0=1;
  292. }
復制代碼

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

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2019-8-21 08:15 | 只看該作者
樓主的數(shù)碼管位碼和按鍵分別用了P2口的高4位和低4位,但是程序中并沒有把P2口的高4位和低4位隔離操作,也沒有分時操作。混在一起操作當然玩不轉(zhuǎn)。
回復

使用道具 舉報

板凳
ID:598951 發(fā)表于 2019-8-21 20:24 | 只看該作者
wulin 發(fā)表于 2019-8-21 08:15
樓主的數(shù)碼管位碼和按鍵分別用了P2口的高4位和低4位,但是程序中并沒有把P2口的高4位和低4位隔離操作,也沒 ...

要怎樣修改呢,
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产精品一区二区 | 国内精品视频在线 | www.av在线| 91精品国产91久久久久久最新 | 国产专区在线 | 网站国产 | 久久里面有精品 | 欧美日韩精品久久久免费观看 | 在线视频 欧美日韩 | 成人免费精品 | 国产不卡在线 | 一区二区三区免费观看 | 国产精品亚洲精品日韩已方 | 久久伊人一区 | 成人动慢| 亚洲免费视频在线观看 | 人成久久| 中文字幕第十一页 | 成年人在线电影 | 91精品一区二区三区久久久久久 | 国产精品久久久乱弄 | 欧美精品一区在线发布 | 在线亚洲电影 | 欧美区日韩区 | 日本在线播放一区二区 | 亚洲第一在线 | 欧美1区| 成人欧美一区二区三区黑人孕妇 | 国产精品久久久久久久久久久久久久 | av在线一区二区 | 亚洲国产欧美一区 | 色小姐综合网 | 在线观看亚洲精品 | 99综合在线 | 国产成人高清成人av片在线看 | 在线观看成人免费视频 | 亚洲最色视频 | 91精品一区二区三区久久久久久 | 国产精品三级久久久久久电影 | 国产综合久久 | 成人福利电影 |