這幾天做了個學長交代的任務,讓數碼管顯示20190520,點陣顯示“電”字,
并且要用按鍵控制點陣的移動,想了幾天,終于想出來了,和大家分享一下,
希望對大家有幫助,話不多說,上圖,
WIN_20190726_20_03_15_Pro.jpg (198.68 KB, 下載次數: 47)
下載附件
2019-7-26 20:10 上傳
新建文件夾 (3).rar
(1.24 MB, 下載次數: 25)
2019-7-26 20:14 上傳
點擊文件名下載附件
內含我用的板子的原理圖pdf 下載積分: 黑幣 -5
代碼如下
我用的板子的原理圖在附件中
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit k1=P3^4;
- sbit k2=P3^5;
- sbit k3=P3^6;
- sbit k4=P3^7;
- sbit duan=P1^7;
- sbit wei=P1^6;
- sbit SER=P1^0; //數據輸入端
- sbit SH=P1^2; //收到上升沿鎖存數據
- sbit ST=P1^1; //收到上升沿,輸出數據
- int z1[]={0xef,0x83,0xab,0x83,0xab,0x83,0x6f,0x0f};//點陣橫向接收的數據
- int x[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //點陣縱向接收的數據</div><div> int j=0;
- void delayms(int i) //延時函數
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<40;k++);
- }</div><div> void shu(void) //數碼管顯示20190520
- {
- int i=0;
- char d[]={0x3f,0x5b,0x6d,0x3f,0x6f,0x06,0x3f,0x5b};
- char w[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- while(1)
- {
- for(i=0;i<8;i++)
- {
- duan=1; // *****
- P0=0x00; // 消
- // delayms(1);// ****
- duan=0; // 影
- P0=0xff; //消影
- wei=1;
- P0=w[i];
- wei=0;
- P0=0x00; //消影
- // delayms(1);
- duan=1;
- P0=d[i];
- duan=0;
- delayms(1);
- P0=0x00;
- //消影
-
- }
- wei=1; //***********
- P0=0xff; //*****
- wei=0; //解決點陣數碼管同時顯示有一個數更亮
- duan=1; //
- P0=0x00; //
- duan=0; //
- break;
- }
- }
- void qidongdianzhen(int i)
- {
- int Bit;
- SH=1;
- for(Bit=0;Bit<8;Bit++)
- {
-
- if(i&0x80)
- SER=1;
- else
- SER=0;
- i=i<<1;
- SH=0;
- _nop_();_nop_();
- SH=1;
-
- }
- ST=0;
- _nop_();
- _nop_();
- ST=1;</div><div> }
- void shangyi()
- {
- int temp,i;
- temp=z1[0];
- for(i=0;i<7;i++)
- {
- z1[i]=z1[i+1] ; //調換數組內元素的順序來改變點陣顯示
- }
- z1[7]=temp;
- }
- void xiayi()
- {
- int temp,i;
- temp=z1[7];
- for(i=0;i<7;i++)
- {
- z1[7-i]=z1[6-i]; //調換數組內元素的順序來改變點陣顯示
- }
- z1[0]=temp;</div><div>
- }
- void zuoyi()
- {
- int i;
- for(i=0;i<8;i++)
- {
- z1[i]=_cror_(z1[i],1); //將數組內每一個數的值按位右移
- } }
- void youyi()
- {
- int i;
- for(i=0;i<8;i++)
- {
- z1[i]=_crol_(z1[i],1); //將數組內每一個數的值按位左移
- }
- }
- void dian()
- {
- int i;
- for(i=0;i<8;i++)
- {
- P0=z1[i];
- qidongdianzhen(x[i]);
- delayms(1); //改變亮和滅的比列來提高亮度
- qidongdianzhen(0x00); //點陣消影
-
- }
- }
-
-
- void main()
- {
- int i; //先關閉數碼管
- duan=1;
- P0=0x00;
- duan=0;
- wei=1;
- P0=0xff;
- wei=0;
- while(1)
- {
- shu();
- if (k3==0)
- {
- j=0;
- shangyi();
- while(j<10) //主要起延時作用
- {
- for(i=0;i<8;i++)
- {
- P0=z1[i];
- qidongdianzhen(x[i]);
- delayms(1); //改變亮和滅的比列來提高亮度
- qidongdianzhen(0x00);
-
-
- }
- shu();
- j++;
- }
-
- }
- if (k4==0)
- {
- j=0;
- xiayi();
- while(j<10) //主要起延時作用
- {
- for(i=0;i<8;i++)
- {
- P0=z1[i];
- qidongdianzhen(x[i]);
- delayms(1); //改變亮和滅的比列來提高亮度
- qidongdianzhen(0x00);
-
-
- }
- shu();
- j++;
- }
-
- }
- if (k1==0)
- {
- j=0;
- zuoyi();
- while(j<10) //主要起延時作用
- {
- for(i=0;i<8;i++)
- {
- P0=z1[i];
- qidongdianzhen(x[i]);
- delayms(1); //改變亮和滅的比列來提高亮度
- qidongdianzhen(0x00);
-
-
- }
- shu();
- j++;
- }
-
- }
- if (k2==0)
- {
- j=0;
- youyi();
- while(j<10) //主要起延時作用
- {
- for(i=0;i<8;i++)
- {
- P0=z1[i];
- qidongdianzhen(x[i]);
- delayms(1); //改變亮和滅的比列來提高亮度
- qidongdianzhen(0x00);
-
-
- }
- shu();
- j++;
- }
-
- } dian(); }
-
- }
復制代碼
|