基于PIC16F876A的摇摇棒

来源:互联网 发布:简单游软件下载 编辑:程序博客网 时间:2024/05/05 00:59
了解到RA等引脚需要关闭AC比较器变成数字引脚后才能使用。

引脚默认有高阻态,高电平和低电平,所以检测电平引脚接一个10K电阻和5V电压连,接一个水银开关和地连。

水银开关横向摆放时,从左向右摇动时,水银在最左边,反之右边,已测试效果不是很差。

PIC 高灌/ 拉电流25 mA/25 mA,故引脚用1K电阻驱动LED即可。

RAM地址分BANK1、BANK2,定义在不同BANK的变量函数也要注明如void hanshu(bank2 u8 *aaray)。
//*aaray即为数组地址或者指针指向地址

对于指针来说寻址时的跨度可以从BANK0到BANK1,从BANK2到BANK3,而不可以从BANK1到BANK2。

数组定义前加上CONST即为存入ROM中,以及为什么ROM读取数据错误需要解决:已解决CONST的数组也需要新建一个函数如bank2一样,如void hanshu(const u8 *aaray)。

用指针读取未验证因为读取数组数据时一直用数组直接读取,未证实读取存于ROM的数据是否需要const unsigned char *romPtr这种指针,如下知识点:

const数组必须用const指针访问

指向ROM 常数的指针

如果一组变量是已经被定义在ROM 区的常数,那么指向它的指针可以这样定义:

const unsigned char company[]=”Microchip”; //定义ROM 中的常数

const unsigned char *romPtr; //定义指向ROM 的指针

程序中可以对上面的指针变量赋值和实现取数操作:

romPtr = company; //指针赋初值

data = *romPtr++; //取指针指向的一个数,然后指针加1

反过来,下面的操作将是一个错误,因为该指针指向的是常数型变量,不能赋值。

*romPtr = data; //往指针指向的地址写一个数

视频逐帧查看软件VirtualDub


#include<pic.h>
//#include <pic18.h>


__CONFIG (0x1F72);//此适用于16F


//#define  CW  RB6 
//#define  CLOCK  RB7 




/*#define  LED1ON     PORTA&=0xFE//
#define  LED1OFF   PORTA|=0x01 // PA0
#define  LED2ON     PORTA&=0xFD//
#define  LED2OFF   PORTA|=0x02 // PA1
#define  LED3ON     PORTA&=0xFB//
#define  LED3OFF   PORTA|=0x04 // PA2
#define  LED4ON     PORTA&=0xF7//
#define  LED4OFF   PORTA|=0x08 // PA3
#define  LED5ON     PORTA&=0xDF//
#define  LED5OFF   PORTA|=0x20 // PA5
#define  LED6ON     PORTC&=0xFD//
#define  LED6OFF   PORTC|=0x02 //PC1
#define  LED7ON     PORTC&=0xFB//
#define  LED7OFF   PORTC|=0x04 //PC2
#define  LED8ON     PORTC&=0xF7//
#define  LED8OFF   PORTC|=0x08 //PC3
#define  LED9ON     PORTC&=0xEF//
#define  LED9OFF   PORTC|=0x10 //PC4
#define  LED10ON    PORTC&=0xDF//
#define  LED10OFF   PORTC|=0x20 //PC5
#define  LED11ON    PORTC&=0xBF//
#define  LED11OFF   PORTC|=0x40//PC6 
#define  LED12ON    PORTC&=0x7F//
#define  LED12OFF   PORTC|=0x80 //PC7
#define  LED13ON    PORTB&=0xFD//
#define  LED13OFF   PORTB|=0x02 //PB1
#define  LED14ON    PORTB&=0xFB//
#define  LED14OFF   PORTB|=0x04 //PB2
#define  LED15ON    PORTB&=0xEF//
#define  LED15OFF   PORTB|=0x10 //PB4
#define  LED16ON    PORTB&=0xDF//
#define  LED16OFF   PORTB|=0x20 //PB5
#define LED17OFFasm("BCF PORTC,0x1")
*/
#define  LED1 RA0;
#define  LED2 RA1;
#define  LED3 RA2;
#define  LED4 RA3;
#define  LED5     RA5;
#define  LED6     RC1;
#define  LED7     RC2;
#define  LED8     RC3;
#define  LED9     RC4;
#define  LED10    RC5;
#define  LED11    RC6;
#define  LED12    RC7;
#define  LED13    RB1;
#define  LED14    RB2;
#define  LED15    RB4;
#define  LED16    RB5;
typedef unsigned char    u8; 
unsigned char in=0;
const unsigned char *romPtr;




void delay_us(unsigned char delay_count)
{
  unsigned char j;                         
  for(j=delay_count;j>0;j--); 
}


void delay_ms(unsigned char delay_count)
{
  unsigned char i;                         
  for(i=delay_count;i>0;i--)
  {
delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
  } 
}
unsigned char  hanzi[] = 
{
0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,
0x08,0x08,0x07,0xF0,
};
bank1 unsigned char  hanzi1[32] = 
{
0x10,0x82,0x11,0x01,0xFF,0xFE,0x12,0x02,0x15,0x0C,0x3F,0xF0,0x69,0x42,0xA5,0x21,
0x3F,0xFE,0x03,0x02,0x7D,0x84,0x41,0x68,0x41,0x18,0x7D,0x66,0x05,0x84,0x00,0x00,
};
bank1 unsigned char  hanzi2[32] = 
{
0x08,0x01,0x08,0xC2,0x0F,0x44,0xF8,0x28,0x08,0x30,0x0F,0xCE,0x01,0x04,0x41,0x00,
0x41,0x02,0x41,0x01,0x4F,0xFE,0x51,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x00,0x00,
};


bank2 unsigned char  hanzi3[32] = 
{
0x40,0x40,0x41,0x80,0x4F,0xFE,0x72,0x08,0x43,0xFC,0x42,0x00,0x12,0x00,0x12,0x40,
0x13,0xC8,0xFE,0x44,0x12,0x4A,0x12,0x50,0x12,0x60,0x12,0x00,0x02,0x00,0x00,0x00,
};


const unsigned char  hanzic1[32] = 
{
0x10,0x82,0x11,0x01,0xFF,0xFE,0x12,0x02,0x15,0x0C,0x3F,0xF0,0x69,0x42,0xA5,0x21,
0x3F,0xFE,0x03,0x02,0x7D,0x84,0x41,0x68,0x41,0x18,0x7D,0x66,0x05,0x84,0x00,0x00,
};
const unsigned char  hanzic2[32] = 
{
0x08,0x01,0x08,0xC2,0x0F,0x44,0xF8,0x28,0x08,0x30,0x0F,0xCE,0x01,0x04,0x41,0x00,
0x41,0x02,0x41,0x01,0x4F,0xFE,0x51,0x00,0x61,0x00,0x41,0x00,0x01,0x00,0x00,0x00,
};
const unsigned char  hanzic3[32] = 
{
0x40,0x40,0x41,0x80,0x4F,0xFE,0x72,0x08,0x43,0xFC,0x42,0x00,0x12,0x00,0x12,0x40,
0x13,0xC8,0xFE,0x44,0x12,0x4A,0x12,0x50,0x12,0x60,0x12,0x00,0x02,0x00,0x00,0x00,
};


void displayword(u8 *aaray);
void displaywordfan(u8 *aaray);
void displayword1(bank2 u8 *aaray);
void displaywordfan1(bank2 u8 *aaray);
void displaywordc1(const u8 *aaray);
void displaywordfanc1(const u8 *aaray);
void main()
{
//unsigned char i,j,p=0,a;
//unsigned int i,*p;
//INTCON|=0x90;//设置全局中断使能,INT/RB0中断使能
//OPTION_REG=0x80;
 u8 *p;
//FSR=0;
//INDF=0;
ADCON1=0x07;
TRISB=0xC9;
TRISA=0;
TRISC=0;
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA5=1;
RC1=1;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
RC6=1;
RC7=1;
RB1=1;
RB2=1;
RB4=1;
RB5=1;
while(1)
{
//if(RB0==0)
//{
/*for(j=0;j<=7;j++)


if(p>11)p=0;
i=hanzi[p];
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
p++;
i=hanzi[p];
p++;
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
delay_ms(15);
};*/


/*
if(RB0==0)
{
//p=hanzi1;
displayword(hanzi1);
//p=hanzi2;
displayword(hanzi2);
//displayword(&hanzi3[0]);
displayword1(hanzi3);
}
if(RB0==1)
{
//displayword(&hanzi3[0]);
//p=hanzi2;
displaywordfan1(hanzi3);
displaywordfan(hanzi2);
//p=hanzi1;
displaywordfan(hanzi1);
}
*/




if(RB0==0)
{
//p=hanzi1;
displaywordc1(hanzic1);
//p=hanzi2;
displaywordc1(hanzic2);
//displayword(&hanzi3[0]);
displaywordc1(hanzic3);
}
if(RB0==1)
{
//displayword(&hanzi3[0]);
//p=hanzi2;
displaywordfanc1(hanzic3);
displaywordfanc1(hanzic2);
//p=hanzi1;
displaywordfanc1(hanzic1);
}




}
}




