|
基于吳堅鴻與祁緒電子程序修改
單片機(jī)源程序如下:
- #include "REG52.H"
- #define const_voice_short 40 //蜂鳴器短叫的持續(xù)時間
- #define const_key_time1 20 //按鍵去抖動延時的時間
- #define const_key_time2 20 //按鍵去抖動延時的時間
- #define const_key_time3 20 //按鍵去抖動延時的時間
- void initial_myself();
- void initial_peripheral();
- void delay_short(unsigned int uiDelayshort);
- void delay_long(unsigned int uiDelaylong);
- void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
- void display_drive();//顯示數(shù)碼管字模的驅(qū)動函數(shù)
- void display_service();//顯示的窗口菜單服務(wù)程序
- void T0_time();//定時中斷函數(shù)
- void key_service();//按鍵服務(wù)的應(yīng)用程序
- void key_scan();//按鍵掃描函數(shù) 放在定時中斷里
- sbit key_sr1=P1^0;
- sbit key_sr2=P1^1;
- sbit key_sr3=P1^2;
- sbit beep_dr=P2^7;//蜂鳴器的驅(qū)動 IO 口
- sbit led_dr=P3^5;//作為中途暫停指示燈 亮的時候表示中途暫停
- sbit dig_hc595_sh_dr=P2^3; //數(shù)碼管的 74HC595 程序
- sbit dig_hc595_st_dr=P2^4;
- sbit dig_hc595_ds_dr=P2^5;
- sbit hc595_sh_dr=P2^0;//LED 燈的 74HC595 程序
- sbit hc595_st_dr=P2^1;
- sbit hc595_ds_dr=P2^2;
- unsigned char ucKeySec=0;//被觸發(fā)的按鍵編號
- unsigned int uiKeyTimeCnt1=0;//按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock1=0;//按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned int uiKeyTimeCnt2=0;//按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock2=0;//按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned int uiKeyTimeCnt3=0;//按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock3=0;//按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned int uiVoiceCnt=0;//蜂鳴器鳴叫的持續(xù)時間計數(shù)器
- unsigned char ucDigShowTemp=0;//臨時中間變量
- unsigned char ucDisplayDriveStep=1;//動態(tài)掃描數(shù)碼管的步驟變量
- unsigned char ucWd1Update=1;//窗口 1 更新顯示標(biāo)志
- unsigned char ucWd2Update=0;//窗口 2 更新顯示標(biāo)志
- unsigned char ucWd3Update=0;//窗口 3 更新顯示標(biāo)志
- unsigned char ucWd4Update=0;//窗口 4 更新顯示標(biāo)志
- unsigned char ucWd=1;//本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
- unsigned int uiSetData1=999;//本程序中需要被設(shè)置的參數(shù) 1
- unsigned int uiSetData2=99;//本程序中需要被設(shè)置的參數(shù) 2
- unsigned int uiSetData3=9;//本程序中需要被設(shè)置的參數(shù) 3
- unsigned int uiSetData4=1;//本程序中需要被設(shè)置的參數(shù) 4
- //根據(jù)原理圖得出的共陰數(shù)碼管字模表
- code unsigned char dig_table[]=
- {
- 0x3f, //0 序號 0
- 0x06, //1 序號 1
- 0x5b, //2 序號 2
- 0x4f, //3 序號 3
- 0x66, //4 序號 4
- 0x6d, //5 序號 5
- 0x7d, //6 序號 6
- 0x07, //7 序號 7
- 0x7f, //8 序號 8
- 0x6f, //9 序號 9
- 0x00, //無 序號 10
- 0x40, //- 序號 11
- 0x73, //P 序號 12
- };
- code unsigned char dig[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};
- unsigned char ucDigDot[8];//要顯示的8個小數(shù)點(diǎn)
- unsigned char ucDigShow[8];//要顯示的8個數(shù)字
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service();//按鍵服務(wù)的應(yīng)用程序
- display_service();//顯示的窗口菜單服務(wù)程序
- }
- }
- void display_service() //顯示的窗口菜單服務(wù)程序
- { unsigned char i;
- unsigned int temp;
- switch(ucWd) //本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
- {
- case 1: //顯示 P--1 窗口的數(shù)據(jù)
- if(ucWd1Update==1) //窗口 1 要全部更新顯示
- {
- ucWd1Update=0;//及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucDigShow[7]=12;//第 8 位數(shù)碼管顯示 P
- ucDigShow[6]=11;//第 7 位數(shù)碼管顯示-
- ucDigShow[5]=1;//第 6 位數(shù)碼管顯示 1
- ucDigShow[4]=10;//第 5 位數(shù)碼管顯示無
- temp=uiSetData1;
- for(i=0;i<4;i++)//分解數(shù)字
- {
- ucDigShow[i]=temp%10;
- temp=temp/10;
- }
- for(i=3;i>=1;i--) //高位為0不顯示
- {
- if( ucDigShow[i]==0)
- ucDigShow[i]=10;
- else break;
- }
- } break;
- case 2: //顯示 P--2 窗口的數(shù)據(jù)
- if(ucWd2Update==1) //窗口 2 要全部更新顯示
- {
- ucWd2Update=0;//及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucDigShow[7]=12;//第 8 位數(shù)碼管顯示 P
- ucDigShow[6]=11;//第 7 位數(shù)碼管顯示-
- ucDigShow[5]=2;//第 6 位數(shù)碼管顯示 1
- ucDigShow[4]=10;//第 5 位數(shù)碼管顯示無
- temp=uiSetData2;
- for(i=0;i<4;i++)//分解數(shù)字
- {
- ucDigShow[i]=temp%10;
- temp=temp/10;
- }
- for(i=3;i>=1;i--) //高位為0不顯示
- {
- if( ucDigShow[i]==0)
- ucDigShow[i]=10;
- else
- break;
- }
-
- }break;
- case 3: //顯示 P--3 窗口的數(shù)據(jù)
- if(ucWd3Update==1) //窗口 3 要全部更新顯示
- {
- ucWd3Update=0;//及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucDigShow[7]=12;//第 8 位數(shù)碼管顯示 P
- ucDigShow[6]=11;//第 7 位數(shù)碼管顯示-
- ucDigShow[5]=3;//第 6 位數(shù)碼管顯示 1
- ucDigShow[4]=10;//第 5 位數(shù)碼管顯示無
- temp=uiSetData3;
- for(i=0;i<4;i++)
- {
- ucDigShow[i]=temp%10;
- temp=temp/10;
- }
- if(uiSetData3<1000)
- {
- ucDigShow[3]=10;
- if(uiSetData3<100)
- {
- ucDigShow[2]=10;
- if(uiSetData3<10)
- {
- ucDigShow[1]=10;
- }
- }
- }
- }break;
- case 4: //顯示 P--4 窗口的數(shù)據(jù)
- if(ucWd4Update==1) //窗口 4 要全部更新顯示
- {
- ucWd4Update=0;//及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucDigShow[7]=12;//第 8 位數(shù)碼管顯示 P
- ucDigShow[6]=11;//第 7 位數(shù)碼管顯示-
- ucDigShow[5]=4;//第 6 位數(shù)碼管顯示 1
- ucDigShow[4]=10;//第 5 位數(shù)碼管顯示無
- temp=uiSetData4;
- for(i=0;i<4;i++)
- {
- ucDigShow[i]=temp%10;
- temp=temp/10;
- }
- if(uiSetData4<1000)
- {
- ucDigShow[3]=10;
- if(uiSetData4<100)
- {
- ucDigShow[2]=10;
- if(uiSetData4<10)
- {
- ucDigShow[1]=10;
- }}}
-
- }break;
- }
- }
- void key_scan()//按鍵掃描函數(shù) 放在定時中斷里
- {
- if(key_sr1==1)//IO 是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
- {
- ucKeyLock1=0;//按鍵自鎖標(biāo)志清零
- uiKeyTimeCnt1=0;//按鍵去抖動延時計數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
- } else if(ucKeyLock1==0)//有按鍵按下,且是第一次被按下
- {
- uiKeyTimeCnt1++;//累加定時中斷次數(shù)
- if(uiKeyTimeCnt1>const_key_time1)
- {
- uiKeyTimeCnt1=0;
- ucKeyLock1=1;//自鎖按鍵置位,避免一直觸發(fā)
- ucKeySec=1;//觸發(fā) 1 號鍵
- }
- }
- if(key_sr2==1)//IO 是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
- {
- ucKeyLock2=0;//按鍵自鎖標(biāo)志清零
- uiKeyTimeCnt2=0;//按鍵去抖動延時計數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
- } else if(ucKeyLock2==0)//有按鍵按下,且是第一次被按下
- {
- uiKeyTimeCnt2++;//累加定時中斷次數(shù)
- if(uiKeyTimeCnt2>const_key_time2)
- {
- uiKeyTimeCnt2=0;
- ucKeyLock2=1;//自鎖按鍵置位,避免一直觸發(fā)
- ucKeySec=2;//觸發(fā) 2 號鍵
- }
- }
- if(key_sr3==1)//IO 是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
- {
- ucKeyLock3=0;//按鍵自鎖標(biāo)志清零
- uiKeyTimeCnt3=0;//按鍵去抖動延時計數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
- } else if(ucKeyLock3==0)//有按鍵按下,且是第一次被按下
- {
- uiKeyTimeCnt3++;//累加定時中斷次數(shù)
- if(uiKeyTimeCnt3>const_key_time3)
- {
- uiKeyTimeCnt3=0;
- ucKeyLock3=1;//自鎖按鍵置位,避免一直觸發(fā)
- ucKeySec=3;//觸發(fā) 3 號鍵
- }
- }
- }
- void key_service() //按鍵服務(wù)的應(yīng)用程序
- {
- switch(ucKeySec) //按鍵服務(wù)狀態(tài)切換
- {
- case 1:// 加按鍵 對應(yīng)朱兆祺學(xué)習(xí)板的 S1 鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
- case 1:
- uiSetData1++;
- if(uiSetData1>9999) //最大值是 9999
- {
- uiSetData1=9999;
- }
- ucWd1Update=1;//窗口 1 更新顯示
- break;
- case 2:
- uiSetData2++;
- if(uiSetData2>9999) //最大值是 9999
- {
- uiSetData2=9999;
- }
- ucWd2Update=1;//窗口 2 更新顯示
- break;
- case 3:
- uiSetData3++;
- if(uiSetData3>9999) //最大值是 9999
- {
- uiSetData3=9999;
- }
- ucWd3Update=1;//窗口 3 更新顯示
- break;
- case 4:
- uiSetData4++;
- if(uiSetData4>9999) //最大值是 9999
- {
- uiSetData4=9999;
- }
- ucWd4Update=1;//窗口 4 更新顯示
- break;
- }
- uiVoiceCnt=const_voice_short;//按鍵聲音觸發(fā),滴一聲就停。
- ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
- case 2:// 減按鍵 對應(yīng)朱兆祺學(xué)習(xí)板的 S5 鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
- case 1:
- uiSetData1--;
- if(uiSetData1>9999)
- {
- uiSetData1=0;//最小值是 0
- }
- ucWd1Update=1;//窗口 1 更新顯示
- break;
- case 2:
- uiSetData2--;
- if(uiSetData2>9999)
- {
- uiSetData2=0;//最小值是 0
- }
- ucWd2Update=1;//窗口 2 更新顯示
- break;
- case 3:
- uiSetData3--;
- if(uiSetData3>9999)
- {
- uiSetData3=0;//最小值是 0
- }
- ucWd3Update=1;//窗口 3 更新顯示
- break;
- case 4:
- uiSetData4--;
- if(uiSetData4>9999)
- {
- uiSetData4=0;//最小值是 0
- }
- ucWd4Update=1;//窗口 4 更新顯示
- break;
- }
- uiVoiceCnt=const_voice_short;//按鍵聲音觸發(fā),滴一聲就停
- ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
- case 3:// 切換窗口按鍵
- ucWd++;//切換窗口
- if(ucWd>4)
- {
- ucWd=1;
- }
- switch(ucWd) //在不同的窗口下,在不同的窗口下,更新顯示不同的窗口
- {
- case 1:
- ucWd1Update=1;//窗口 1 更新顯示
-
- break;
- case 2:
- ucWd2Update=1; //窗口 2 更新顯示
- break;
- case 3:
- ucWd3Update=1;//窗口 3 更新顯示
- break;
- case 4:
- ucWd4Update=1;//窗口 4 更新顯示
- break;
- }
- uiVoiceCnt=const_voice_short;//按鍵聲音觸發(fā),滴一聲就停。
- ucKeySec=0;//響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
- }
- }
- void display_drive() //顯示驅(qū)動
- {
- static unsigned char i=0;
- switch(i)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- ucDigShowTemp=dig_table[ucDigShow[i]];
- if(ucDigDot[i]==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//顯示小數(shù)點(diǎn)
- }
- dig_hc595_drive(ucDigShowTemp,dig[i]);
- break;
- }
- i++;
- i=i%8;
- }
- //數(shù)碼管的 74HC595 驅(qū)動函數(shù)
- void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
- {
- unsigned char i;
- unsigned char ucTempData;
- dig_hc595_sh_dr=0;
- dig_hc595_st_dr=0;
- ucTempData=ucDigStatusTemp16_09;//先送高 8 位
- for (i=0;i<8;i++)
- {
- if(ucTempData>=0x80)dig_hc595_ds_dr=1; else dig_hc595_ds_dr=0;
- dig_hc595_sh_dr=0;//SH 引腳的上升沿把數(shù)據(jù)送入寄存器
- delay_short(1);
- dig_hc595_sh_dr=1;
- delay_short(1);
- ucTempData=ucTempData<<1;
- }
- ucTempData=ucDigStatusTemp08_01;//再先送低 8 位
- for (i=0;i<8;i++)
- {
- if(ucTempData>=0x80)dig_hc595_ds_dr=1; else dig_hc595_ds_dr=0;
- dig_hc595_sh_dr=0;//SH 引腳的上升沿把數(shù)據(jù)送入寄存器
- delay_short(1);
- dig_hc595_sh_dr=1;
- delay_short(1);
- ucTempData=ucTempData<<1;
- }
- dig_hc595_st_dr=0;//ST 引腳把兩個寄存器的數(shù)據(jù)更新輸出到 74HC595 的輸出引腳上并且鎖存起來
- delay_short(1);
- dig_hc595_st_dr=1;
- delay_short(1);
- dig_hc595_sh_dr=0;//拉低,抗干擾就增強(qiáng)
- dig_hc595_st_dr=0;
- dig_hc595_ds_dr=0;
- }
-
- void T0_time() interrupt 1
- {
- TF0=0;//清除中斷標(biāo)志
- TR0=0;//關(guān)中斷
- key_scan();//按鍵掃描函數(shù)
- if(uiVoiceCnt!=0)
- {
- uiVoiceCnt--;//每次進(jìn)入定時中斷都自減 1,直到等于零為止。才停止鳴叫
- beep_dr=0;//蜂鳴器是 PNP 三極管控制,低電平就開始鳴叫
- } else
- {
- beep_dr=1;
- }
- display_drive();//數(shù)碼管字模的驅(qū)動函數(shù)
- TH0=0xfe;//重裝初始值(65535-500)=65035=0xfe0b
- TL0=0x0b;
- TR0=1;//開中斷
- }
- void delay_short(unsigned int uiDelayshort)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei附件下載:
029-74HC595菜單顯示高位為零.zip
(435.29 KB, 下載次數(shù): 72)
2021-11-8 10:18 上傳
點(diǎn)擊文件名下載附件
029-595菜單系統(tǒng)高位為0不顯示.pdf
(275.59 KB, 下載次數(shù): 35)
2021-11-8 10:15 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|