希望大家不吝賜教,同時也希望自己的程序能幫助其他人。
數碼管流水燈程序.zip
(24.05 KB, 下載次數: 18)
2017-7-6 19:23 上傳
點擊文件名下載附件
數碼管流水燈程序 下載積分: 黑幣 -5
- /*
- *******************************************************************************
- * 本程序同時實現數碼管計時和流水燈同時運行的效果。主要采用的定時器的1ms刷新功能,讓眼睛產生的假象。
- *******************************************************************************
- */
- #include<reg52.h>
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
- unsigned char T0RH = 0;
- unsigned char T0RL = 0;
- unsigned int flag1s=0;
- unsigned long sum = 0;
- void ConfigTime(unsigned int ms); //定時函數
- void ShowNumber(unsigned long sum); //數碼管顯示數字函數
- unsigned char LedBuff[7]={0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //數碼管+獨立流水燈顯示緩沖區
- unsigned char LedChar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //數碼管顯示字符轉換表
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- void LedLiu(); //流水燈函數
- void main()
- {
- EA = 1;
- ADDR3 = 1;
- ENLED = 0;
- ConfigTime(1);
- ShowNumber(0);
- while(1)
- {
- if(flag1s)
- {
- sum++;
- flag1s=0; //1s執行一次
- ShowNumber(sum);
- LedLiu();
- if(sum>=999999) //數碼管最大顯示999999
- {
- sum = 0;
- }
- }
- }
- }
- void ConfigTime(unsigned int ms)
- {
- unsigned long tmp;
- tmp = 11059200/12;
- tmp = (tmp*ms)/1000;
- tmp = 65536-tmp;
- tmp = tmp +12;
- T0RH = (unsigned char)(tmp>>8);
- T0RL =(unsigned char)tmp;
- TMOD &= 0xf0;
- TMOD |= 0x01;
- TH0 = T0RH;
- TL0 = T0RL;
- ET0 = 1;
- TR0 = 1;
- }
- void ShowNumber(unsigned long tmr)
- {
- unsigned char buf[6]={0,0,0,0,0,0};
- signed char i= 0;
-
- for(i=0;i<6;i++)
- {
- buf[i] = tmr%10;
- tmr = tmr/10;
- }
- for(i=5;i>=1;i--)
- {
- if(buf[i]==0)
- LedBuff[i]=0xff;
- else
- break;
- }
- for( ;i>=0;i--)
- {
- LedBuff[i]=LedChar[buf[i]];
- }
- }
- void LedLiu()
- {
- static unsigned char i = 0; // 子函數中,如果變量一次執行不能執行完全部變量時,應該采用靜態變量
- LedBuff[6]=~(0x01<<i);
- i++;
- if(i>=8)
- {
- i=0;
- }
- }
- void LedScan()
- {
- static unsigned char i=0;
- P0 = 0xff;
- P1=(P1&0xf8)|i;
- P0 = LedBuff[i];
- if(i<6)
- {
- i++;
- }
- else
- {
- i = 0;
- }
- }
- void InterruptTime0() interrupt 1
- {
- static unsigned int tmr1s=0;
- TH0 = T0RH;
- TL0 = T0RL;
- LedScan();
- tmr1s++;
- if(tmr1s>=1000) //定時器累計到1s歸零,從新計時
- {
- tmr1s= 0;
- flag1s = 1;
- }
- }
復制代碼
|