void displayword(u8 *aaray)
{
u8 j,i,p=0;
for(j=0;j<=15;j++)
{
if(p>31)p=0;
i=aaray[p];
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
p++;
i=aaray[p];
p++;
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
delay_ms(3);
}
}




void displaywordfan(u8 *aaray)
{
u8 j,i,p=31;
for(j=0;j<=15;j++)
{
if(p==0xff)p=31;
i=aaray[p];
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
p--;
i=aaray[p];
p--;
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
delay_ms(3);
}
}


void displaywordc1(const u8 *aaray)
{
u8 j,i,p=0;
for(j=0;j<=15;j++)
{
if(p>31)p=0;
i=aaray[p];
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
p++;
i=aaray[p];
p++;
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
delay_ms(3);
}
}


void displaywordfanc1(const u8 *aaray)
{
u8 j,i,p=31;
for(j=0;j<=15;j++)
{
if(p==0xff)p=31;
i=aaray[p];
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
p--;
i=aaray[p];
p--;
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
delay_ms(3);
}
}


void displayword1(bank2 u8 *aaray)
{
u8 j,i,p=0;
for(j=0;j<=15;j++)
{
if(p>31)p=0;
i=aaray[p];
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
p++;
i=aaray[p];
p++;
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
delay_ms(3);
}
}


void displaywordfan1(bank2 u8 *aaray)
{
u8 j,i,p=31;
for(j=0;j<=15;j++)
{
if(p==0xff)p=31;
i=aaray[p];
RC4=1-(i>>7);
RC5=1-((i&0x7F)>>6);
RC6=1-((i&0x3F)>>5);
RC7=1-((i&0x1F)>>4);
RB1=1-((i&0x0F)>>3);
RB2=1-((i&0x07)>>2);
RB4=1-((i&0x03)>>1);
RB5=1-(i&0x01);
p--;
i=aaray[p];
p--;
RA0=1-(i>>7);
RA1=1-((i&0x7F)>>6);
RA2=1-((i&0x3F)>>5);
RA3=1-((i&0x1F)>>4);
RA5=1-((i&0x0F)>>3);
RC1=1-((i&0x07)>>2);
RC2=1-((i&0x03)>>1);
RC3=1-(i&0x01);
delay_ms(3);
}
}




/*void interrupt ISR(void)
{
   //if(T0IE & T0IF)
    //   {
    //       T0IF = 0;
           //处理函数
    //    }
//nop();
;
if(INTF==1)
{
INTF=0;
in++;
if(in==2)in=0;
if(in==0)
{
TRISB=0xFF;
TRISA=0xFF;
TRISC=0xFF;
}
if(in==1)
{
TRISB=0xC9;
TRISA=0;
TRISC=0;
}
}
}*/


/* LED1ON;
delay_ms(250);
LED1OFF;
delay_ms(250);
LED2ON;
delay_ms(250);
LED2OFF;
delay_ms(250);
LED3ON;
delay_ms(250);
LED3OFF;
delay_ms(250);
LED4ON;
delay_ms(250);
LED4OFF;
delay_ms(250);
LED5ON;
delay_ms(250);
LED5OFF;
delay_ms(250);
LED6ON;
delay_ms(250);
LED6OFF;
delay_ms(250);
LED7ON;
delay_ms(250);
LED7OFF;
delay_ms(250);
LED8ON;
delay_ms(250);
LED8OFF;
delay_ms(250);
LED9ON;
delay_ms(250);
LED9OFF;
delay_ms(250);
LED10ON;
delay_ms(250);
LED10OFF;
delay_ms(250);
LED11ON;
delay_ms(250);
LED11OFF;
delay_ms(250);
LED12ON;
delay_ms(250);
LED12OFF;
delay_ms(250);
LED13ON;
delay_ms(250);
LED13OFF;
delay_ms(250);
LED14ON;
delay_ms(250);
LED14OFF;
delay_ms(250);
LED15ON;
delay_ms(250);
LED15OFF;
delay_ms(250);
LED16ON;
delay_ms(250);
LED16OFF;
delay_ms(250);


LED1ON;
LED2ON;
LED3ON;
LED4ON;
LED5ON;
LED6ON;
LED7ON;
LED8ON;
LED9ON;
LED10ON;
LED11ON;
LED12ON;
LED13ON;
LED14ON;
LED15ON;
LED16ON;


delay_ms(250);
delay_ms(250);
delay_ms(250);


LED1OFF;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
LED8OFF;
LED9OFF;
LED10OFF;
LED11OFF;
LED12OFF;
LED13OFF;
LED14OFF;
LED15OFF;
LED16OFF;
*/
原创粉丝点击