原本想實現的功能是:按按鍵1加一,按鍵2減一,按鍵三清零,按鍵4定時器定時一秒自動加一,按鍵5燈全亮,蜂鳴器響,再按就關了,按鍵6為P3.2口是中斷,中斷一次實行流水燈程序
可問題就出在當按了中斷后,燈沒有執行流水燈程序,反而數碼管依次輪流閃亮,燈只亮了兩展,不知道問題出在哪
以下是本人的程序,求大俠指點!!!!謝謝啊!!!!!
#include<reg52.h> #define uint unsigned int #define uchar unsigned int #define led P2 uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0,1,2,3,4,5,6,7,8,9 uint code btm[]={0xe7,0xc3,0x81,0x00} ; uint code mtb[]={0x7e,0x3c,0x18,0x00} ; sbit smg1=P1^0; sbit smg2=P1^1; sbit smg3=P1^2; sbit smg4=P1^3; sbit key1=P3^7; sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4; sbit key5=P3^3; sbit sb=P1^5; uint ge,shi,bai,qian,num,tt; uint count=0; void dely(uint); void display(uint); void ltr() {led=0x7f; for(count=0;count<8;count++) { led=led>>1; dely(500); } return; } void rtl() {led=0xfe; for(count=0;count<8;count++) { led=led<<1; dely(500); } return; } void bothtomiddle() {led=0xff; for(count=0;count<5;count++) {led=btm[count]; dely(500); } return; } void middletoboth() {led=0xff; for(count=0;count<5;count++) {led=mtb[count]; dely(500); } return; } void dely(uint t) { uint x,y; for(x=0;x<t;x--) for(y=0;y<110;y--) {} } void init() //初始化T0和INT0 { EA=1; ET0=1; EX0=1; IT0=0; TMOD=0X01; TH0=(65536-45872)/256; TL0=(65536-45872)/256; } void keyscan() { if(key1==0) //按鍵1加一 { dely(10); if(key1==0) { num++; if(num==10000) { num=0; sb=0; dely(1000); sb=1; } while(!key1); } } if(key2==0) //按鍵2減一 { dely(10); if(key2==0) { if(num==0) { num=10000; sb=0; dely(1000); sb=1; } num--; while(!key2); } } if(key3==0) //按鍵3清零作用 { dely(10); if(key3==0) { num=0; while(!key3); } } if(key4==0) { dely(10); if(key4==0) //定時器工作 { while(!key4); TR0=~TR0; } } if(key5==0) //按鍵5功能 { dely(10); if(key5==0) { while(!key5) ; dely(5); //LED全亮,蜂鳴器響 led=~led; sb=~sb; dely(100); } } } void display(uint number) //顯示數據函數 { qian=number/1000; bai=number%1000/100; shi=number%100/10; ge=number%10; smg1=0; P0=table[qian]; dely(5); P0=0xff; smg1=1; smg2=0; P0=table[bai]; dely(5); P0=0xff; smg2=1; smg3=0; P0=table[shi]; dely(5); P0=0xff; smg3=1; smg4=0; P0=table[ge]; dely(5); P0=0xff; smg4=1; } void zhongduan() interrupt 0 //中斷函數內容 { ltr(); rtl(); bothtomiddle(); middletoboth(); led=0xff; } void main() //主函數入口 { num=0; init(); //初始化定時中斷函數 while(1) { keyscan(); display(num); } } void timet0() interrupt 1 //定義計數器功能 { TH0=(65536-45872)/256; TL0=(63336-45872)/256; tt++; if(tt==20) { tt=0; num++; if(num==10000) {num=0;} } }
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |