📄 点阵demo代码.c
字号:
//** device:pic16f73**//
#include <pic.h>
unsigned char num,A1,A1_num,CNT,mode;
//num为当前显示的灯数,A1为刚A/D出来的累进.
//CNT为中断计数,mode为显示的模式
#define LED[0] RC0
//标志位
#define LATCH RB3
//LATCH信号位
#define SIN RB1
//serial-in信号位
#define CLK RB2
//clock信号位
unsigned char time,t;
//定义时间的变量
//**延时程序**//
void delay_1ms(unsigned int k)
{
unsigned int n,p;
for(p=0;p<k;p++)
for(n=0;n<50;n++)
{
NOP();
}
}
void delay_ms(void)
{
unsigned char k;
for(k=0;k<2;k++)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
}
delay_cnt(unsigned char cnt)
{
unsigned char n,j;
for(n=0;n<cnt;n++)
for(j=0;j<10;j++)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
//**中断设置程序**//
void interrupt isr(void)
{
GIE=0;
INTF=0;
PORTC=0XFF;
delay_1ms(300);
PORTC=0X00;
while(RB0==0)
{
delay_1ms(50);
// delay_ms();
while(RB0==0)
{}
}
switch(CNT)
{
case 1:mode=2;CNT=2;break;
case 2:mode=3;CNT=3;break;
case 3:mode=4;CNT=4;break;
case 4:mode=5;CNT=5;break;
case 5:mode=6;CNT=6;break;
case 6:mode=7;CNT=7;break;
case 7:mode=1;CNT=1;break;
};
INTF=0;
GIE=1;
}
//**将16位数字串行输入到16个输出口的程序**//
void run(unsigned char a,unsigned char b)
{
//start
SIN=0;
LATCH=0;
//1 bit
if(0x80&a)
{SIN=1;}
else SIN=0;
CLK=1;
//2 bit
CLK=0;
if(0X40&a)
{SIN=1;}
else SIN=0;
CLK=1;
//3 bit
CLK=0;
if(0X20&a)
{SIN=1;}
else SIN=0;
CLK=1;
//4 bit
CLK=0;
if(0X10&a)
{SIN=1;}
else SIN=0;
CLK=1;
//5 bit
CLK=0;
if(0X08&a)
{SIN=1;}
else SIN=0;
CLK=1;
//6 bit
CLK=0;
if(0X04&a)
{SIN=1;}
else SIN=0;
CLK=1;
//7 bit
CLK=0;
if(0X02&a)
{SIN=1;}
else SIN=0;
CLK=1;
//8 bit
CLK=0;
if(0X01&a)
{SIN=1;}
else SIN=0;
CLK=1;
//9 bit
CLK=0;
if(0x01&b)
{SIN=1;}
else SIN=0;
CLK=1;
//10 bit
CLK=0;
if(0X02&b)
{SIN=1;}
else SIN=0;
CLK=1;
//11 bit
CLK=0;
if(0X04&b)
{SIN=1;}
else SIN=0;
CLK=1;
//12 bit
CLK=0;
if(0X08&b)
{SIN=1;}
else SIN=0;
CLK=1;
//13 bit
CLK=0;
if(0X10&b)
{SIN=1;}
else SIN=0;
CLK=1;
//14 bit
CLK=0;
if(0X20&b)
{SIN=1;}
else SIN=0;
CLK=1;
//15 bit
CLK=0;
if(0X40&b)
{SIN=1;}
else SIN=0;
CLK=1;
//16 bit
CLK=0;
if(0X80&b)
{SIN=1;}
else SIN=0;
CLK=1;
//Stop
CLK=0;
SIN=0;
LATCH=1;
asm("nop");
LATCH=0;
}
//**将内容显示到整个屏幕的扫描程序**//
void output(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f,unsigned char g,unsigned char h)
{
while(time--)
{
RC0=0;
run(a,0x01);
delay_cnt(10);
RC0=1;
run(b,0x02);
delay_cnt(10);
RC0=0;
run(c,0x04);
delay_cnt(10);
RC0=1;
run(d,0x08);
delay_cnt(10);
RC0=0;
run(e,0x10);
delay_cnt(10);
RC0=1;
run(f,0x20);
delay_cnt(10);
RC0=0;
run(g,0x40);
delay_cnt(10);
RC0=1;
run(h,0x80);
delay_cnt(9);
}
}
//******屏幕全亮******//
void allstar(void)
{
t=2;
time=t;
/*Light all LED */
output(0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
}
//******心型效果******//
void heart(void)
{
t=100;
/*display heart*/
time=t;
output(0x00,0x38,0x44,0x42,0x21,0x42,0x44,0x38);
t=10;
/*display full heart*/
time=t;
output(0x00,0x38,0x7c,0x7e,0x2f,0x7e,0x7c,0x38);
}
//******屏幕闪烁******//
void shine(void)
{
t=12;
time=t;
output(0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55);
time=t;
output(0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa);
}
//*******显示数字(0~9)*******//
void number(void)
{
t=15;
/*display 0 */
time=t;
output(0x00,0x00,0x3E,0x41,0x41,0x3E,0x00,0x00);
/*display 1 */
time=t;
output(0x00,0x00,0x00,0x21,0x7F,0x01,0x00,0x00);
/*display 2 */
time=t;
output(0x00,0x00,0x23,0x45,0x49,0x31,0x00,0x00);
/*display 3 */
time=t;
output(0x00,0x00,0x22,0x49,0x49,0x36,0x00,0x00);
/*display 4 */
time=t;
output(0x00,0x00,0x0C,0x14,0x24,0xFF,0x04,0x00);
/*display 5 */
time=t;
output(0x00,0x00,0x72,0x51,0x51,0x4E,0x00,0x00);
/*display 6 */
time=t;
output(0x00,0x00,0x3E,0x49,0x49,0x49,0x06,0x00);
/*display 7 */
time=t;
output(0x00,0x00,0x40,0x4F,0x70,0x40,0x00,0x00);
/*display 8 */
time=t;
output(0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00);
/*display 9 */
time=t;
output(0x00,0x00,0x30,0x49,0x49,0x3E,0x00,0x00);
}
//*******显示字母A~G*******//
void alphabet(void)
{
t=15;
/*display A */
time=t;
output(0x00,0x00,0x01,0x1F,0x64,0x1F,0x01,0x00);
/*display B */
time=t;
output(0x00,0x00,0x41,0x7F,0x51,0x51,0x2E,0x00);
/*display C */
time=t;
output(0x00,0x00,0x3E,0x41,0x41,0x41,0x62,0x00);
/*display D */
time=t;
output(0x00,0x00,0x41,0x7F,0x41,0x41,0x3E,0x00);
/*display E */
time=t;
output(0x00,0x00,0x41,0x7F,0x49,0x49,0x63,0x00);
/*display F */
time=t;
output(0x00,0x00,0x41,0x7F,0x49,0x5C,0x60,0x00);
/*display G */
time=t;
output(0x00,0x00,0x3E,0x41,0x45,0x46,0x04,0x00);
}
//*******交叉闪烁效果*******//
void chazi(void)
{
t=6;
time=t;
output(0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81);
time=t;
output(0x42,0xA5,0x5A,0x24,0x24,0x5A,0xA5,0x42);
time=t;
output(0x24,0x18,0x81,0x42,0x42,0x81,0x18,0x24);
time=t;
output(0x18,0x00,0x00,0x81,0x81,0x00,0x00,0x18);
}
//*******回型闪烁效果*******//
void huixing(void)
{
t=6;
time=t;
output(0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF);
time=t;
output(0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00);
time=t;
output(0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00);
time=t;
output(0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00);
time=t;
output(0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00);
time=t;
output(0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00);
}
//********主程序********//
main(void)
{
//初始设置
{
//中断初始化
INTCON=0b00010000;
// 关总中断
OPTION=0b00000000;
ADIF=0;
// ADIE=1;
PEIE=1;//?
GIE=0;
T0IE=0;
RBIE=0;
//INT
INTEDG=1;
INTF=0;
INTE=1;
// RBPU=0;//
//A/D初始化
ADCON1=0X01;
// Vref=RA3,其它口均为模拟量输入.
ADCON0=0X01;
// AD时钟源ADCS1:ADCS0=00=Fosc/2;CHS2:CHS0=000=RA0/AN1,选RA0为当前A/D通道;ADON=1,AD ON.
//IO口初始化
TRISA=0X3F;
//PORA全为输入口.
TRISC=0X00;
PORTC=0X00;
TRISB=0Xf1;
num=0;
ADCON0=0X02;
delay_cnt(20);
delay_cnt(20);
CLK=1;
delay_cnt(20);
CLK=0;
CNT=1;
//变量初始化
mode=1;
/*******RB INT******/
GIE=1;//
}
//主循环
while(1)
{
//PORTC=0X00;
switch(mode)
{
case 1:allstar();break;
//全亮
case 2:heart();break;
//心型效果
case 3:shine();break;
//屏幕闪烁
case 4:chazi();break;
//交叉闪烁
case 5:huixing();break;
//回型闪烁
case 6:number();break;
//显示数字
case 7:alphabet();break;
//显示字母
};
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -