在595用数码管显示。
/* 项目:74HC574(锁存器)、74HC165(输入扩展)-74HC595(输出扩展)测试程序
完成时间:2011.1.26日
程序员:yuan
MCU:STC89C516RD
时钟频率:12MHz
说明:能用165输入在595显示输出 */
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIN =P1^0;//74HC595数据线
sbit Rclk=P1^1;//74HC595锁存口,上升沿有效
sbit SCLK=P1^2; //74HC595时钟线,上升沿有效
sbit cp=P2^7; //74HC574片选
sbit LD=P1^3; //移位
sbit CLK=P1^4; //时钟输入
sbit Q7=P1^5; //串行输出
uint sum;
//uint w165(uint);
uchar tcount;//定时器计数值和汉字移动的次数
void delay(uint del)
{
while(--del);
}
void init_tx()//定时移动字
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
}
void wri_dat(uchar dat) //写1byte数据
{
uchar i; //74HC595写函数
DIN=1;
for(i=0;i<8;i++)
{
if(dat&0x01)
DIN=1;//低位在前
else DIN=0;
SCLK=0;
SCLK=1;
dat>>=1;
}
}
/*void display1() //测试74HC574显示函数
{
P0=0x00;
P0=0x3f;
cp=0;
cp=1;
delay1(400);
P0=0x06;
cp=0;
cp=1;
delay1(400);
P0=0x5b;
cp=0;
cp=1;
delay1(400);
P0=0x4f;
cp=0;
cp=1;
delay1(400);
P0=0x66;
cp=0;
cp=1;
delay1(400);
P0=0x6d;
cp=0;
cp=1;
delay1(400);
P0=0x7d;
cp=0;
cp=1;
delay1(400);
P0=0x07;
cp=0;
cp=1;
delay1(400);
P0=0x7f;
cp=0;
cp=1;
delay1(400);
P0=0x6f;
cp=0;
cp=1;
delay1(400);
P0=0x77;
cp=0;
cp=1;
delay1(400);
P0=0x7c;
cp=0;
cp=1;
delay1(400);
P0=0x39;
cp=0;
cp=1;
delay1(400);
P0=0x5e;
cp=0;
cp=1;
delay1(400);
P0=0x79;
cp=0;
cp=1;
delay1(400);
P0=0x71;
cp=0;
cp=1;
delay1(400);
}
void display()
{
if(tcount==10)
{
tcount=0;
i++;
if(i==17)
i=0;
}
wri_dat(tabl[i]);
}
void display()
{
//char j;
j=w165(x);
//if(tcount==20)
// {
// tcount=0;
// wri_dat();
// }
if(j==0xff)
P0=0x3f;
cp=0;
cp=1;
// wri_dat(0xfc);
delay(10000);
if(j==0xfe)
P0=0x06;
cp=0;
cp=1;
// wri_dat(0x60);
delay(10000);
if(j==0xfd)
P0=0x5b;
cp=0;
cp=1;
// wri_dat(0xda);
delay(10000);
if(j==0xfb)
P0=0x4f;
cp=0;
cp=1;
// wri_dat(0xf2);
delay(10000);
if(j==0xf7)
P0=0x66;
cp=0;
cp=1;
// wri_dat(0x66);
delay(10000);
if(j==0xef)
P0=0x6d;
cp=0;
cp=1;
// wri_dat(0xb6);
delay(10000);
if(j==0xdf)
P0=0x7d;
cp=0;
cp=1;
// wri_dat(0xbe);
delay(10000);
if(j==0xbf)
P0=0x07;
cp=0;
cp=1;
// wri_dat(0xe0);
delay(10000);
if(j==0x7f)
P0=0x7f;
cp=0;
cp=1;
// wri_dat(0xfe);
delay(10000);
//wri_dat(tabl[i]);
} */
void w165() //74HC165写函数
{
uchar j,i;
CLK=1;
LD=0;
LD=1;
for(i=0;i<8;i++)
{
sum<<=1;
if(Q7)sum|=1;
CLK=0;
CLK=1;
}
j=sum;
delay(10000);
if(j==0xfe) //以下是检测165的输入在595上显示函数
{
wri_dat(0x60); //也就是单片机的扩展
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xfd)
{
wri_dat(0xda);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xfb)
{
wri_dat(0xf2);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xf7)
{
wri_dat(0x66);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xef)
{
wri_dat(0xb6);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xdf)
{
wri_dat(0xbe);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0xbf)
{
wri_dat(0xe0);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
if(j==0x7f)
{
wri_dat(0xfe);
Rclk=0;
delay(1);
Rclk=1; //写完一行显示一次
delay(10000);
}
}
void main()
{
init_tx();
while(1)
{
w165();
}
}
void timer0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tcount++;
//if(tcount>12){tcount=0;move++;if(move>9)move=0;}
//数组有多少个行数,move的值相应改变
} |