收拾电脑偶然间看到大学时候写的点阵屏的代码,删掉又可惜,在这保存一下哈,
#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小伙伴,路过点个赞哈