- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit fmq=P3^6;
- sbit P27=P2^7; //位顯示,最右邊
- uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
- //code 的作用是把s8存到8K的ROM中
- //共陽數碼光顯示字型數碼組 1011 1111 “-”
- uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
- uchar key;
- void delay1ms(uchar n) //1ms基準延時程序
- {
- uchar i;
- while(n--)
- for(i=0;i<115;i++);
- }
- void delay500us() // 500us延時
- {
- uchar i;
- for(i=0;i<57;i++); //500us基準延時程序
- }
- void beep() //產生1KHZ頻率聲音的函數
- {
- fmq=0;
- delay500us();
- fmq=1;
- delay500us();
- }
- uchar key_scan() //掃描鍵盤
- {
- uchar scan1,scan2,keycode,i;
- P1=0xf0;
- scan1=P1;
- if((scan1&0xf0)!=0xf0){ //判斷是否按鍵
- delay1ms(15); //延時消陡
- scan1=P1;
- if((P1&0xf0)!=0xf0){ //二次判斷是否按鍵
- P1=0x0f; //線反轉法德核心
- scan2=P1;
- keycode=scan1|scan2; //組合成鍵編碼
- }
- for(i=0;i<16;i++){
- if(keycode==key_code[i]){ //查表得鍵值
- key=i;
- return key;
- }
- }
- }
- else{
- P1=0xff; //P1口寫1,輸入狀態
- return 16;
- }
-
- }
- void main()
- {
- uchar t;
- P0=0xbf;
- P27=0;
- P1=0xff; //寫1,讀狀態
- while(1)
- {
- P1=0xf0;
- if((P1&0xf0)!=0xf0){ // 判斷按鍵
- key_scan();
- P0=dis_code[key];
- for(t=0;t<200;t++)
- beep();
- fmq=1;
- delay1ms(200);
- }
- }
- }
復制代碼
|