关于proteus的仿真实例
源代码在线查看: keyscan.lst
C51 COMPILER V8.05a KEYSCAN 08/08/2007 23:55:40 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE KEYSCAN
OBJECT MODULE PLACED IN KeyScan.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\KeyScan.c BROWSE INCDIR(.\include) DEBUG OBJECTEXTEND PRINT(.\KeySca
-n.lst) OBJECT(KeyScan.obj)
line level source
1 //*************************************************************************************************
2 //*************************************************************************************************
3 //**:键盘扫描子程序 **
4 //**:当有外部中断0时调用此函数,使用列扫描的方式获取键码,键码由2位数字组成。高位为行号 **
5 //** 低位为列号。 **
6 //*************************************************************************************************
7 //*************************************************************************************************
8
9
10 //*************************************************************************************************
11 //* *
12 //* ******************************头文件及宏定义************************** *
13 //* *
14 //*************************************************************************************************
15 #include
16
17 #define SCANPORT P2 //4×4键盘扫描端口,低4位是行线,高4位是列线。
18 //采用逐列扫描的方法,无按键时,低4位输出1,高4位输出0。
19 //当有按键时,高4位输出扫描电位,低4位输入扫描结果。
20
21
22 //*************************************************************************************************
23 //* *
24 //* ********************************全局变量****************************** *
25 //* *
26 //*************************************************************************************************
27 unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列线扫描电压,分为第1,2,3,4根列线
28 //为低电平,其他为高电平。
29 //*************************************************************************************************
30 //* *
31 //* ********************************函数实现****************************** *
32 //* *
33 //*************************************************************************************************
34 unsigned char ucKeyScan()
35 {
36 1 unsigned char ucTemp=0; //扫描状态暂存。
37 1 unsigned char ucRow=0,ucLine=0; //行号,列号。
38 1
39 1 EX0=0; //在键扫描处理时,关闭外部中断0,防抖动。
40 1
41 1 for(ucLine=0;ucLine 42 1 {
43 2 SCANPORT=uca_LineScan[ucLine]; //输出扫描电位。
44 2 ucTemp=SCANPORT&0x0F; //输入扫描电位,并屏蔽高4位。
45 2 if(ucTemp!=0x0F)
46 2 { //判断该列是否有按键按下。
47 3 switch(ucTemp)
48 3 {
49 4 case 0x0E: ucRow=10;break; //如果有,则判断行号。
50 4 case 0x0D: ucRow=20;break;
51 4 case 0x0B: ucRow=30;break;
52 4 case 0x07: ucRow=40;break;
53 4 default: ucRow=50;break;
54 4 }
C51 COMPILER V8.05a KEYSCAN 08/08/2007 23:55:40 PAGE 2
55 3 break;
56 3 }
57 2 }
58 1 // 59 1 SCANPORT=0x0F; //恢复P2口
60 1 EX0=1; //恢复按键中断。
61 1
62 1 return ucRow+ucLine+1; //返回按键编码。格式为2位数,高位为行号,低位为列号。
63 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 71 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)