精品文档
I2C_start();
// 收音模块读取操作 I2C_write_byte(0x21);
// 寄存器连续读操作
reg_buf[0] = I2C_read_byte(I2C_ACK); reg_buf[1] = I2C_read_byte(I2C_ACK); reg_buf[2] = I2C_read_byte(I2C_ACK); reg_buf[3] = I2C_read_byte(I2C_NACK);
I2C_stop(); }
模块上电初始化子函数 void RDA5807_power(void) {
delayms(50);
// 发送软件复位指令 RDA_reg_data[0] = 0x00; RDA_reg_data[1] = 0x02; RDA5807_write_reg();
delayms(10);
// 收音模块默认参数 RDA_reg_data[0] = 0xd0; RDA_reg_data[1] = 0x01; RDA5807_write_reg(); }
功能描述:收音模块自动寻台模式 void RDA5807_FM_seek(void) {
uint chan;
收集于网络,如有侵权请联系管理员删除
精品文档
uchar reg_data[4] = {0x00, 0x00, 0x00, 0x00};
RDA_reg_data[3] &= ~(1 << 4); //调谐禁用
// 内部自动寻台使能
RDA_reg_data[0] |= (1 << 0); //SEEK位置1 RDA5807_write_reg();
// 等待STC 标志置位
while(0 == (reg_data[0] & 0x40)) {
delayms(20); // 读取内部状态
RDA5807_read_reg(reg_data); }
// 获取当前工作频点 chan = reg_data[0] & 0x03; chan = reg_data[1] | (chan << 8); chan = chan << 6;
// 保存当前工作频点
RDA_reg_data[2] = (chan >> 8) & 0xff; RDA_reg_data[3] = (chan & 0xff); }
频率显示子函数
void show_frequency(void) {
unsigned char i,display[5]; unsigned int temp;
temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0); temp = temp>>6;
frequency = (unsigned long)(100*temp+87000)/100;
收集于网络,如有侵权请联系管理员删除
计算 //
精品文档
for(i=0; i<5; i++) // 清显存单元 display[i] = 0x00;
display[0] = (frequency)/1000 ; //数据转换 display[1] = (frequency00)/100; display[2] = (frequency0)/10;
display[3] = 0x2e; //小数点 display[4] = (frequency);
if(display[0] == 0) {
display[0] = display[1]+0x30; display[1] = display[2]+0x30; display[2] = display[3]; display[3] = display[4]+0x30; display[4] = 0x20; } else {
display[0] += 0x30; display[1] += 0x30; display[2] += 0x30; display[4] += 0x30; }
lcd_pos_xy(3,2); //频率显示 lcd_wdat(display[0]); lcd_wdat(display[1]); lcd_wdat(display[2]); lcd_wdat(display[3]); lcd_wdat(display[4]); }
音量显示子函数 void show_volume()
收集于网络,如有侵权请联系管理员删除
精品文档
{
unsigned char temp,display[2];
temp = RDA_reg_data[7] & 0x0f; //取音量值
display[0] = temp/10; display[1] = temp;
if(display[0] == 0) //如果高位为0 {
display[0] = display[1]; //低位显存内容进入高位显存 display[1] = 0x20; //低位不显示 } else {
display[1] += 0x30; }
display[0] += 0x30;
lcd_pos_xy(13,2); //音量值显示 lcd_wdat(display[0]); lcd_wdat(display[1]); } 主函数
void main(void) {
P0 = 0xff; P1 = 0xff; P2 = 0xff; lcd_init();
lcd_w_string(0,1,cdis1,0); lcd_w_string(0,2,cdis2,0);
RDA5807_power();
收集于网络,如有侵权请联系管理员删除
精品文档
while(1) {
if(K1 == 0) {
delayms(20); if(K1 == 0) {
RDA_reg_data[0] |= (1 << 1); RDA5807_FM_seek(); while(K1 == 0); } }
if(K2 == 0) {
delayms(20); if(K2 == 0) {
RDA_reg_data[0] &= ~(1 << 1); //SEEK DOWN RDA5807_FM_seek(); while(K2 == 0); } }
if(K3 == 0) {
delayms(20); if(K3 == 0) {
if((RDA_reg_data[7] & 0x0f) < 0x0f) {
RDA_reg_data[0] = 0xd0; RDA_reg_data[1] = 0x01;
//SEEK UP
收集于网络,如有侵权请联系管理员删除