基础在这里单片机——点阵1
1.心形图案
演示
讲解
实现上图有两种方法
-
按照每个点来循环
找到每个点的行和列,让行和列分别组成一个数组uchar code col[]={0x04,0x08,0x20,0x40,0x02,0x10,0x80,0x04,0x40,0x08,0x20,0x10};//列 uchar code row[]={0xbf,0xbf,0xbf,0xbf,0xdf,0xdf,0xdf,0xef,0xef,0xf7,0xf7,0xfb};//行
然后再主函数中进行循环
-
按照以行为标准,列循环(或者:以列为标准,行循环)
那么,计算机是如何扫描的呢,请看下图:
代码
-
方法一:
#include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char void delay(int xms){ uint i,j; for(i=xms;i>0;i--){ for(j=110;j>0;j--); } } uchar code col[]={0x04,0x08,0x20,0x40,0x02,0x10,0x80,0x04,0x40,0x08,0x20,0x10};//列 uchar code row[]={0xbf,0xbf,0xbf,0xbf,0xdf,0xdf,0xdf,0xef,0xef,0xf7,0xf7,0xfb};//行 void main(){ uint i,j; while(1){ for(i=0;i<12;i++){ P2=row[i]; P3=col[i]; delay(1); } } }
-
方法二
#include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char void delay(int xms){ uint i,j; for(i=xms;i>0;i--){ for(j=110;j>0;j--); } } uchar code col[]={0x00,0x6c,0x92,0x44,0x28,0x10,0x00,0x00};//列 void main(){ uint i; P2=0xfe; while(1){ for(i=0;i<8;i++){ P2=_cror_(P2,1); P3=col[i]; delay(1); } } }
2. 方型扫描
演示
讲解
代码很多我们一步一步来讲解
-
我们先来分析图案
我们可以观察到,他是由一个一个图案组成的,并不能由单纯的循环所能演示出
图案如下,大家可以用上面的方法自己写一写数组里的值
就直接将列的代码给大家了
uchar code tab[]={ 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,//图一 0x00,0x00,0x3c,0x3c,0x3c,0x3c,0x00,0x00,//图二 0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00,//图三 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff //图四 };
-
图案循环(内到外)
先上代码uint i,j=0,t=0; P2=0xfe; for(i=0;i<8;i++){ P2=_cror_(P2,1); P3=tab[j*8+i]; delay(1); } t++; if(t==100){ j++; t=0; if(j=4)j=0; }
解释一:与心形图案的方法二比较发现,
P3=tab[j*8+i];
多了一个j
,是由于:数组中有四个图案,当j=0
时,循环第一个图案,j=2
时循环第二个图案,依次类推
解释二: 与之前的代码相比较多了一个t
,那么t是用来干什么的?t是用来延时的,每当t+到100时,就换一个图案。为什么不用delay延时? 你可以试试,当delay运行时,for循环就需要等待delay运行完,那么点阵就会什么都不显示。 -
加上由外到内
进行到第二步点阵就可以由内到外循环,如何由外到内呢
方法一: 在数组中在写两个图案(图二和图三的值),可行
方法二: 加一个flag,控制j
的值,可行
代码
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={
0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x3c,0x3c,0x3c,0x3c,0x00,0x00,
0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
void delay(uint xms){
uint i,j;
for(i=0;i<xms;i++){
for(j=0;j<110;j++);
}
}
void main(){
uint i;
uint j=0,t=0;
uint flag=0;
P2=0xfe;
while(1){
for(i=0;i<8;i++){
P2=_cror_(P2,1);
P3=tab[j*8+i];
delay(1);
}
t++;
if(t==100){
t=0;
if(flag==0)j++;
else j--;
}
if(j==3)flag=1;
else if(j==0)flag=0;
}
}
3. 循环显示数字0-9图形。
演示
代码
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(int xms){
uint i,j;
for(i=xms;i>0;i--){
for(j=110;j>0;j--);
}
}
uchar code imges[]={
0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,//0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,//1
0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,//2
0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,//3
0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,//4
0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00,//5
0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00,//6
0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00,//7
0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,//8
0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00 //9
};
void main(){
uint i,j=0,t=0;
P3=0x01;
while(1){
for(i=0;i<8;i++){
P3=_crol_(P3,1);
P2=~imges[j*8+i];
delay(1);
}
t++;
if(t==100){
j++;
t=0;
if(j==10)j=0;
}
}
}