AIP1640双8x8LED阵列

老王数码DIY的

根据买家评价里面的代码做一点点补充。

基于STC89C52RC

//#include <stc8h.h>
#include <reg52.h>
#include <intrins.h>
//#include <stdlib.h>
#include "AIP1640.h"
#include "font.h"

uint code point[9]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
uint code chuan[9]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0x00};
//uint code fill[4]={0x00,0xf0,0x0f,0xff};
//uint code two[2]={0x00,0xff};


uint code heart[8]={0x66,0xE7,0xFF,0xFF,0x7E,0x3C,0x18,0x00};

void program1();   //横点满8x16格
void program2();   //竖点满16x8格
void Showchar();
void draw_freedraw();

void Delay1000ms()		//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main()
{   
  
//	P2M0 = 0x00; P2M1 = 0x00; 
	AIP1640_Init();

  
   AIP1640_mode(Addr_Fix_Mode);
   AIP1640_bright(Brightness_level_1);
    program1();
   Delay1000ms();
   program2();  
   Delay1000ms();
  draw_freedraw();
	}	
	


void program1() //横点满8x16格
{
uint a,b,count;
  count=0;a=0;b=0;
 while(1)	
{ 
//	AIP1640_mode(Addr_Auto_Mod);
  AIP1640_mode(Addr_Fix_Mode);
	AIP1640_bright(Brightness_level_1);
	AIP1640_draw(b,point[a]); 
  count++;
	if(count==100)
	{	count=0;a++;
	   { if(a==9)
         {a=0;b++;
           if(b==16)
					 { Delay1000ms();
						 AIP1640_Clear();
						 b=0;a=0;
						 break;
					 }
				 }
			} 
  } 
}
}

void program2() //竖点满16x8格
{
uint c,d,count2;
  count2=0;c=0;d=0;
 while(1)	
{ 
//	AIP1640_mode(Addr_Auto_Mod);
	AIP1640_mode(Addr_Fix_Mode);
	AIP1640_bright(Brightness_level_1);
	AIP1640_draw(c,chuan[d]); 
  count2++;
	if(count2==100)
	{	count2=0;c++;
	   { if(c==16)
         {c=0;d++;
           if(d==8)
					 { Delay1000ms();
						 AIP1640_Clear();
						 d=0;c=0;
						 break;
					 }
				 }
			} 
  } 
}
}






void draw_freedraw() {  
    unsigned char y1 = 0;
	   int x=0;

	
	 		uint code f    [8][8]={{0,0,1,1,1,1,0,0},
                             {0,1,0,1,0,0,1,0},
	                           {1,0,1,0,1,1,0,1},
									    		   {1,0,1,0,0,0,0,1},		
	                           {1,0,1,0,0,0,0,1},
											       {1,0,1,0,1,1,0,1},
	                           {0,1,0,1,0,0,1,0},
											       {0,0,1,1,1,1,0,0}};
     
while(1)
{  if(x==8)
	   break;
	else
	 y1 = f[x][0]*1+ f[x][1]*2+f[x][2]*4+f[x][3]*8+f[x][4]*16+f[x][5]*32+f[x][6]*64+f[x][7]*128;
    AIP1640_draw(x, y1);
    AIP1640_draw(x+8, y1);   
    x++;
	  
}  
}

AIP1640.h

#define uchar unsigned char 
#define uint unsigned int  

sbit DIO=P2^0;
sbit CLK=P2^1;

typedef enum
{
   Addr_Fix_Mode = 0X44,  //¹Ì¶¨µØַģʽ 
   Addr_Auto_Mod = 0X40,  //×Ô¶¯¼Ó1µØַģʽ
}  Addr_Mode_t;


