标题:
我想问问这个proteus里 单片机和点阵为什么要这样接线?
[打印本页]
作者:
gf818099
时间:
2019-12-18 00:27
标题:
我想问问这个proteus里 单片机和点阵为什么要这样接线?
51hei截图20191218002557.png
(66.29 KB, 下载次数: 21)
下载附件
2019-12-18 00:27 上传
程序#include<reg51.h> //51系列单片机头文件
#defineuchar unsigned char //宏定义
#defineuint unsigned int //宏定义
/******************************************************
基础定义
*******************************************************/
ucharm=0,n=0;
ucharo,p,d;
uchartime=0;
ucharcode table[]={0x01,0x04,0x08,0x02,0x40,0x10,0x80,0x20};
/******************************************************
数码显示数据定义
*******************************************************/
ucharcode taba[]={
0xff,0xef,0xef,0xef,0xab,0xc7,0xef,0xff}; //编码定义↓
ucharcode tab1[]={
0xff,0xef,0xcf,0xef,0xef,0xef,0xef,0xc7}; //编码定义1
ucharcode tab2[]={
0xff,0xc7,0xbb,0xfb,0xf7,0xcf,0xbf,0x83}; //编码定义2
ucharcode tab3[]={
0xff,0xc7,0xbb,0xfb,0xe7,0xfb,0xbb,0xc7}; //编码定义3
ucharcode tab4[]={
0xff,0xf7,0xe7,0xd7,0xb7,0xb7,0x83,0xf7}; //编码定义4
ucharcode tab5[]={
0xff,0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7}; //编码定义5
ucharcode tab6[]={
0xff,0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7}; //编码定义6
/******************************************************
延时
*******************************************************/
voiddelay(uchar n) //延时子函数
{
uchar i,j;
for(i=n;i>0;i--)
{
for(j=255;j>0;j--);
}
}
/********************************************************************
* 名称 : ucharChangeFor(uchar dat)
* 功能 : 交换一个字节位的位置,用于数码管显示
* 输入 : 需要改变的数
* 输出 : 改变后的数
***********************************************************************/
#defineLED_a 4 //数码管段选的a段接在段选IO口的第0位
#defineLED_b 3
#defineLED_c 1
#defineLED_d 5
#defineLED_e 0
#defineLED_f 6
#defineLED_g 7
#defineLED_dp 2
ucharChangeFor(uchar dat)
{
uchar temp=0;
if(dat&0x01) //判断数据的第一位是否为1
temp|=0x01<<LED_a;//如果为1,放到控制数码管a段的位置
if(dat&0x02)
temp|=0x01<<LED_b;
if(dat&0x04)
temp|=0x01<<LED_c;
if(dat&0x08)
temp|=0x01<<LED_d;
if(dat&0x10)
temp|=0x01<<LED_e;
if(dat&0x20)
temp|=0x01<<LED_f;
if(dat&0x40)
temp|=0x01<<LED_g;
if(dat&0x80)
temp|=0x01<<LED_dp;
return temp;
}
/******************************************************
T/C0中断服务程序入口
*******************************************************/
timer0()interrupt 1 using 1 //定时器0工作方式1
{
TH0 = (65536-50000)/256; //赋初值
TL0 = (65536-50000)%256; //赋初值
if(o>p)//if语句一般处理两个分支,处理多个分支用if-else-if结构
{
d=1;
}
else if(o<p)
{
d=2;
}
else
{
d=0;
}
time++;
if(time==1)
{
n=~(1<<(p+1));
}
else if(time==5)
{
if(d==0)
{
n=~(1<<(p+1));
}
else if(d==1)
{
p++;
n=0xfe;
}
else if(d==2)
{
p--;
n=0xfd;
}
}
else if(time==20)
{
time = 0;
}
}
/******************************************************
定时器T/C0初始化
*******************************************************/
voidcom_initialize(void) //定时器初始化
{
TMOD = 0x01;//设定定时器0为工作方式1
TH0 = (65536-50000)/256; //装初值
TL0 = (65536-50000)%256; //装初值
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
}
/******************************************************
主函数
*******************************************************/
voidmain() //主函数
{
uchar i=0,j=0,k=0;
uchar tmp=0;
uchar om=0;
d=0;
m=0;
o=1;
p=1;
n=0xff;
com_initialize();
while(1) //主循环
{
for(i=0;i<8;i++)
{
P1=0xff;
P0=table[ i]; //[ i]刷新
if(++k==50) //延时
{
k=0;
}
m=P1; //记录按键
if(m != 0xff && d==0&& m!=om)
{
om=m;
switch(m) //开关语句
{
case 0xfb:
tmp=1;break;
case 0xf7:
tmp=2;break;
case 0xef:
tmp=3;break;
case0xdf:
tmp=4;break;
case 0xbf:
tmp=5;break;
case 0x7f:
tmp=6;break;
default:
tmp=o;break;
}
if(o!=tmp)
{
p=o;
o=tmp;
time=0;
}
n=m;
}
if(n==0xfe) //识别按键值
{
if(k==0)
j=++j%8;
P2=ChangeFor(taba[7-(i+j)%8]);
}
else if(n==0xfd)
{
if(k==0)
{
if(j>0)
j--;
else
j=7;
}
P2=ChangeFor(taba[(i+j)%8]);
}
else if(n==0xfb)
{
P2=ChangeFor(tab1[ i]);
}
elseif(n==0xf7)
{
P2=ChangeFor(tab2[ i]);
}
else if(n==0xef)
{
P2=ChangeFor(tab3[ i]);
}
else if(n==0xdf)
{
P2=ChangeFor(tab4[ i]);
}
else if(n==0xbf)
{
P2=ChangeFor(tab5[ i]);
}
else if(n==0x7f)
{
P2=ChangeFor(tab6[ i]);
}
delay(5);
}
}
}
复制代码
作者:
man1234567
时间:
2019-12-19 21:56
16点阵8横8纵,分别各接一P口(0-7)。话说电灯2根线并成一根会省线,但灯不会亮。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1