微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > m62429数字电位器问题

m62429数字电位器问题

时间:10-02 整理:3721RD 点击:
怎在这个程序上在多加一个m62429?
1602能改成12864吗?怎么改?
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char                 //宏定义{用uchar代替"unsigned char(无符号字符型)"}
#define uint  unsigned int       //宏定义{用uint 代替"unsigned int (无符号字整型)"}
sbit rs        = P2^4;       
sbit rw = P2^5;
sbit ep = P2^6;
sbit k1  = P1^0;    //音量UP
sbit k2  = P1^1;    //音量DOW
sbit kbgm= P1^2;    //音源BGM输入
sbit kcd = P1^3;    //音源CD输入
sbit kdvd= P1^4;    //音源dvd输入
sbit on = P2^7;     //电源指示
sbit bgm= P1^5;     //音源BGM继电器控制脚
sbit cd = P1^6;     //音源CD继电器控制脚
sbit dvd= P1^7;     //音源DVD继电器控制脚
sbit M62429_DAT= P2^0;  //数据定义位                4
sbit M62429_CLK= P2^1;         //时钟定义位                5
uchar a;
uchar b;
bit out;
bit in;       
uint voldata ;
uint LR=0x00;
uchar code dis1[] = {"music-volums"};
uchar code dis2[] = {"WELCOME TO MJAMP"};
uchar code dis3[] = {"0123456789 "};
uchar code dis4[] = {"WAIT Patience!"};  //....download....
uchar code dis5[] = {"BGM  CD  DVD  "};
delay(uchar ms);
bit lcd_bz();               // 测试LCD忙碌状态
lcd_wcmd(uchar cmd);        // 写入指令数据到LCD
lcd_pos(uchar pos);         // 设定显示位置
lcd_wdat(uchar dat);        // 写入字符显示数据到LCD
lcd_init();                 // LCD初始化设定   
void VolSet(uint Volume);
//void comint();
void input(uint in);
delay(uchar ms)
{                                                        // 延时子程序
        uchar i;
        while(ms--)                                                            
        {
                for(i = 0; i< 250; i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}
bit lcd_bz()               // 测试LCD忙碌状态
{                                                       
        bit result;
        rs = 0;
        rw = 1;
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (bit)(P0 & 0x80);
        ep = 0;
        return result;       
}
cd_wcmd(uchar cmd)           // 写入指令数据到LCD
{                                                       
        while(lcd_bz());
        rs = 0;
        rw = 0;
        ep = 0;
        _nop_();
        _nop_();       
        P0 = cmd;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;               
}
lcd_pos(uchar pos)          //设定显示位置
{                                                       
        lcd_wcmd(pos | 0x80);
}
lcd_wdat(uchar dat)              //写入字符显示数据到LCD
{                                                       
        while(lcd_bz());
        rs = 1;
        rw = 0;
        ep = 0;
        P0 = dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ep = 0;       
}
lcd_init()                  //LCD初始化设定   
{                                                       
        lcd_wcmd(0x38);                        //
        delay(1);
        lcd_wcmd(0x0c);                        //
        delay(1);
        lcd_wcmd(0x06);                        //
        delay(1);
        lcd_wcmd(0x01);                        //清除LCD的显示内容
        delay(1);
}
void main()
{         unsigned char l,m,i;
        lcd_init();                                // 初始化LCD       
        VolSet(0);                                //开机静音
//        comint();       
           in =0;
        a = 0;
        b = 0x05;
        out=0;
/*********************/
       lcd_pos(0x00);       
       for(m=0;m<=15;m++)
        {
      lcd_wdat(dis4[m]);
            }
/***********************/               
      lcd_pos(0x40);       
       for(m=0;m<=15;m++)
        {
      lcd_wdat(dis2[m]);
            }                                 
/******开机延时*******/
       for(i=0;i<10;i++)
           {delay(1010);  lcd_pos(0x0F); lcd_wdat(dis3[9-i]);}
           on=0;
           lcd_init();
    lcd_wcmd(0x01);       
           delay(10);
/*********************/
       lcd_pos(0x02);       
       for(m=0;m<=15;m++)
        {
      lcd_wdat(dis5[m]);
            }
/*********************/
        lcd_pos(0x41);
                for(l=0;l<12;l++)
                {
                  lcd_wdat(dis1[l]);
            }
/***********************/
        while(1)
        {
/***********************/
    if(k1==0)
         {
delay(30);         
         if(k1==0)
            {
             if(a<87)
              {a++;out=0;}
            }
         }
/***********************/          
if(k2==0)
         {
delay(30);
         if(k2==0)
            {
           if(a>0)
             {a--;out=0;}
            }
         }
/***********************/
if(kbgm==0)
         {
delay(30);
         if(kbgm==0&&in==0)
            {
           b=0x05;
           out=0;
           in = 1;
            }
         }
//in = 0;
if(kcd==0)
         {
delay(30);
         if(kcd==0&&in==0)
            {
           b=0x09;
           out=0;
           in = 1;
            }
         }
//in = 0;
if(kdvd==0)
         {
delay(30);
         if(kdvd==0&&in==0)
            {
           b=0x0e;
           out=0;
           in = 1;
            }
         }
//in = 0;
if(kbgm==1&&kcd==1&&kcd==1        )
   {in=0;}
/**************************/
if(out==0)
    {
        VolSet(a);
     lcd_pos(0x4e);
     lcd_wdat(dis3[a/10]);
         lcd_pos(0x4f);
     lcd_wdat(dis3[a%10]);
/**************************/
lcd_pos(0x05);
lcd_wdat(0x20);
lcd_pos(0x09);
lcd_wdat(0x20);
lcd_pos(0x0e);
lcd_wdat(0x20);
/**************************/
lcd_pos(b);
lcd_wdat(0x7f);
input(b);
        out=1;
         }
        }
}
void input(uint in)
{
switch(in)
{
  case 0x05 :bgm=0;cd=1;dvd=1;break;
  case 0x09 :cd=0;bgm=1;dvd=1;break;
  case 0x0e :dvd=0;bgm=1;cd=1;break;
}
}
void VolSet(uint Volume)
{
uint Dat=0;
uchar i;
EA=0;
   M62429_DAT=0;
   M62429_CLK=0;
//Volume=87-Volume;  //得到要送到芯片的实际数。加上此句最大为0db,最小为87
Dat=(((Volume<<5)&0x60)|((Volume>>2)&0x1f))|0x80;//得到要控制的数值(看数据手册)
/*************************************************/
for (i=0;i<2;i++)        //发送2位数据,控制声道 D0,D1
  {
   M62429_DAT=LR&0x01;
   _nop_();_nop_();_nop_();_nop_();         
   M62429_CLK=1;   
   _nop_();_nop_();_nop_();_nop_();
   M62429_DAT=0;
   _nop_(); _nop_();_nop_();_nop_();
   M62429_CLK=0;     
  LR=LR>>1;      
  }
/*************************************************/
for (i=0;i<8;i++)        //发送8位数据,控制音量 D2....D9
  {
   M62429_DAT=Dat&0x01;
   _nop_();_nop_();_nop_();_nop_();         
   M62429_CLK=1;   
   _nop_();_nop_();_nop_();_nop_();
   M62429_DAT=0;
   _nop_(); _nop_();_nop_();_nop_();
   M62429_CLK=0;     
   Dat=Dat>>1;      
  }
/*************************************************/
M62429_DAT=1;                                                  //发送最后1位数据,        D10
_nop_();_nop_();_nop_();_nop_();
M62429_CLK=1;
_nop_();_nop_();_nop_();_nop_();
M62429_CLK=0;
//  M62429_DAT=0;
EA=1;
}
/********串口初始化********
void comint()                         
{
    SCON = 0x50;//方式1,允许接收
        TMOD = 0x20;//定时器1方式2
        PCON |= 0x80;//波特率倍速
        TL1 = 0xfa;          //波特率倍速情况下晶振为11.0592MHZ,波特率为9600
        TH1 = 0xfa;          //波特率倍速情况下晶振为11.0592MHZ,波特率为9600
        ES = 1;//开串口中断
        EA = 1;//开启总中断
   TR1 = 1;//启动定时器1
  }
void serial(void) interrupt 4
{
       
        if(RI)//接收完成中断
        {
                 RI = 0;//清零接收标志位
                   a = SBUF;//读出串口接收到的数据       
                 TI=0;
         SBUF=a;
                out=0;
        //         VolSet(voldata);                   
        }
       
}
***/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top