#include "reg52.h" #include "absacc.h" unsigned char table[]={0x77,0x7e,0xbe,0xde, 0x7d,0xbd,0xdd,0x7b, 0xbb,0xdb,0xee,0xed, 0xeb,0xe7,0xd7,0xb7}; code char code tab[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xff,0xbf}; unsigned char dspbuf[]={10,10,10,10,10,10,10,10}; unsigned char dspcom = 0; bit key_re; unsigned char key_press; unsigned char key_value; bit key_flag=0; unsigned char intr=0; unsigned char read_keyboard(void); void key_proc(unsigned char key_code); void ShowNumber(unsigned long num); void display(); void cls_beep(); void cls_led(); void main(void) { unsigned char key_temp=0xff; TMOD=0x01; TL0=0x66; TH0=0xFC; TF0=0; TR0=1; ET0=1; EA=1; cls_beep(); cls_led(); while(1) { if(key_flag) { key_flag=0; key_temp=read_keyboard(); key_proc(key_temp); } } } void isr_timer_0(void) interrupt 1 { TL0=0x66; TH0=0xFC; display(); if(++intr == 10) { intr = 0; key_flag=1; } } void cls_beep() { P0=0X00; P2=P2&0X1F|0XA0; P2=P2&0X1F; } void cls_led() { P0=0Xff; P2=P2&0X1F|0X80; P2=P2&0X1F; } unsigned char read_keyboard(void) { unsigned char temp,scan,i; P3=0xf0; temp=P3&0xf0; if(temp!=0xf0) key_press++; else key_press=0; if(key_press == 2) { key_press=0; key_re=1; P3=0X0F; scan=P3&0X0F; temp=temp|scan; for(i=0;i<16;i++) { if(temp==table[i]) key_value=i; } } //P3=0x0f if((key_re == 1) && (temp == 0xF0)) { key_re=0; return key_value; } return 0xff; } void key_proc(unsigned char key_code) { static unsigned long result=0; static unsigned long addend=0; static unsigned char cp; if((key_code>=0)&&(key_code<=9))//ÅD¶Ïêy×Ö¼ü { addend=addend*10+key_code; ShowNumber(addend); } else if(key_code==10)//¼ó·¨ { result=result+addend; cp=1; addend=0; ShowNumber(result); } else if(key_code==11)//¼õ·¨ { if(result==0) result=addend; else result=result-addend; addend=0; cp=2; ShowNumber(result); } else if(key_code==12)//3Ë { if(result==0) result=addend; else { if(cp==0xff) ; else result=result*addend; } cp=3; addend=0; ShowNumber(result); } else if(key_code==13)//3y·¨ { if(result==0) result=addend; else { if(cp==0xff) ; else result=result/addend; } cp=4; addend=0; ShowNumber(result); } else if(key_code==14)//= { switch(cp) { case 1:result=result+addend; break; case 2:result=result-addend; break; case 3:result=result*addend; break; case 4:result=result/addend; break; } addend=0;cp=0xff; ShowNumber(result); } else if(key_code==15)//Çåáã { addend=0; result=0; ShowNumber(addend); } } void ShowNumber(unsigned long num) { (num>=100000)?(dspbuf[2]=num/100000):(dspbuf[2]=10); (num>=10000)?(dspbuf[3]=num%100000/10000):(dspbuf[3]=10); (num>=1000)?(dspbuf[4]=num%10000/1000):(dspbuf[4]=10); (num>=100)?(dspbuf[5]=num%1000/100):(dspbuf[5]=10); (num>=10)?(dspbuf[6]=num%100/10):(dspbuf[6]=10); dspbuf[7]=num%10; } void display(void) { P0 = 0xff; P2 = ((P2&0x1f)|0xE0); P2 &= 0x1f; P0 = 1<<dspcom; P2 = ((P2&0x1f)|0xC0); P2 &= 0x1f; P0 = tab[dspbuf[dspcom]]; P2 = ((P2&0x1f)|0xE0); P2 &= 0x1f; if(++dspcom == 8) dspcom = 0; } |
每一毫秒拉高按键标志看似可行,但是你完成一次按键操作要多久? 你按键还没按完已经是下一个标志了,按键怎么读的出来? 把按键扫描放进中断,再把升高按键标志放进扫描里就可以了 |
你忘了在按键扫描程序里升高按键标志KEY_FLAGE |
求大佬指出问题 |
z求大神解答,是哪里出问题了 |