如下的單片機程序,p3.4和p1.0分別輸出一串數據,定義兩個函數void LED24show(long byteData)和void LED16show(int byteData)用于驅動數碼管和LED,當 執行 LED24show(0x7fffff); LED16show(0x0202);時數碼管應當顯示00,24個LED小燈應當只有一個亮,但是仿真的結果如下,沒有實現要求顯示的部分,請大神幫忙看一下。
51hei截圖20200504214659.png (138.28 KB, 下載次數: 19)
下載附件
2020-5-4 21:47 上傳
#include<reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
void delayms(unsigned int xms);
//****************************************74LS595端口定義
sbit SER1 = P3^4; //p3.4腳控制串行數據輸入
sbit SCK1 = P3^6; //串行輸入時鐘
sbit RCK1 = P3^5; //存儲寄存器時鐘
sbit SER2 = P1^0; //p1.0腳控制串行數據輸入
sbit SCK2 = P1^2; //串行輸入時鐘
sbit RCK2 = P1^1; //存儲寄存器時鐘
sbit key=P1^7;
sbit run=P0^0;
//*********************************************************************
void LED24show(long byteData)
{
char i=0;
for(i=0;i<24;i++)
{
SER1 = byteData<<23; //送出23位數據
byteData= byteData>>1;
SCK1 = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
_nop_();
_nop_();
SCK1 = 1; //變為低電平,為下次準備
}
//位移寄存器數據準備完畢,轉移到存儲寄存器
RCK1 = 0; //上升沿,讓存儲寄存器時鐘變為高電平,并延時2個時鐘周期
_nop_();
_nop_();
RCK1 = 1;
}
void LED16show(int byteData)
{
char i =0;
for(i=0;i<16;i++)
{
SER2 = byteData>>15; //送出15位數據
byteData= byteData<<1;
SCK2 = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
_nop_();
_nop_();
SCK2 = 1; //變為低電平,為下次準備
}
//位移寄存器數據準備完畢,轉移到存儲寄存器
RCK2 = 0; //上升沿,讓存儲寄存器時鐘變為高電平,并延時2個時鐘周期
_nop_();
_nop_();
RCK2 = 1;
}
void main()
{
while(1)
{
LED24show(0x7fffff);
delayms(100);
LED16show(0x0202);
}
}
void delayms(unsigned int xms) //延時函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
|