代码开源之大学时的点阵屏

     收拾电脑偶然间看到大学时候写的点阵屏的代码,删掉又可惜,在这保存一下哈,

​​

#include<reg52.h>
typedef unsigned char uchar	 ;
typedef unsigned int  uint	 ;
#define data_port_1 P1
#define data_port_2 P2
sbit A1_0 = P3^0;  //第一个138
sbit A1_1 = P3^1;
sbit A1_2 = P3^2;
sbit E1_3 = P3^6;

sbit A2_0 = P3^3;  //第二个138
sbit A2_1 = P3^4;
sbit A2_2 = P3^5;
sbit E2_3 = P3^7;
unsigned char code image[] = {
0xEF,0xEF,0xF7,0xDF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,
0xDE,0xF7,0xC0,0x07,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
0xEF,0xEF,0xF7,0xDF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,
0xDE,0xF7,0xC0,0x07,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,			};	
unsigned char code table_138[8][3]={				
																		{0,0,0,},
																		{1,0,0,},
																		{0,1,0,},
																		{1,1,0,},	
																		{0,0,1,},	
																		{1,0,1,},
																		{0,1,1,},	
																		{1,1,1,},	
																			   	};//8行3列的二维数组	  

void delay(uint z)		//延时
{
		uint i=100;
		while(z--)
				while(i--);
}
void disable_138()
{
		E1_3=0;	//失能第一个138
		E2_3=0;	//失能第二个138
		data_port_2=0xff;  //消隐
		data_port_1=0xff;  //消隐
}																	
//功能 : 控制两个138输出16种状态
//参数 : 使能对应的引脚 范围 0~15
void crl_138(uchar pin)
{
		if(pin<8)
		{ 
				A1_0=table_138[pin][0];
				A1_1=table_138[pin][1];
				A1_2=table_138[pin][2];
				E1_3=1;//使能第一个138
				E2_3=0;//失能第二个138
		}
		else
		{
				pin-=8;
				A2_0=table_138[pin][0];
				A2_1=table_138[pin][1];
				A2_2=table_138[pin][2];

				E2_3=1;//使能第二个138
				E1_3=0;//失能第一个138
		}
}

//功能 :显示一帧16*16图片
//参数 :要显示的地址
void display(uchar *img)  //  显示子函数(定义指针变量)
{
		uint i=0;
		for(i=0;i<16;i++)
		{
				
				data_port_2=*img++;		                //从指针指向的地址 取数据到P2口
				data_port_1=*img++;		                //从指针指向的地址 取数据到P1口
				crl_138(i);					//控制138译码器
				delay(1);			    	//延时用的,调整刷新频率和亮度,自己找个合适的数
										    //注意:在中断中调用不要加这个延时
				disable_138();				//消影	 失能
		}
}
//功能 : 定时器初始化
void init_time0()
{
		EA = 1;
		TMOD = 0x01;
		TH0 = 0xFE;
		TL0 = 0x0C;
		ET0 = 1;
		TR0 = 1;
}
void main()
{
	int index=0;
	int i=0;
//	init_time0();//初始化定时器中断 ,我没用定时器,所以注释了
//	data_port_2=img ++;
//	data_port_1=img ++;
//	crl_138(2); 
	while(1)
	{
			for(i=0;i<20;i++)        //让一张图片多显示几次,看上去图片是定格的
			{
				display(image+index);//每执行到这,把数组的地址改变
			}
			index+=2;               //因为一行占两个字节,所以想跳过一行显示需要+2
			if(index>(16*2*3))      //一个字有16*2个字节,一共3个字,所以index不能大于这个数,要不就没字了,或者乱码。
			{
					index=0;
			}
	}
}
void InterruptTimer0() interrupt 1
{
	/*
	static unsigned char i = 0;
	static unsigned char index = 0;
	TH0 = 0xFE;
	TL0 = 0x0C;

	P1 = 0xFF;
	P2 = 0xFF;
		if(i>7)
	{
	   E1_3=1;
	   E2_3=0;
	}
	else
	{
		E1_3=0;
	    E2_3=1;
	}	
		index++;
		if(index >= 1)
		{
			index = 0;
		}	
*/
}

有帮助的x小伙伴,路过点个赞哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值