英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 3868|回复: 0
打印 上一主题 下一主题

用PICC写PIC16C57

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-26 14:46:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1/                     57支持BANK限定词
2/                    程序稍微复杂一些编译器就报BANK0无法分配的错误
3/                   程序用的局部变量过多时,程序虽然可编译通过,但是函数参数传递错误,需要尽量用小的数据类型,如                  uchar变成uint,全局变量替代函数参数
4/                   单个程序过大要分成两个
5                    

/*
***************************************************
* FUNCTION description: I2C subfunction
  function :send data to pt2323 and pt2258
  editer: sunhongjian
  date  : 2004/2/19/am 11:30
**************************************************
*/
#include "pic165x.h"
#define uchar unsigned char
#define uint  unsigned int
#define ul    unsigned long
////////////////////////////////////////////////////
#define I2C_SCK RB6 //i2c
#define I2C_SDA RB7
#define SDA     RB7
#define SCL     RB6
#define PT2258_ADDRESS 0x80 //pt2258 address
#define PT2258_CLEAR   0xc0 //pt2258 clear command
///////////////////////////////////////////////////
#define STANDBY    0x44ba //customer key_value
#define MUTE       0xc43a
#define CEN_UP     0x45ba
#define SURR_UP    0x05fa
#define SUB_UP     0x847a
#define CEN_DOWN   0xc03e
#define SURR_DOWN  0x50ae
#define SUB_DOWN   0x20de
#define FRONT_UP   0xd12e
#define VOL_UP     0x609e//
#define FRONT_DOWN 0x619e
#define VOL_DOWN   0xf50a
#define AUX1       0x21de
#define AUX2       0x718e
#define CH_5_1     0xb54a
#define CH_2_1_6   0x857a
#define RESET      0xa55a
#define UP         1
#define DOWN       0

#define VOL_INIT   0x3395
#define ADD        0x80
//////////////////////////////////
///////////////////////////////////////////////////
#define COM1 RA2
#define COM2 RA3
//////////////////////////////////////////////////
bank3 bit display_flag; //globe_val
bank3 uchar key_flag;//rf input flag
bank2 uchar c_flag;
bank2 ul key_value;//buffer of the rf key_value
bank2 uint k_f;
bank2 uchar display_buf; //two led data buffer
//bank2 uchar i2c_data;
//bank2 uchar i2c_comm;
bank1 uint c_vol[7];
bank2 uint vol_val = VOL_INIT;
bank2 uchar test;
bank3 uchar test1;
bank2 uint n;
bank2 uchar count;
bank3 uchar dis_data;
bank3 uchar t;
bank3 uint tt;
bank3 uchar ttt;
bank3 uchar t1;
const uchar a[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67};
//////////////////////////////////////////////////
void initial(void);
void two_led_display(uchar data);
void init_vol(void);
void delay_8ms(void);
uchar vol_cha(uchar k);
void select_ch(void);
void select_ch_1(void);
void delay_10_us(void);
void delay_n_ms(uchar n_milsecond);
void key_scan(void);
void at24c01_w(uchar at24c01_address);
void at24c01_r(uchar at24c01_address);
void vol_control(void);
void  modify_data(uchar n ,uchar up_down);
////////////////////////////////////////////////////
void main(void)
{
  initial();
  init_vol();
/////////////////////////
  for(;;)
  {
   
   if(test1) RB4 =0;
   else      RB4 =1;
   if(!RA0 )
   {
   
    //two_led_display(vol_cha(6));
    if(!RA0)
    {
     RA2 =0;
     RA3 =0;//disable two_led display
     
     key_scan();
     select_ch();
     select_ch_1();
     vol_control();
    }
   }
   else
     {
     two_led_display(vol_cha(6));
     delay_8ms();
     
     }
  }
}
/*
//////////////////////////////////////////////////
function: initial fsr
time: 2004/2/19/pm 2:30
editer:sunhongjian
///////////////////////////////////////////////////
*/
void initial(void)
{
TRISA = 0x03; //RA0: input of rf
               //RA2: two_led select
               //RA3: two_led selcet
TRISB = 0x00; //RB7: data output of i2c
               //RB6: sck  of i2c
               //RB4 RB3 RB2 RB1 RB0utput to control 5_number led
TRISC = 0x00; //RC6 RC5 RC4 RC3 RC2 RC1 RC0:data output of two_led
COM1 =0;      //two_led put out
COM2 =0;
display_flag = 0;
PORTB = 0xff; //five_led put out
OPTION = 0x03;//
}
///////////////////////////////////////////////////
void delay_10_us(void)
{
#asm
nop;
nop;
nop;
nop;
nop;
#endasm

}
////////////////////////////////////////////////////
void delay_n_ms(uchar n_milsecond)
{
uchar i;
while(n_milsecond--)
{
  i = 45;
  while(i--);
}
}
//////////////////////////////////////////////
void delay_8ms(void)
{
TMR0 = 0;
while(TMR0 < 249);
}

///////////////////////////////////////////////////
bit i2c_start(void)
{
delay_10_us();
I2C_SDA = 1;
delay_10_us();
I2C_SCK = 1;
delay_10_us();
I2C_SDA = 0;
delay_10_us();
I2C_SCK = 0;
delay_10_us();
return 1;
}
////////////////////////////////////////////////////
void i2c_stop(void)
{
delay_10_us();
I2C_SDA = 0;
delay_10_us();
I2C_SCK = 1;
delay_10_us();
I2C_SDA = 1;
delay_10_us();
}
///////////////////////////////////////////////////
bit i2c_send_byte(uchar d)
{
uchar i = 8;
static bit bit_ack;
while(i--)
  {
   delay_10_us();
   if(d & 0x80) I2C_SDA = 1;
   else         I2C_SDA = 0;  
   delay_10_us();
   I2C_SCK =1;
   delay_10_us();
   I2C_SCK = 0;
   d=d<<1;
   }
  delay_10_us();  
  I2C_SDA = 1;
  delay_10_us();
  I2C_SCK =1;
  delay_10_us();
  
  bit_ack =I2C_SDA;
  I2C_SCK =0;
  delay_10_us();
  return bit_ack;
}
///////////////////////////////////////////
void at24c01_w1(uchar ic_address,uchar data)
{
i2c_start();
i2c_send_byte(ic_address);
i2c_send_byte(data);
i2c_stop();
delay_n_ms(10);////////////
}
/////////////////////////////////////////
void at24c01_w2(uint data)
{
i2c_start();
i2c_send_byte(0x88);
i2c_send_byte(data/256);
i2c_send_byte(data%256);
i2c_stop();
delay_n_ms(10);
}
/*
*****************************************************
*key_scan function
*description:read rf_key_value
*editer:sunhongjian
*timer:2004/2/19/pm/2:57
****************************************************
*/
void key_scan(void)
{
uchar k;
while(!RA0); //wait for 9ms low level
TMR0 = 0;
while(TMR0<150);
if(!RA0) c_flag =1;//continue key
if(!c_flag)
  {
     while(RA0); //wait for 4.5ms high level
     for(k=0;k<32;k++)
      {   
        while(!RA0);
        TMR0 = 0;
        while(TMR0 <54);
        if(RA0)
         {
           key_value =key_value  | 0x01;
           while(RA0);
         }
       if(k!= 31) key_value<<=1;
      }
    n = key_value>>16;  
  if(n ==0x00ff )
    {
      k_f= key_value;
      key_flag = 1;
      return;
    }
   else key_value = 0;
  }
/////////////////////continue key
else
  {
   c_flag =0;
   ++count;
   
  }      
}
   

  
//////////////////////////////////////////////////////
////////////////////////////////////////////////
////////////////////////////////////
void vol_control(void)
{
  at24c01_w2(c_vol[6]);
  at24c01_w2(c_vol[0]);
  at24c01_w2(c_vol[1]);
  at24c01_w2(c_vol[2]);
  at24c01_w2(c_vol[3]);
  at24c01_w2(c_vol[4]);
  at24c01_w2(c_vol[5]);
////////////////////
  tt=c_vol[0];
  tt=c_vol[1];
  tt=c_vol[2];
  tt=c_vol[3];
  tt=c_vol[4];
  tt=c_vol[5];
  tt=c_vol[6];
//////////////  
}
///////////////////////////////////
void init_vol(void)
{   
  c_vol[0] =  0x3395;
  c_vol[1] =  0x4355;
  c_vol[2] =  0x0315;
  c_vol[3] =  0x2335;
  c_vol[4] =  0x6375;
  c_vol[5] =  0xa3b5;
  c_vol[6] =  0xd3e5;
  at24c01_w1(0x88,0xc0);  
}
///////////////////////////////
uchar vol_cha(uchar k)
{

uchar i,j;
i = c_vol[k] & 0x000f;
j = c_vol[k]>>8;
j = j<<4;
j = i|j;
return j;
}
//////////////////////////////
void select_ch(void)
{

switch(k_f)
{
   case CH_2_1_6:
        k_f =0;  //rf key value      
        at24c01_w1(0x94,0xff);//mute all
        if(++t1%2)
        {
        at24c01_w1(0x94,0xfe);//6_output
        }
        else
        {
        at24c01_w1(0x94,0xf0);//fl
        at24c01_w1(0x94,0xf2);//fr
        at24c01_w1(0x94,0xf6);//sub
        }
        break;
   case AUX1:
        PORTB=0xfb;
        k_f =0;  //rf key value
        at24c01_w1(0x94,0xff);//mute all
        at24c01_w1(0x94,0xcb);
        at24c01_w1(0x94,0xf0);//fl
        at24c01_w1(0x94,0xf2);//fr
        at24c01_w1(0x94,0xf6);//sub
        break;
   case AUX2:
        PORTB=0xfb;
        k_f =0;  //rf key value
        at24c01_w1(0x94,0xff);//mute all
        at24c01_w1(0x94,0xca);
        at24c01_w1(0x94,0xf0);//fl
        at24c01_w1(0x94,0xf2);//fr
        at24c01_w1(0x94,0xf6);//sub
        break;
   case CH_5_1:
        PORTB=0xf7;
        k_f =0;  //rf key value      
        at24c01_w1(0x94,0xff);//mute all
        at24c01_w1(0x94,0xc7);//6_input
        at24c01_w1(0x94,0xfe);//6_output
        break;
   case STANDBY:
        k_f =0;  //rf key value
        PORTB=0xfe;
   case MUTE:
        k_f =0;  //rf key value  
        PORTB=0xfd;
        if(t++%2)
        at24c01_w1(0x94,0xff);
        else
        at24c01_w1(0x94,0xfe);//6_output
        break;
   case RESET:
            c_vol[0] =  0x3395;
            c_vol[1] =  0x4355;
            c_vol[2] =  0x0315;
            c_vol[3] =  0x2335;
            c_vol[4] =  0x6375;
            c_vol[5] =  0xa3b5;
            c_vol[6] =  0xd3e5;
            vol_val = VOL_INIT;
            break;
   default: break;
   }
}
//////////////////////////////////////////////
void select_ch_1(void)
{
uchar i,j=0;
if((count>ADD || c_flag ==0)==0) return;
switch(k_f)
  {
   case CEN_UP:      count = 0;
                     modify_data(2,UP);
                     return;                                                         
   case  CEN_DOWN:   
                     count = 0;
                     modify_data(2,DOWN);
                     return;                                                         
   case  SURR_UP:
                     i=4;
                     j=UP;                                       
   case  SURR_DOWN:
                     i=4;
                     break;
  case  SUB_UP:   
                    count = 0;
                    modify_data(3,UP);
                    return;
  case  SUB_DOWN:               
                    count = 0;
                    modify_data(3,DOWN);
                    return;
  case  FRONT_UP:
                   i=0;
                   j=UP;
  case  FRONT_DOWN:
                   i=0;
                   break;
  case  VOL_UP:   
               
                    count = 0;                    
                    for(i=0;i<7;i++) modify_data(i,UP);
                    return;
  case  VOL_DOWN:
                    count = 0;
                    for(i=0;i<7;i++) modify_data(i,DOWN);
                    return;
default :return;
}
       count=0;
       modify_data(i,j);
       modify_data(i+1,j);
           
}   
////////////////////////////////////
/*
**********************************************
*two_led display
*description control two_led display
*editor:sunhongjian
*timer:2004/2/19/pm/3
**********************************************
*/
void two_led_display(uchar data )
{
  uchar data3;
  data3 = (0xf0 & data);
  data3>>=4;
  data = (10 * data3) + (data & 0x0f);  
  data = 69-data;     
  if(display_flag ==0)
  {
   COM1 = 1;
   COM2 = 0;
   PORTC = a[data/10];  
  }
  else
  {
   COM1 = 0;
   COM2 = 1;
   PORTC = a[data%10];   
  }
display_flag = !display_flag;
}
/////////////////////////////
void  modify_data (uchar n ,uchar up_down)
{
  uchar k;
  ttt=n;
  tt=c_vol[n];
  k = vol_cha(n);  
  ttt=k;
  if(k==0)
    {
     RB4 = 0;   
     if(!up_down)
      ++c_vol[n];
    }
  else if(k==105)
    {
     RB4 =0;
     if(up_down)
      --c_vol[n];
    }
  else
  {
   RB4 = !RB4;
   if(up_down)
    {
     if((0x0f & k) == 0) c_vol[n] = c_vol[n]-0xf7;
     else
      --c_vol[n];
    }
   else
    {
    if((0x0f & k) == 9) c_vol[n] = c_vol[n]+0xf7;
    else
      ++c_vol[n];
     }
  }      
if(k==0 || k==105) test1 =1;//led
else               test1 =0;   
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-11-24 07:15 , Processed in 0.059991 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表