|
74HC138和74HC164一起做数码管和按键
[复制链接]
74HC138和74HC164一起做数码管和按键
动态显示做出来有 阴影。那位高手能给修补下。
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void sendchar(char ch);
void display(uchar i,uchar date) ;
sbit DAT = P2^4;
sbit CLK = P2^5;
char code table[20]={ 0xc0,0xf9,0xa4,0xb0, // 0,1,2,3 0,1,2,3
0x99,0x92,0x82,0xf8, // 4,5,6,7 4,5,6,7
0x80,0x90,0x88,0x83, // 8,9,A,B 8,9,10,11
0xc6,0xa1,0x86,0x8e, // C,D,E,F 12,13,14,15
0x91,0xbf,0xc7,0x8c}; // Y,-,L,P 16,17,18,19
char d_kaiji[4]; //显示缓存
char code wei[4]={0xcf,0xef,0xdf,0xff}; //数码管显示控制位
void main()
{
P2=0x00;//初始化必须有
display(0,kaiji[0]);
delay(1000) ;
while(1)
{
display(3,kaiji[0]);
delay(5);
display(2,kaiji[0]);
delay(10);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void sendchar(char ch)/***把代码发送到移位寄存器***/
{
uchar i;
for(i=0;i<8;i++)//8位数据传输完毕后才给数码管显示
{
DAT=ch&0x01; //P2_4=0000000x
/*DAT一直保持该状态,等时钟脉冲触发传递数值*/
CLK=0;// 下面两句制造一个上升沿
CLK=1;
ch>>=1;/*一个seg[]刚好八位,164是串行输入的,分成八位输入*/
DAT=1;
/*DAT=ch&0x01和ch>>=1的功能是一次取出八位二进制ch的每一位赋值给74hc164*/
}
}
void display(uchar i, uchar date)
{
sendchar(date);
P2&=wei[i];
}
|
|