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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2021|回復: 0
收起左側

rad5820一體機51單片機程序

[復制鏈接]
ID:580527 發表于 2019-7-31 19:24 | 顯示全部樓層 |閱讀模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar mode=0,gongneng=0;
  6. bit mute=0; //RDA5820 的寄存器地址
  7. #define RDA5820_READ 0X23 //讀 RDA5820
  8. #define RDA5820_WRITE 0X22 //寫 RDA5820
  9. uchar code *table[]={"0","1","2","3","4","5","6","7","8","9"};
  10. /*--------- 液晶端口定義 -----*/
  11. sbit LCD_RST = P1^0; //low active
  12. sbit LCD_CE = P1^1; //low active
  13. sbit LCD_DC = P1^2; //0=command,1=data
  14. sbit LCD_DIN = P1^3; //rise edge enable
  15. sbit LCD_CLK = P1^4; //clock
  16. sbit contrl=P2^7;
  17. sbit SDA =P0^0;
  18. sbit SCL =P0^1;
  19. sbit KEYup = P3^3; //按鍵
  20. sbit KEYdown = P3^4;
  21. sbit KEY3 = P3^5;
  22. sbit KEY4 = P3^6; //按鍵
  23. sbit KEY = P3^7;
  24. unsigned char code font6x8[][6] =
  25. {
  26. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
  27. { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
  28. { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
  29. { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
  30. { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
  31. { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
  32. { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
  33. { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
  34. { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
  35. { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
  36. { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
  37. { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
  38. { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
  39. { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
  40. { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
  41. { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
  42. { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
  43. { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
  44. { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
  45. { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
  46. { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
  47. { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
  48. { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
  49. { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
  50. { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
  51. { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
  52. { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
  53. { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
  54. { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
  55. { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
  56. { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
  57. { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
  58. { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
  59. { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
  60. { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
  61. { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
  62. { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
  63. { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
  64. { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
  65. { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
  66. { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
  67. { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
  68. { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
  69. { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
  70. { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
  71. { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
  72. { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
  73. { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
  74. { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
  75. { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
  76. { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
  77. { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
  78. { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
  79. { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
  80. { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
  81. { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
  82. { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
  83. { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
  84. { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
  85. { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
  86. { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
  87. { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
  88. { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
  89. { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
  90. { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
  91. { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
  92. { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
  93. { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
  94. { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
  95. { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
  96. { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
  97. { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
  98. { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
  99. { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
  100. { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
  101. { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
  102. { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
  103. { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
  104. { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
  105. { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
  106. { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
  107. { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
  108. { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
  109. { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
  110. { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
  111. { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
  112. { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
  113. { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
  114. { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
  115. { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
  116. { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
  117. { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
  118. }; /****************************** 漢子字模 *************************************/
  119. unsigned char code hanzi[][16]=
  120. { /*-- 文字 : 收 -*/ 0x00,0xFC,0x00,0x00,0xFF,0x00,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00, //0
  121. 0x00,0x0F,0x04,0x02,0xFF,0x00,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00, /*-- 文字 : 音 --*/

  122. 0x40,0x40,0x44,0x44,0x54,0x64,0x45,0x46,0x44,0x64,0x54,0x44,0x44,0x40,0x40,0x00, //2
  123. 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00, /*-- 文字 : 機 --*/
  124. 0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00, //4
  125. 0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00, /*-- 文字 : 發 --*/
  126. 0x00,0x00,0x18,0x16,0x10,0xD0,0xB8,0x97,0x90,0x90,0x90,0x92,0x94,0x10,0x00,0x00, //6
  127. 0x00,0x20,0x10,0x8C,0x83,0x80,0x41,0x46,0x28,0x10,0x28,0x44,0x43,0x80,0x80,0x00, /*-- 文字 : 射 --*/
  128. 0x00,0x00,0xFC,0x56,0x55,0x54,0xFC,0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00, //8
  129. 0x02,0x42,0x23,0x12,0x4A,0x86,0x7F,0x00,0x00,0x01,0x46,0x80,0x7F,0x00,0x00,0x00, /*-- 文字 : 機 --*/
  130. 0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00, //10
  131. 0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,
  132. 0x00,0x00,0x01,0x03,0x07,0x0F,0x1B,0xF3,0xF3,0x1B,0x0F,0x07,0x03,0x01,0x00,0x00, //12 信號強度
  133. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  134. 0x01,0x02,0x04,0x08,0xF0,0x30,0x50,0xF8,0x8C,0x44,0x24,0x14,0xFC,0xFC,0x02,0x01, //14 靜音
  135. 0x80,0x40,0x20,0x10,0x0F,0x0C,0x0A,0x1F,0x11,0x2A,0x24,0x28,0x3F,0x3F,0x40,0x80,
  136. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 取消靜音符號
  137. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  138. };
  139. void delayms(unsigned int m)
  140. {
  141.         unsigned int i,j;
  142.         for(i=m;i>0;i--)
  143.         for(j=113;j>0;j--);
  144. }
  145. void delayus()
  146. {
  147.         _nop_ () ;
  148. }
  149. /****************************Nokia5110*************************************/
  150. void LCD_write_byte(uchar dat,uchar cmd)
  151. {
  152.         uchar i;
  153.         LCD_CE=0;
  154.         if(cmd==0) LCD_DC=0; //命令
  155.         else LCD_DC=1; //數據
  156.                 for(i=0;i<8;i++)
  157.                 {
  158.                         if(dat&0x80) //高位傳起
  159.                         LCD_DIN=1;
  160.                         else
  161.                         LCD_DIN=0;
  162.                         LCD_CLK=0; dat=dat<<1; //移位
  163.                         LCD_CLK=1;
  164.                 }
  165.         LCD_CE=1;
  166. }
  167. /*-------------------- 函數名稱: LCD_set_xy 入口參數: x:0-5 行選擇 y:0-83 列選擇
  168. ---------------------*/
  169. void LCD_set_xy(uchar x,uchar y)
  170. {
  171.         LCD_write_byte(0x40|y,0); //y:0-5
  172.         LCD_write_byte(0x80|x,0); //x:0-83
  173. }
  174. /*------------------------ 函數名稱: LCD_clear 功能:清屏,向 ram 內寫 0
  175. -------------------------*/
  176. void LCD_clear()
  177. {
  178.         unsigned int i;
  179.         LCD_write_byte(0x0c,0);
  180.         LCD_write_byte(0x80,0);  
  181.         for(i=0;i<504;i++)
  182.         LCD_write_byte(0x00,1);
  183. }
  184. /*------------------ 函數名稱: LCD_write_char 功能:寫入一個字符 入口參數: c
  185. ------------------*/
  186. void LCD_write_char(uchar c)
  187. {
  188.         uchar line;
  189.         c-=32; //轉 ASCII 碼
  190.         for(line=0;line<6;line++) //6 列
  191.         LCD_write_byte(font6x8[c][line], 1); //檢索
  192. }
  193. /*-------------------------------- 函數名稱: LCD_write_english_string 功能:寫入字符串 入口參數: x,y:地址 s:地址指針 ---------------------------------*/
  194. void LCD_write_english_string(uchar x,uchar y,char *s)
  195. {
  196.         LCD_set_xy(x,y);
  197.         while(*s)
  198.                 {
  199.                 LCD_write_char(*s);
  200.                 s++;
  201.                 }
  202. }
  203. /*------------------------------------ 函數名稱: writehanzi 功能:在 LCD 上顯示漢字 入口參數: a:漢字在數組中的位置 X:0-83 列選擇 Y:0-5 行選擇-------------------------------------*/
  204. void Writehanzi(uchar x,uchar y,uchar a)
  205. {
  206. uchar i,j;
  207. LCD_set_xy(x,y);
  208. for(i=a;i<a+2;i++)
  209.         {
  210.         for(j=0;j<16;j++)
  211.                 {
  212.                 LCD_write_byte(hanzi[i][j],1);
  213.                 }
  214.         LCD_set_xy(x,y+1);
  215.         }
  216. }
  217. /*------------------ 函數名稱: LCD_init 功能:初始化 LCD 入口參數:無 出口參數:無
  218. ------------------*/
  219. void LCD_init(void)
  220. {
  221. LCD_RST=0;  //復位
  222. delayus();
  223. LCD_RST=1;
  224. LCD_CE=0;
  225. delayus(); LCD_CE=1; //使能
  226. delayus();
  227. LCD_write_byte(0x21,0);// 使用擴展指令集
  228. LCD_write_byte(0xa0,0);// 設置偏置電壓
  229. LCD_write_byte(0x06,0);// 溫度矯正
  230. LCD_write_byte(0x13,0);//1:48
  231.   LCD_write_byte(0x20,0);// 使用基本指令集
  232.   LCD_clear(); //清屏
  233.   LCD_write_byte(0x0c,0); //普通顯示
  234. LCD_CE=0;
  235. }
  236. void Rxjiemian() //收音機界面
  237. {
  238. Writehanzi(0,0,0); //收
  239. Writehanzi(16,0,2); // 音
  240. Writehanzi(32,0,4); // 機
  241. Writehanzi(48,0,12); //信號強度符號
  242. LCD_write_english_string(66,1," ");
  243. LCD_write_english_string(12,3,"Freq: ");
  244. LCD_write_english_string(12,4," V ol: ");
  245. LCD_write_english_string(12,5,"Bass: No");
  246. }
  247. void Txjiemian() //發射機界面
  248. {
  249. Writehanzi(0,0,6); //發
  250. Writehanzi(16,0,8); // 射
  251. Writehanzi(32,0,10);// 機
  252. Writehanzi(48,0,12); //信號強度符號
  253. LCD_write_english_string(66,1," ");
  254. LCD_write_english_string(12,3,"Freq: ");
  255. LCD_write_english_string(12,4,"Gain: ");
  256. LCD_write_english_string(12,5," Pag: ");
  257. }
  258. void displayrssi(uchar rssi) //顯示信號強度
  259. {
  260. uchar A1=0,A2=0,A3=0;
  261. A1=rssi/100;
  262. A2=rssi%100/10;
  263. A3=rssi%10;
  264. LCD_write_english_string(66,1,table[A1]);
  265. LCD_write_english_string(72,1,table[A2]);
  266. LCD_write_english_string(78,1,table[A3]);
  267. }
  268. void displaypinlv(float pinlv) // 顯示頻率
  269. {
  270. uchar A1=1,A2=1,A3=1,A4=1,A5=1,A6=1;
  271. long int WENDU;
  272. WENDU=pinlv*10;
  273. A1=WENDU/1000;
  274. A2=WENDU%1000/100;
  275. A3=WENDU%100/10;
  276. A4=WENDU%10;
  277. LCD_write_english_string(48,3,table[A1]);
  278. LCD_write_english_string(54,3,table[A2]);
  279. LCD_write_english_string(60,3,table[A3]);
  280. LCD_write_english_string(66,3,".");
  281. LCD_write_english_string(72,3,table[A4]);
  282. }
  283. void displayvol(uchar vol) //顯示音量

  284. {uchar A1=1,A2=1;
  285. A1=vol/10;
  286. A2=vol%10;
  287. LCD_write_english_string(48,4,table[A1]);
  288. LCD_write_english_string(54,4,table[A2]);}
  289. void displaygain(uchar gain) //顯示輸入增益
  290. {
  291. uchar A1=1,A2=1;
  292. A1=gain/10;
  293. A2=gain%10;
  294. LCD_write_english_string(48,4,table[A1]);
  295. LCD_write_english_string(54,4,table[A2]);
  296. }
  297. void displaypag(uchar pag) //顯示發射功率
  298. {
  299. uchar A1=1,A2=1;
  300. A1=pag/10;
  301. A2=pag%10;
  302. LCD_write_english_string(48,5,table[A1]);
  303. LCD_write_english_string(54,5,table[A2]);
  304. }
  305. void displaybass(uchar bass) //顯示重低音 {
  306. {if(bass)LCD_write_english_string(48,5,"YES");
  307. else LCD_write_english_string(48,5,"No ");
  308. }
  309. void displaymute(uchar mute) //顯示靜音符號
  310.         {
  311.         if(mute) Writehanzi(67,4,14);  //靜音符號
  312.         else Writehanzi(67,4,16); //靜音符號消除
  313.         }
  314. void displayguangbiao(uchar wei,uchar flag) //顯示光標 {
  315.         {if(flag)
  316.         LCD_write_english_string(0,(2+wei),"->"); //1 箭頭
  317.         else LCD_write_english_string(0,(2+wei)," "); //清除 1 箭頭          
  318.          }
  319. /*----------------------------------------IIC 通信程序 ---------------------------------------------------*/
  320. void delay_ms(unsigned int m)
  321. {
  322.         unsigned int i,j;
  323.         for(i=m;i>0;i--)
  324.         for(j=113;j>0;j--);
  325. }
  326. void Dela_y(uint c) //延時
  327. {
  328.         int i=0;
  329.         for(i=0;i<c;i++);
  330. }
  331. void OpenIIC()
  332. {
  333.         SDA = 1;
  334.         SCL = 1;
  335.         _nop_();_nop_();_nop_();_nop_();
  336.         SDA = 0;
  337.         _nop_();_nop_();_nop_();_nop_();
  338.         SCL = 0;
  339. }

  340. void CloseIIC()
  341. {
  342.         SCL = 0;
  343.         SDA = 0 ;
  344.         _nop_();_nop_();_nop_();_nop_();
  345.         SCL = 1;
  346.        
  347.         SDA = 1;
  348.         _nop_();_nop_();_nop_();_nop_();
  349.         Dela_y(50); // 防止過快的讀取造成 EPPROM 來不及反應 }
  350. }

  351. uchar IIC_Wait_Ack(void) //等待應答信號 1 接受應答失敗, 0 成功
  352. {
  353.         uchar ucErrTime=0;
  354.         SDA=1;
  355.         _nop_();
  356.         SCL=1;
  357.         _nop_();
  358. while(SDA)
  359. {
  360.         ucErrTime++;
  361.         if(ucErrTime>250)
  362. {
  363.         CloseIIC();
  364.         return 1;
  365. }
  366. }
  367. SCL=0;
  368. return 0;
  369. }

  370. void IIC_Ack(void) //產生應答信號
  371. {
  372. SCL=0; SDA=0; //0 表示應答
  373. _nop_();_nop_();
  374. SCL=1;
  375. _nop_();_nop_();
  376. SCL=0;
  377. }
  378. void IIC_NAck(void) //產生非應答信號 {
  379. {SCL=0; SDA=1; //1 表示非應答
  380. _nop_();_nop_();
  381. SCL=1;
  382. _nop_();_nop_();
  383. SCL=0;
  384. }
  385. void IICsendByte(uchar txd) //IIC 發送一個字節
  386. {
  387.        
  388.         uchar t;
  389.         SCL=0;
  390.         for(t=0;t<8;t++)
  391.         {
  392.                 SDA=(txd&0x80)>>7;
  393.                 txd<<=1;
  394.                 _nop_();_nop_();
  395.                 SCL=1;
  396.                 _nop_();_nop_();
  397.                 SCL=0;
  398.                 _nop_();_nop_();;
  399.         }
  400. }
  401. uchar IICReadByte(unsigned char ack) //IIC 讀一個字節
  402.         {unsigned char i,receive=0;
  403.         SDA = 1;  //51 單片機將引腳拉高則設置為輸入模式
  404.         for(i=0;i<8;i++ )
  405.                 { SCL=0;
  406.                 _nop_();_nop_();
  407.                 SCL=1;
  408.                 receive<<=1;
  409.                 if(SDA)receive++;
  410.                 _nop_();
  411.                 }
  412.         if (!ack) IIC_NAck();// 產生非應答信號
  413.          else IIC_Ack(); // 產生應答信號
  414.         return receive;
  415. }
  416. /*---------------------------------RDA5820 程序 --------------------------------------------------------------*/
  417. uint ReadReg(uchar regAddr) //讀 RDA5820 指令
  418. {
  419. uint buf;
  420. OpenIIC(); IICsendByte(RDA5820_WRITE);  //發送寫命令
  421. IIC_Wait_Ack(); IICsendByte(regAddr); //發送地址
  422. IIC_Wait_Ack();
  423. OpenIIC(); IICsendByte(RDA5820_READ); //發送讀命令
  424. IIC_Wait_Ack();

  425. buf = IICReadByte(1);
  426. buf = buf<<8;
  427. buf =buf|IICReadByte(0);
  428. CloseIIC();
  429. return buf;
  430. }
  431. void WriteReg(uchar regAddr,uint val) // 寫 RDA5820 指令
  432. {
  433. OpenIIC();
  434. IICsendByte(RDA5820_WRITE);  //發送寫命令
  435. IIC_Wait_Ack();
  436. IICsendByte(regAddr); //發送地址
  437. IIC_Wait_Ack();
  438. IICsendByte(val>>8);
  439. IIC_Wait_Ack();
  440. IICsendByte(val&0XFF);
  441. IIC_Wait_Ack();
  442. CloseIIC();
  443. }

  444. void RX_Mode(void) //接收模式
  445. {
  446. uint temp;
  447. temp=ReadReg(0X40);
  448. temp&=0xfff0;
  449. WriteReg(0X40,temp) ;
  450. }

  451. void TX_Mode(void) //發射模式
  452. {
  453. uint temp;
  454. temp=ReadReg(0X40);
  455. temp&=0xfff0;
  456. temp|=0x0001;
  457. WriteReg(0X40,temp) ;}

  458. void Vol_Set(uchar vol) //設置音量 0~15
  459. {
  460. uint temp=0X8845;
  461. temp&=0xfff0;
  462. WriteReg(0x05,vol|=temp) ;
  463. } void Mute_Set(uchar mute) //靜音設置 1:靜音 0:不靜音
  464. {
  465. uint temp=0xd281;
  466. if(!mute)temp|=1<<14;

  467. else temp&=~(1<<14);
  468. WriteReg(0X02,temp) ; }

  469. void Bass_Set(uchar bass) //BASS 設置 1:打開 BASS 0:不打開 BASS
  470.   {
  471. uint temp=0xd281;  
  472. if(bass)temp|=1<<12;
  473. else temp&=~(1<<12);
  474. WriteReg(0X02,temp) ;
  475. }

  476. uchar Rssi_Get(void) //接收信號強度 0~63
  477. {
  478. uint temp=000;
  479. temp=ReadReg(0X0B);
  480. temp=(temp>>9);
  481. return temp;
  482. }

  483. void TxPAG_Set(uchar gain)  //發射功率設置 0~63
  484. {
  485. uint temp;
  486. temp=ReadReg(0X42);
  487. temp&=0XFFC0;
  488. temp|=gain;
  489. WriteReg(0X42,temp) ;
  490. }

  491. void TxPGA_Set(uchar gain)  //輸入信號增益 0~7
  492. {
  493. uint temp=0XF8FF;
  494. temp|=gain<<8;
  495. WriteReg(0X42,temp) ;}

  496. void Band_Set(uchar band) //頻率帶寬設置 0:87-108 1:76-91 2:76-108
  497. {
  498. uint temp;
  499. temp=ReadReg(0X03);
  500. temp&=0XFFF3;
  501. temp|=band<<2;
  502. WriteReg(0X03,temp) ;
  503. }
  504. void Space_Set(uchar spc) //設置步進頻率 0:100KHz 1:200KHz 3:50KHZ
  505. {
  506. uint temp;
  507. temp=ReadReg(0X03);

  508. temp&=0XFFFC;
  509. temp|=spc;
  510. WriteReg(0X03,temp) ;
  511. }
  512. void Freq_Set(uint freq) // 頻率設置 單位 10KHz 6500~10800
  513.         {
  514.         uint temp;
  515.         uchar spc=0,band=0;
  516.         uint fbtm,chan;
  517.         temp=ReadReg(0X03);
  518.         temp&=0X001F;
  519.         band=(temp>>2)&0x03;  
  520.         spc=temp&0x03;
  521.         if(spc==0)spc=10;
  522.         else if(spc==1)spc=20;
  523.         else spc=5;
  524.         if(band==0)
  525.         fbtm=8700;
  526.         else if(band==1||band==2)
  527.         fbtm=7600;
  528.         else
  529.                 {
  530.                 fbtm=ReadReg(0X53);
  531.                 fbtm*=10;
  532.                 }
  533.         if(freq<fbtm)return;
  534.         chan=(freq-fbtm)/spc;
  535.         chan&=0X3FF;
  536.         temp|=chan<<6;
  537.         temp|=1<<4;
  538.         WriteReg(0X03,temp) ;
  539.         delay_ms(20);  
  540.         }
  541. void RDA5820_Init(void) //RDA5820 初始化
  542. {
  543. WriteReg(2,0xd281); //基本配置
  544. delay_ms(60);  
  545. WriteReg(0x05,0X884F);// 搜索強度 8,lan 1.8ma,vol 最大
  546. }
  547. /*-------------------------------------------------------------------------------------------*/
  548. void modesaomiao() //模式切換按鍵
  549.         {
  550.         if(KEY==0)
  551.                 {
  552.                 delayms(2);
  553.                 if(KEY==0)

  554.                
  555.                         {
  556.                         mode+=1;
  557.                         if(mode==2)mode=0;
  558.                         while(!KEY);
  559.                         }
  560.                 }
  561.         }
  562. void gongnengsaomiao() //功能切換按鍵
  563. {
  564.         if(KEY3==0)
  565.         {
  566.         delayms(2);
  567.         if(KEY3==0)
  568.                 {
  569.                         gongneng+=1;
  570.                         if(gongneng==3)gongneng=0;
  571.                         while(!KEY3);
  572.                 }
  573.         }
  574. }
  575. void Mutesaomiao() //靜音掃描
  576. {
  577. if(KEY4==0)
  578.         {
  579.         delayms(2);
  580.         if(KEY4==0)
  581.                 {
  582.                 mute=~mute;
  583.                 if(mute==1){Mute_Set(1);displaymute(1);}
  584.                 if(mute==0){Mute_Set(0);displaymute(0);}
  585.                 while(!KEY4);
  586.                 }
  587.         }
  588. }
  589. /*********************************** 主程序 **********************************/
  590. void main(void)
  591. {
  592. uchar Bass=0;
  593. uchar Vol=8,TxPAG=63,Gain=4,Rssi=0;
  594. uint TXFreq=9200,RXFreq=8830;
  595. contrl=1; delayms(2000); //延時,等待系統上電穩定
  596. LCD_init(); //lcd 初始化
  597. LCD_clear(); //清屏
  598. Rxjiemian();
  599. RDA5820_Init(); //RDA 初始化
  600. RX_Mode(); //接收模式
  601. Band_Set(3); //頻率帶寬 65-108Mhz
  602. Space_Set(0); //頻率步進 100Khz
  603. TxPGA_Set(3); //發射模式輸入信號增益
  604. TxPAG_Set(63); //發射功率最大
  605. Freq_Set(RXFreq); // 頻率設置
  606. while(1)
  607. {
  608. if(mode==0) //接收模式
  609. { RX_Mode(); //接收模式
  610. Rxjiemian();
  611. displayrssi(Rssi_Get()); //顯示信號強度
  612. displaypinlv(RXFreq/100.0);// 顯示頻率
  613. displayvol(Vol); //顯示音量
  614. displaybass(Bass); //顯示重低音
  615. while(mode==0)
  616. {
  617. displayrssi(Rssi_Get()); //顯示信號強度
  618. if((gongneng==0)&&(mode==0)) //Freq 調節 7760~10800
  619. {
  620. displayguangbiao(1,1); //顯示光標
  621. while(gongneng==0)
  622.         {
  623.         displayrssi(Rssi_Get()); //顯示信號強度
  624.         modesaomiao();
  625.         Mutesaomiao();
  626.         gongnengsaomiao();
  627.         Mutesaomiao();
  628.         if(KEYup==0)
  629.                 {
  630.                 delayms(100);
  631.                 if(RXFreq==10800)RXFreq=10800;
  632.                 else RXFreq+=10; Freq_Set(RXFreq);  //設置頻率
  633.                 displaypinlv(RXFreq/100.0);// 顯示頻率
  634.                 }
  635.         if(KEYdown==0)
  636.                 {
  637.                 delayms(100);
  638.                 if(RXFreq==6500)RXFreq=6500;
  639.                 else RXFreq-=10;
  640.                 Freq_Set(RXFreq);  //設置頻率
  641.                 displaypinlv(RXFreq/100.0);// 顯示頻率
  642.                 }
  643.         if(mode==1)break;
  644.         } displayguangbiao(1,0);  //不顯示光標
  645. }
  646. if((gongneng==1)&&(mode==0)) //Vol 調節 0~15
  647. {
  648. displayguangbiao(2,1); //顯示光標
  649. while(gongneng==1)
  650.         {
  651.         displayrssi(Rssi_Get()); //顯示信號強度
  652.         Mutesaomiao();
  653.         modesaomiao();
  654.         gongnengsaomiao();
  655.         Mutesaomiao();
  656.         if(KEYup==0)
  657.                 {
  658.                 if(Vol==15)
  659.                 Vol=15;
  660.                 else Vol+=1;
  661.                 Vol_Set(Vol); //設置音量
  662.                 displayvol(Vol); //顯示音量
  663.                 while(!KEYup);
  664.                 }
  665.         if(KEYdown==0)
  666.                 {
  667.                 if(Vol==0)Vol=0;
  668.                 else Vol-=1;
  669.                 Vol_Set(Vol); //設置音量
  670.                 displayvol(Vol); //顯示音量
  671.                 while(!KEYdown);
  672.                 }
  673.         if(mode==1)break;
  674.         }
  675. displayguangbiao(2,0); //不顯示光標
  676. }
  677. if((gongneng==2)&&(mode==0)) //Bass 是否打開 0~1
  678.         {
  679.         displayguangbiao(3,1); //顯示光標
  680.         while(gongneng==2)
  681.                 {
  682.                 displayrssi(Rssi_Get()); //顯示信號強度
  683.                 Mutesaomiao();
  684.                
  685.                 modesaomiao();
  686.                 gongnengsaomiao();
  687.                 Mutesaomiao();
  688.                 if(KEYup==0)
  689.                 {
  690.                         if(Bass==0)Bass=1;
  691.                         Bass_Set(Bass); //設置重低音
  692.                         displaybass(Bass); //顯示重低音
  693.                 }
  694.                 if(KEYdown==0)
  695.                 {
  696.                         if(Bass==1)Bass=0;
  697.                         Bass_Set(Bass); //設置重低音
  698.                         displaybass(Bass); //顯示重低音
  699.                 }
  700.                 if(mode==1)break;
  701.                 } displayguangbiao(3,0); //不顯示光標
  702.         }
  703. }
  704. }
  705. if(mode==1) //發射模式
  706. {
  707. TX_Mode(); //發射模式
  708. Freq_Set(TXFreq);  //設置頻率
  709. Txjiemian(); displayrssi(Rssi); //顯示信號強度
  710. displaypinlv(TXFreq/100.0);// 顯示頻率
  711. displaygain(Gain);// 顯示輸入增益
  712. displaypag(TxPAG); //顯示發射功率
  713. while(mode==1)
  714. {
  715. if((gongneng==0)&&(mode==1)) //Freq 調節 7760~10800
  716. {
  717. displayguangbiao(1,1); //顯示光標
  718. while(gongneng==0)
  719.         {
  720.         displayrssi(0); // 顯示信號強度
  721.         Mutesaomiao();
  722.         modesaomiao();
  723.         gongnengsaomiao();
  724.         if(KEYup==0)
  725.                 {
  726.                 delayms(100);
  727.                
  728.                 if(TXFreq==10800)TXFreq=10800;
  729.                 else TXFreq+=10;
  730.                 Freq_Set(TXFreq);  //設置頻率
  731.                  displaypinlv(TXFreq/100.0);// 顯示頻率
  732.                 }
  733.         if(KEYdown==0)
  734.                 {
  735.                 delayms(100);
  736.                 if(TXFreq==6500)TXFreq=6500;
  737.                 else TXFreq-=10;
  738.                 Freq_Set(TXFreq);  //設置頻率
  739.                 displaypinlv(TXFreq/100.0);// 顯示頻率
  740.                 }
  741.         if(mode==0)break;
  742.         }
  743.         displayguangbiao(1,0); //顯示光標
  744. }
  745. if((gongneng==1)&&(mode==1)) //輸入增益 0~7
  746. {
  747. displayguangbiao(2,1); //顯示光標
  748. while(gongneng==1)
  749.         {
  750.         displayrssi(Rssi_Get()); //顯示信號強度
  751.         Mutesaomiao();
  752.         modesaomiao();
  753.         gongnengsaomiao();
  754.         if(KEYup==0)
  755.                 {
  756.                 if(Gain==7)Gain=7;
  757.                 else Gain+=1; TxPGA_Set(Gain); //設置增益
  758.                 displaygain(Gain);// 顯示輸入增益
  759.                 while(!KEYup);
  760.                 }
  761.         if(KEYdown==0)
  762.                 {
  763.                 if(Gain==0)Gain=0;
  764.                 else Gain-=1;
  765.                 TxPGA_Set(Gain); // 設置增益
  766.                 displaygain(Gain);// 顯示輸入增益
  767.                 while(!KEYdown);
  768.                 }
  769.         if(mode==0)break;
  770.         }
  771. displayguangbiao(2,0); //顯示光標
  772. }
  773. if((gongneng==2)&&(mode==1)) //發射功率調節 0~63
  774.         {
  775.         displayguangbiao(3,1); //顯示光標
  776.         while(gongneng==2)
  777.                 {
  778.                 displayrssi(Rssi_Get()); //顯示信號強度
  779.                 Mutesaomiao();
  780.                 modesaomiao();
  781.                 gongnengsaomiao();
  782.                 if(KEYup==0)
  783.                         {
  784.                         if(TxPAG==63)TxPAG=63;
  785.                         else TxPAG+=1;
  786.                         TxPAG_Set(TxPAG); //設置發射功率
  787.                         displaypag(TxPAG); //顯示發射功率
  788.                          while(!KEYup);
  789.                         }
  790.                 if(KEYdown==0)
  791.                         {
  792.                         if(TxPAG==0)TxPAG=0;
  793.                         else TxPAG-=1;
  794.                         TxPAG_Set(TxPAG); //設置發射功率
  795.                         displaypag(TxPAG); //顯示發射功率
  796.                         while(!KEYdown);
  797.                         }
  798.                 if(mode==0)break;
  799.                 }
  800.         displayguangbiao(3,0); //顯示光標
  801.         }
  802. }
  803. }
  804. }
  805. }
復制代碼

rda5820.zip (71.85 KB, 下載次數: 14)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品观看 | 欧美一区中文字幕 | 99爱视频 | 视频在线亚洲 | 色吊丝2| 看片网站在线 | 一级片视频免费 | 国产福利在线免费观看 | 亚洲国产精品久久久久秋霞不卡 | 91久久精品日日躁夜夜躁欧美 | 日韩精品一区二区三区中文在线 | 九九色九九| 久久99精品久久久久久 | 国产激情91久久精品导航 | 国产一区二区在线免费观看 | 99re热精品视频 | 国产91av视频 | www.欧美| 欧美成人在线网站 | 免费观看www7722午夜电影 | 国产精品一区二区不卡 | 欧美精品一区二区三区在线 | 国产精品一区二区三区在线 | 欧美综合久久 | 99热精品在线观看 | 欧美黄色片 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 玖玖操 | 日韩中文字幕在线 | 99re热精品视频 | 激情欧美一区二区三区 | 免费黄篇| 毛片网站在线观看 | 精品网| 久久综合久久自在自线精品自 | 久久天堂 | 成人在线观看免费观看 | 日韩欧美一级 | 最新中文字幕 | 欧美国产日韩一区二区三区 | 久久这里只有精品首页 |