各位大神:新年好! 最近做了一個溫度報警器,數碼管為3位的共陰數碼管。在全顯時顯示正常的,在動態顯示時就會出現筆畫暗淡不清楚的現象。看了一下論壇,感覺應該是程序中的消隱沒有處理好,因個人能力有限,程序基本上都是摘錄論壇各路大神的現有程序修改的。希望各位大神能幫忙看一下程序看看是否程序有問題,謝謝!
- /***********四位共陰數碼管驅動程序************/
- //stc15w單片機
- //1在主程序前加上初始化init();程序
- //2硬件連接變動時需修改下面的參數
- sbit H1 = P1^0;//設置第1位數碼管陰極連接的I/O口
- sbit H2 = P1^1;//設置第2位數碼管陰極連接的I/O口
- sbit H3 = P1^2;//設置第3位數碼管陰極連接的I/O口
- //sbit H4 = P1^5;//設置第4位數碼管陰極連接的I/O口
- sbit a = P3^5;
- sbit b = P3^4;
- sbit c = P3^3;
- sbit d = P3^2;
- sbit e = P2^1;
- sbit f = P2^0;
- sbit g = P3^7;
- sbit dp = P3^6;
- #define P1M0SET 0x00 //設置I/O口工作方式//00000000(左到右,高到低位)
- #define P1M1SET 0x00 //設置I/O口工作方式//00000000
- #define P3M0SET 0xff //設置I/O口工作方式//11111111
- #define P3M1SET 0x00 //設置I/O口工作方式//00000000
- #define P2M0SET 0xff //設置IO口工作方式11111111
- #define P2M1SET 0x00 //設置IO口工作方式00000000
- /*****以上定義需要根據實際硬件情況更改******/
- data unsigned char PWM;//顯示亮度
- #define light 9 //設置LED顯示的亮度(值域:1~9)
- #define DELAY_L 12 //設置每一個點顯示的時間長度(1~20)
- /********* 延時函數 ***************/
- void delay (unsigned int a){ // 用于點掃描的延時
- unsigned int i;
- while( a-- != 0){
- for(i = 0; i < DELAY_L; i++);
- }
- }
- /*********************************************************************************************/
- unsigned char code disdata[]={
- 0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,
- 0x71,0x40};//0-9,A-F,-
- //數碼管:正向位置;共YIN極;正向連接
- void dis_off (void)
- {
- P3 = ~P3M0SET; //關所有顯示
- P2 = ~P2M0SET;
- H1=H2=H3=1;//P1 = ~P1M0SET;
- delay(10-PWM);
- }
- /*********************************************************************************************/
- void displayHH1 (unsigned char q){ //第1位數碼管顯示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H1 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H1 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H1 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H1 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H1 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H1 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H1 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H1 = 0;dp = 1;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH2 (unsigned char q){ //第2位數碼管顯示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H2 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H2 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H2 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H2 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H2 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H2 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H2 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H2 = 0;dp = 1;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH3 (unsigned char q){ //第3位數碼管顯示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H3 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H3 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H3 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H3 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H3 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H3 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H3 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H3 = 0;dp = 1;}delay(PWM);dis_off();
- }
- void diplay_data (unsigned char l,unsigned char q){
- switch (l){//顯示的數碼管位置
- case 1://
- displayHH1(q); //將顯示數據送入
- break;//
- case 2://
- displayHH2(q); //將顯示數據送入
- break;//
- case 3://
- displayHH3(q); //將顯示數據送入
- break;//
- // case 4://
- // displayHH4(q); //將顯示數據送入
- // break;//
-
- }
- }
- /*******************************************/
- void init (void){
- P3M1=P3M1SET;
- P3M0=P3M0SET;
- P1M0=P1M0SET;
- P1M1=P1M1SET;
- dis_off();
- PWM = light;}
- /******************顯示程序*************************
- i=t/100;
- diplay_data (1,disdata[i]);
- i=t%100/10;
- diplay_data (2,disdata[i]+0x80);
- i=t%100%10;
- diplay_data (3,disdata[i]); */
復制代碼
篇幅限制,具體全部顯示代碼見附件。
4LED_YIN.rar
(1.25 KB, 下載次數: 7)
2023-2-7 14:37 上傳
點擊文件名下載附件
|