📄 74hc164.c
字号:
/***********************************************************************
*
* 试验74HC164
* 功能:8个数码管上循环显示不同的数字及字母,且每一次只有一位数码亮
* 点亮的顺序是从右到左循环的显示
* 日期:2009-04-08
* 版本:V1.1
************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
char code reserve[3] _at_ 0x3b; //保留0x3b开始的3个字节【ICE52】
sbit Led = P2^0;
sbit Ls164_Dat = P2^2;
sbit Ls164_Clk = P2^1;
sbit a0=ACC^0;
//共阴极数码管码表
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};//0-.
//共阳极数码管码表
//uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};//0-.
void Delay_Ls164(uint i)
{
uint j;
for(;i>0;i--)
for(j=13000;j>0;j--)
{;}
}
void SendByte(uchar Byte)//网上找到的1,测试OK ,【产生的代码是CODE:126 】
{
uchar i,Date;
i=8;
do
{
Date = Byte & 0x80; //低7位清0
Byte <<= 1; //向左移一位
Ls164_Clk=0;
Ls164_Dat=Date;
//Ls164_Clk=0;
Ls164_Clk=1; //上升沿脉冲触发移位
}
while(--i != 0);
}
/*void SendByte(uchar Byte) //网上找到的2,测试OK ,【产生的代码是CODE:129 】
{
uchar num,t;
num=tab[Byte];
for(t=0;t<8;t++)
{
Ls164_Clk=0;
Ls164_Dat = num & 0x80;
//Ls164_Dat = num & 0x01; //如果是共阳,用此行代码
Ls164_Clk=1; //上升沿脉冲触发移位
num <<= 1;
//num >>= 1; //如果是共阳,用此行代码
}
} */
/*void SendByte(uchar Byte) //唐 ,会显示,经修改,测试ok【产生的代码是CODE:131 】
{
uchar num,t;
num=tab[Byte];
for(t=0;t<8;t++)
{
if(num&0x80) Ls164_Dat=1;
// if(num&0x01) Ls164_Dat=1;//如果是共阳,用此行代码
else Ls164_Dat=0;
num <<= 1;
//num >>= 1; //如果是共阳,用此行代码
Ls164_Clk=0;
Ls164_Clk=1; //上升沿脉冲触发移位
}
} */
/*void SendByte(uchar Byte) //维纳,测试ok ,【产生的代码是CODE:129 】
{
uchar i;
for(i=0;i<8;i++)
{
if(Byte&0x80) //从数据的高位开始送
// if(Byte&0x01) //如果是共阳,用此行代码
Ls164_Dat=1;
else
Ls164_Dat=0;
Byte <<=1; //向左移一位
//Byte >>=1; //如果是共阳,用此行代码
Ls164_Clk=0; //下降沿将数据写入164
// _nop_();
Ls164_Clk=1; //上升沿脉冲触发移位
}
} */
void main()
{
uchar h,Shift;
Shift=0xef; //位扫描初值
Led=0;
Ls164_Clk=0;
P0=0xff; //关闭显示,数码管位
SendByte(0x00); //关闭数码管显示【共阴极】
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
while(1)
{
for(h=0;h<8;h++) //循环字形表里面的7个数
{
SendByte(tab[h]); //适用维纳函数,网上找到的1,送段码
P0 = Shift; //送位码
Shift = _crol_ (Shift,1); //左移一位,修改位码
// SendByte(h); //适用网上找到的2 , 唐
Delay_Ls164(15);
}
h=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -