单片机点阵问题
答案:1 悬赏:80
解决时间 2021-10-23 01:20
- 提问者网友:眉目添风霜
- 2021-10-22 09:02
单片机点阵问题
最佳答案
- 二级知识专家网友:夜风逐马
- 2021-10-22 10:33
16x16原理首先行选通,然后送16Bit数据16bit数据,到位了送锁存器,最后就是送到选通的行上去,完成一次行扫描,总共16行。即完成一帧。亮下程序:#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
sbit csr=P1^0;
sbit cla=P1^1;
sbit d_in=P1^2;
sbit A=P3^0;
sbit BB=P3^1;
sbit C=P3^2;
sbit D=P3^3;
sbit oe=P3^4;
unchar code duan[]=
{
0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02,0x45,0x0A,
0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01,0x00,0x00//ni //显示的字模
};
unchar num_wei,*num_date;
void delay(int temp)
{
int i,j;
for(i=temp;i>0;i--)
for(j=40;j>0;j--);
}
void cp_sr()//输入时钟
{
csr=0;
csr=1;
}
void cp_la()//锁存时钟
{
cla=0;
cla=1;
}
void move_byte(unchar *temp)//送16Bit数据
{
unchar *x,y,aa;
x=temp;
for(aa=8;aa>0;aa--)
{
y=x[0];
y=y>>(aa-1)&0x01;
if(y)
d_in=1;
else
d_in=0;
cp_sr();
}
for(aa=8;aa>0;aa--)
{
y=x[1];
y=y>>(aa-1)&0x01;
if(y)
d_in=1;
else
d_in=0;
cp_sr();
}
cp_la();//送到锁存器中
}
void wei_move(unchar num)//行选通
{
unchar temp;
temp=num;
switch(temp)
{
case 0:
A=0;BB=0;C=0;D=0;
break;
case 1:
A=1;BB=0;C=0;D=0;
break;
case 2:
A=0;BB=1;C=0;D=0;
break;
case 3:
A=1;BB=1;C=0;D=0;
break;
case 4:
A=0;BB=0;C=1;D=0;
break;
case 5:
A=1;BB=0;C=1;D=0;
break;
case 6:
A=0;BB=1;C=1;D=0;
break;
case 7:
A=1;BB=1;C=1;D=0;
break;
case 8:
A=0;BB=0;C=0;D=1;
break;
case 9:
A=1;BB=0;C=0;D=1;
break;
case 10:
A=0;BB=1;C=0;D=1;
break;
case 11:
A=1;BB=1;C=0;D=1;
break;
case 12:
A=0;BB=0;C=1;D=1;
break;
case 13:
A=1;BB=0;C=1;D=1;
break;
case 14:
A=0;BB=1;C=1;D=1;
break;
case 15:
A=1;BB=1;C=1;D=1;
break;
default:
break;
}}
void display()//显示
{
wei_move(num_wei);num_wei++;//选通一行就加一
move_byte(num_date);//读出16Bit数据
num_date+=2;
oe=0;
delay(5);//就显示这么长时间
oe=1;
if(num_wei==16)
{
num_wei=0;//从新位选通
num_date=duan;//从新送16Bit数据
}
}
void main()
{
num_date=duan;
while(1)
display();} 我以前做的
#define unchar unsigned char
#define unint unsigned int
sbit csr=P1^0;
sbit cla=P1^1;
sbit d_in=P1^2;
sbit A=P3^0;
sbit BB=P3^1;
sbit C=P3^2;
sbit D=P3^3;
sbit oe=P3^4;
unchar code duan[]=
{
0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02,0x45,0x0A,
0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01,0x00,0x00//ni //显示的字模
};
unchar num_wei,*num_date;
void delay(int temp)
{
int i,j;
for(i=temp;i>0;i--)
for(j=40;j>0;j--);
}
void cp_sr()//输入时钟
{
csr=0;
csr=1;
}
void cp_la()//锁存时钟
{
cla=0;
cla=1;
}
void move_byte(unchar *temp)//送16Bit数据
{
unchar *x,y,aa;
x=temp;
for(aa=8;aa>0;aa--)
{
y=x[0];
y=y>>(aa-1)&0x01;
if(y)
d_in=1;
else
d_in=0;
cp_sr();
}
for(aa=8;aa>0;aa--)
{
y=x[1];
y=y>>(aa-1)&0x01;
if(y)
d_in=1;
else
d_in=0;
cp_sr();
}
cp_la();//送到锁存器中
}
void wei_move(unchar num)//行选通
{
unchar temp;
temp=num;
switch(temp)
{
case 0:
A=0;BB=0;C=0;D=0;
break;
case 1:
A=1;BB=0;C=0;D=0;
break;
case 2:
A=0;BB=1;C=0;D=0;
break;
case 3:
A=1;BB=1;C=0;D=0;
break;
case 4:
A=0;BB=0;C=1;D=0;
break;
case 5:
A=1;BB=0;C=1;D=0;
break;
case 6:
A=0;BB=1;C=1;D=0;
break;
case 7:
A=1;BB=1;C=1;D=0;
break;
case 8:
A=0;BB=0;C=0;D=1;
break;
case 9:
A=1;BB=0;C=0;D=1;
break;
case 10:
A=0;BB=1;C=0;D=1;
break;
case 11:
A=1;BB=1;C=0;D=1;
break;
case 12:
A=0;BB=0;C=1;D=1;
break;
case 13:
A=1;BB=0;C=1;D=1;
break;
case 14:
A=0;BB=1;C=1;D=1;
break;
case 15:
A=1;BB=1;C=1;D=1;
break;
default:
break;
}}
void display()//显示
{
wei_move(num_wei);num_wei++;//选通一行就加一
move_byte(num_date);//读出16Bit数据
num_date+=2;
oe=0;
delay(5);//就显示这么长时间
oe=1;
if(num_wei==16)
{
num_wei=0;//从新位选通
num_date=duan;//从新送16Bit数据
}
}
void main()
{
num_date=duan;
while(1)
display();} 我以前做的
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