?? wkeyboard.lst
字號:
C51 COMPILER V7.05 WKEYBOARD 02/14/2006 08:47:29 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WKEYBOARD
OBJECT MODULE PLACED IN WKeyboard.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WKeyboard.c DB OE
stmt level source
1 //參考程序A: WKeyboard.c 六位數(shù)碼管顯示+鍵盤掃描
2 #include <c8051f020.h> // SFR declarations
3 #include <intrins.h>
4 #define PORTA 0x8000 /*8255端口A*/
5 #define PORTB 0x8001 /*8255端口B*/
6 #define PORTC 0x8002 /*8255端口C*/
7 #define PORTCON 0x8003 /*8255控制口*/
8 sbit BUZ = P3^5;
9 unsigned char xdata *idata Pointm;
10 unsigned char number,ppp,dramb=0x0;
11 unsigned char data dram[7]={0x0,0x1,0x2,0x3,0x4,0x5};
12 ScanData=0xff;
13 void PORT_Init (void);
14 disply();
15 FF1();
16 void delay(unsigned int count) /*延時*/
17 {
18 1 unsigned char ii,jj;
19 1 for(ii=0;ii<count;ii++)
20 1 {
21 2 for(jj=0;jj<250;jj++)
22 2 _nop_();
23 2 }
24 1 }
25 void ff1() /*按下F1鍵時,清除數(shù)組dram[7]*/
26 {unsigned char ppp;
27 1 for(ppp=0;ppp<7;ppp++)
28 1 dram[ppp]=0x00;
29 1 number=0x00; /*按下F1鍵時,將顯示指針指向數(shù)碼管的第一位*/
30 1 dramb=0x00; /*清除F1鍵值(0xf1的存儲單元dramb*/
31 1 ScanData=0xff;
32 1 }
33 void main (void) {
34 1 unsigned char ScanData,temp,k,number=0;
35 1 /*無效看門狗*/
36 1 WDTCN = 0xde;
37 1 WDTCN = 0xad;
38 1 PORT_Init ();
39 1 *Pointm=0x00;Pointm=PORTCON;
40 1 *Pointm=0x90; /*初始化8255,A口輸入,B口,C口輸出*/
41 1 Pointm=PORTC;
42 1 ScanData=0xff;
43 1 disply();
44 1 while(1){
45 2 BUZ=1;
46 2 do{
47 3 if(dramb==0xf1) /*dramb==0xf1,按過F1鍵,清除dram[7]*/
48 3 ff1();
49 3 disply();
50 3 Pointm=PORTB;
51 3 ScanData++;
52 3 if(ScanData>=0x04) ScanData=0x00;
53 3 switch(ScanData)
54 3 {
55 4 case 0x00:
C51 COMPILER V7.05 WKEYBOARD 02/14/2006 08:47:29 PAGE 2
56 4 *Pointm=0xfe; /*掃描第一列*/
57 4 break;
58 4 case 0x01:
59 4 *Pointm=0xfd; /*掃描第二列*/
60 4 break;
61 4 case 0x02:
62 4 *Pointm=0xfb; /*掃描第三列*/
63 4 break;
64 4 case 0x03:
65 4 *Pointm=0xf7; /*掃描第四列*/
66 4 break;
67 4 default:
68 4 *Pointm=0xff;
69 4 }
70 3 delay(20);
71 3 Pointm=PORTA;
72 3 temp=*Pointm; /*讀是否有鍵按下*/
73 3 k=temp;
74 3 _nop_();
75 3 }while(temp==0xff);
76 2 BUZ=0; /*有鍵按下*/
77 2 delay(50);
78 2 BUZ=1;
79 2 ACC=temp;
80 2 temp = temp & 0xf0;
81 2 if(temp==0x00) temp = temp | 0xf0; /*PA4~PA7沒加上啦*/
82 2 if(temp==0xf0){ /*0~F按下*/
83 3 /*換算成數(shù)字鍵值*/
84 3 k=~k; /*將鍵值求反*/
85 3 k=k&0x0f; /*只取低四位*/
86 3 k=k/2; /* K==0,對應(yīng)0,1,2,3*/
87 3 if(k>=4) k=3; /* K==1,對應(yīng)4,5,6,7*/
88 3 k=k*4; /* K==2,對應(yīng)8,9,A,B*/
89 3 temp=ScanData; /* K==4,對應(yīng)C,D,E,F(xiàn)*/
90 3 temp=temp+k;
91 3 dram[number]=temp;
92 3 number++;
93 3 if(number==0x06)number=0x00;
94 3 _nop_();
95 3 }
96 2 else{ /*F1~F4按下*/
97 3 switch(temp)
98 3 {
99 4 case 0xe0:
100 4 temp = 0x0f1; /*F1鍵按下*/
101 4 break;
102 4 case 0xd0:
103 4 temp = 0x0f2; /*F2鍵按下*/
104 4 break;
105 4 case 0xb0:
106 4 temp = 0x0f3; /*F3鍵按下*/
107 4 break;
108 4 case 0x70:
109 4 temp = 0x0f4; /*F4鍵按下*/
110 4 break;
111 4 default:
112 4 temp = 0x00;
113 4 }
114 3 _nop_();
115 3 dramb=temp; /*F1-F4鍵值的存儲單元dramb*/
116 3 // ACC=temp;
117 3
C51 COMPILER V7.05 WKEYBOARD 02/14/2006 08:47:29 PAGE 3
118 3 }
119 2 }
120 1 }
121 void PORT_Init (void)
122 {
123 1 XBR2 = 0x40; /*使能交叉開關(guān)和弱上拉*/
124 1 P74OUT |= 0xcf; /*使能P4,P5,P6推挽輸出,P7為漏極開路*/
125 1 EMI0CF |= 0x2c; /*EMIF工作在地址/數(shù)據(jù)復(fù)用方式,只用外部存儲器,ALE*/
126 1 /*高/低脈寬占1個SYSCLK周期*/
127 1 EMI0TC |= 0x6D;/*地址建立/保持時間占1個SYSCLK周期,/WR和/RD占12個周期*/
128 1 // P3MDOUT |= 0x20; /*使能P3.5推挽輸出*/
129 1 }
130 disply(void) /*顯示dram[6]中的六位數(shù)碼*/
131 { unsigned char code F7SEG[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
132 1 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
133 1 unsigned char ss,pp,hh=1;
134 1 unsigned char xdata * Pointn;
135 1 for(ss=0;ss<6;ss++)
136 1 {
137 2 Pointn=PORTC;
138 2 pp=dram[ss];
139 2 B=ss;
140 2 *Pointn=F7SEG[pp];
141 2 Pointn=PORTB;
142 2 *Pointn=hh;
143 2 ACC=pp;
144 2 B=F7SEG[pp];
145 2 hh=hh<<1;
146 2 delay(5);
147 2 }
148 1 Pointm=PORTC;
149 1 *Pointm=0x00;
150 1 }
151
152
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 472 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 5
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -