单片机——点阵2(Proteus和KeilC51)

基础在这里单片机——点阵1

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};//行
    

    然后再主函数中进行循环

  2. 按照以行为标准,列循环(或者:以列为标准,行循环)
    在这里插入图片描述
    那么,计算机是如何扫描的呢,请看下图:
    在这里插入图片描述

代码

  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[]={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);
    			}
    			
    	}
    }
    
  2. 方法二

    #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. 方型扫描

演示

在这里插入图片描述

讲解

代码很多我们一步一步来讲解

  1. 我们先来分析图案
    我们可以观察到,他是由一个一个图案组成的,并不能由单纯的循环所能演示出
    图案如下,大家可以用上面的方法自己写一写数组里的值
    在这里插入图片描述

    就直接将列的代码给大家了

    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 //图四
    };
    
  2. 图案循环(内到外)
    先上代码

    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运行完,那么点阵就会什么都不显示。

  3. 加上由外到内
    进行到第二步点阵就可以由内到外循环,如何由外到内呢
    方法一: 在数组中在写两个图案(图二和图三的值),可行
    方法二: 加一个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;
		}
	}
}
  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值