typedef enum
{
   Brightness_level_0      =  0X80,  //¹Ø±³¹â
   Brightness_level_1      =  0X88,  //±³¹â ÁÁ¶È 1 
   Brightness_level_2      =  0X89,  //±³¹â ÁÁ¶È 2 
   Brightness_level_3      =  0X8A,  //±³¹â ÁÁ¶È 3 
   Brightness_level_4      =  0X8B,  //±³¹â ÁÁ¶È 4 
   Brightness_level_5      =  0X8C,  //±³¹â ÁÁ¶È 5 
   Brightness_level_6      =  0X8D,  //±³¹â ÁÁ¶È 6 
   Brightness_level_7      =  0X8E,  //±³¹â ÁÁ¶È 7 
   Brightness_level_8      =  0X8F,  //±³¹â ÁÁ¶È 8   
}  Brightness_level_t;


//ÏÔʾ¼Ä´æÆ÷µØÖ·
typedef enum
{ 
	All_Place_Addr     =  16,     //AIP1640 Ö§³Ö16λµØÖ·
	Place_Addr_01      =  0XC0,  
	Place_Addr_02      =  0XC1, 
	Place_Addr_03      =  0XC2, 
	Place_Addr_04      =  0XC3, 
	Place_Addr_05      =  0XC4, 
	Place_Addr_06      =  0XC5, 
	Place_Addr_07      =  0XC6, 
	Place_Addr_08      =  0XC7, 
	Place_Addr_09      =  0XC8, 
	Place_Addr_10      =  0XC9, 
	Place_Addr_11      =  0XCA, 
	Place_Addr_12      =  0XCB, 
	Place_Addr_13      =  0XCC,
	Place_Addr_14      =  0XCD,
	Place_Addr_15      =  0XCE,
	Place_Addr_16      =  0XCF,
} Place_Addr_t;

void Delay_us(uint i)
{	i = 1;	while (--i);}

void AIP1640_start(void)
{CLK=1;DIO=1;Delay_us(2);DIO=0;}
/*
void AIP1640_ack(void)
{ uchar i;CLK=0;Delay_us(5);while(DIO==1&&(i<250))i++;CLK=1;Delay_us(2);CLK=0;}
*/

void AIP1640_stop(void)
{CLK=0;Delay_us(2);DIO=0; Delay_us(2);CLK=1;Delay_us(2);DIO=1;Delay_us(2);}

void AIP1640_Write(uchar DATA)
   	{
			uchar i;	
			for(i=0;i<8;i++)
			{ CLK=0;
				if(DATA & 0x01) DIO=1;
				else DIO=0;
				Delay_us(3);
			  DATA=DATA>>1;
		    Delay_us(3);
		    CLK=1;Delay_us(3);}
		DIO=0;CLK=0;}
		
void AIP1640_draw(uchar n,uchar n2)
 {AIP1640_start();AIP1640_Write(0x44);AIP1640_stop();
 AIP1640_start();	AIP1640_Write(0xC0+n);AIP1640_Write(n2);AIP1640_stop();
 AIP1640_start();AIP1640_Write(0x8a);AIP1640_stop();
 }	

void AIP1640_Init()
{ uchar i = 0;
	AIP1640_start();AIP1640_Write(0x44);AIP1640_stop();
  AIP1640_start(); AIP1640_Write(0xC0+i);for(i=0;i<16;i++) AIP1640_Write(0x00);AIP1640_stop();
	AIP1640_start();AIP1640_Write(0x8a);AIP1640_stop();

}	

void AIP1640_Clear()
 { uchar i = 0;
	AIP1640_start();
  AIP1640_Write(0xC0+i);for(i=0;i<16;i++)
	AIP1640_Write(0x00);
  AIP1640_stop(); }
 
	
	void AIP1640_Fill()
 { uchar i = 0;
	AIP1640_start();
  AIP1640_Write(0xC0+i);for(i=0;i<16;i++)
	AIP1640_Write(0xFF);
  AIP1640_stop(); }
 

	
	void AIP1640_mode(uchar address_mode)
	{
	AIP1640_start();AIP1640_Write(address_mode);AIP1640_stop();
	}

	
		void AIP1640_bright(uchar bright)
	{
	AIP1640_start();AIP1640_Write(bright);AIP1640_stop();
	}

	
		void AIP1640_address(uchar address)
	{
	AIP1640_start();AIP1640_Write(address);AIP1640_stop();
	}
	

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值