《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

用PICC写PIC16C57
程序匠人 发表于 2006-2-21 20:33:00  阅读全文 | 回复(0) | 引用通告 | 编辑

用PICC写PIC16C57
 
 
 
  经过3周的工作我的项目基本完成,经过这一段时间的摸索经验有

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
**************************************************
*/
#i nclude "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 RB0:output 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;  
}
 
 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!