老王数码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();
}