代碼+仿真
單片機源程序如下:- #include <REGX51.H>
- sbit SH_CP = P0^0;// 移位寄存器的時鐘控制
- sbit DS = P0^1; // 數據傳輸線
- sbit ST_CP = P0^2;//數據輸出寄存器的時鐘控制
- unsigned int a[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- };
- //延時函數
- void delayms(unsigned int m)
- {
- unsigned int i, j;
- for(i=0; i<m; i++)
- for(j=0; j<100; j++);
- }
- /****************************************************************
- 第一步:取出最高位 temp = value & 0x80; //取最高位的值
- 第二步:判斷最高位是0還是1 if(temp)
- 第三步:向595發送最高位的值 DS = 1或0; 向595的移位寄存器發送一個1或0
- 第四步:向移位寄存器中發送數據,將數據產生移位
- 只需給移位寄存器上升沿工作時鐘 SH_CP = 0; SH_CP = 1;
- 第五步:將要傳輸的數據進行移位,目的是將最高位去掉,
- 將次高位變為最高位 value = value <<1;/
- 第六步:一個字節有8位數據,每次只能發送一位數據,
- 所以我們發送8次,用for循環
- 第七步:八個數據全部發送到移位寄存器之后,就要將移位寄存器的數據發送到數據輸出寄存器中,
- 只需要給數據輸出寄存器一個上升沿工作時鐘即可ST_CP = 0; ST_CP = 1;
- ***************************************************************/
- void hc595(unsigned int value)
- {
- bit temp;//位變量,temp的值為0或者1
- unsigned char i;
- for(i=0; i<8; i++)
- {
- temp = value &0x80; // 取value的最高位 0000 0001 &1000 0000
- if(temp == 1) DS = 1;//如果最高位為1,那么就向595發送一個1
- else DS =0; //否則就向595發送一個0
- SH_CP = 0;
- SH_CP = 1;//移位寄存器產生一個上升沿,將數據發送到移位寄存器中,使移位寄存器的數據產生移位
- value = value <<1;//將最高位去掉,將此高位變成最高位,為下一次發送最高位做準備
- }
- ST_CP = 0;
- ST_CP = 1;//產生一個上升沿,將移位寄存器的數據發送給數據輸出寄存器
- }
- /*************************
- 顯示函數
- 動態掃描:先寫位碼,再寫段碼,最后補一個延時
- */
- void display(void)
- {
- unsigned char n,x;
- for(n=0; n<100; n++)
- {
- for(x=0; x<50; x++)// 當前數字刷新的次數,起到延時的作用 每一消耗的時間20ms x 50 =1s
- {
- P3 = 0x01;//0000 0001 個位工作 位碼
- hc595(a[n%10]);//顯示0
- delayms(10);
- P3 = 0x02;//0000 0010 十位工作,位碼
- hc595(a[n/10]);//顯示1
- delayms(10);
- }
- }
-
- }
- void main(void)
- {
- while(1)
- {
- display();
- }
- }
復制代碼
下載:
595-雙數碼--0~99.rar
(41 KB, 下載次數: 62)
2020-8-25 15:28 上傳
點擊文件名下載附件
|