📄 ps-2.lst
字号:
C51 COMPILER V7.06 PS_2 05/14/2005 04:46:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS_2
OBJECT MODULE PLACED IN PS-2.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE PS-2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //-----------------------函数声明,变量定义--------------------------------------------------------
2 #include <reg51.h>
3 #define KEY P1
4 unsigned char key_code; //键值
5 unsigned char key_buf[8]; //按键缓冲区
6 unsigned char key_COUNT; //按键计数器
7 unsigned char COUNT_TI; //定时中断计数
8
9 //-----------------------变量声明---------------------------------------------------------------------
10 void system_init(void ); //初始化,设置定时器0的工作方式,供主程序调用
11 void TIMER0_SCANkey(); //定时器0中断处理函数
12 bit judge_hitkey(); //判断是否有键按下,有返回1,没有返回0
13 unsigned char scan_key(); //扫描键盘,返回键值(高四位代表行,低四位代表列)
14 void key_manage(unsigned char keycode); //按键处理
15 //...........每个按键对应一个处理程序
16 //--------------------------------------------------------------------------------------------------
17 // 函数名称: scan_key
18 // 函数功能: 扫描键盘,返回键值(高四位代表行,低四位代表列)
19 // 无键按下返回0
20 //--------------------------------------------------------------------------------------------------
21 unsigned char scan_key() //扫描键盘,返回键值(高四位代表行,低四位代表列)
22 {
23 1 unsigned char scancode,keycode,keycode_line,keycode_row;
24 1 scancode=0xF0; //列置低,行置高
25 1 KEY=scancode; //输入扫描码,扫描行
26 1 keycode_line=KEY;
27 1 scancode=0xF0; //列置高,行置低
28 1 KEY=scancode; //输入扫描码,扫描列
29 1 keycode_row=KEY;
30 1 keycode=(((keycode_line<<4)&0xF0)|(keycode_row&0x0F));
31 1 return(keycode);
32 1 }
33 //--------------------------------------------------------------------------------------------------
34 // 函数名称: Timer0_init()
35 // 函数功能: 初始化设置
36 // 设定INT0的工作方式
37 //--------------------------------------------------------------------------------------------------
38 void Timer0_init(void )
39 {
40 1 TMOD=0x20; //定时器0工作在方式2的定时模式
41 1 ET0=1; //定时器0中断允许
42 1 TH0=0;
43 1 TL0=0;
44 1 TR0=1; //定时器0开始计数
45 1 EA=1; //系统中断允许
46 1 }
47 //--------------------------------------------------------------------------------------------------
48 // 函数名称: TIMER0_intrupt
49 // 函数功能: 定时器0中断处理程序
50 //--------------------------------------------------------------------------------------------------
51 void TIMER0_SCANkey() interrupt 1 using 1
52 {
53 1 EA=0; //系统中断禁止
54 1 if((++COUNT_TI)%30==0)
55 1 {
C51 COMPILER V7.06 PS_2 05/14/2005 04:46:42 PAGE 2
56 2 switch(COUNT_TI/30)
57 2 {
58 3 case 1:if(scan_key()==0)
59 3 COUNT_TI=0; //无键按下,计数值归零
60 3 break;
61 3 case 2:break;
62 3 case 3:if(scan_key()==0)
63 3 COUNT_TI=0; //无键按下,计数值归零,上次按键未扰动
64 3 else
65 3 key_code=scan_key(); //又有效建,获取键值
66 3 break;
67 3 default:if(scan_key()==0) //等待按键释放
68 3 key_manage(key_code); //有一个有效按键,调用按键处理程序
69 3 }
70 2 }
71 1 EA=1;
72 1 }
73 void key_manage(unsigned char keycode)
74 {
75 1 unsigned char i;
76 1 for(i=7;i>=0;i--)
77 1 {
78 2 key_buf[i]=key_buf[i-1]; //缓冲区内数据后移1位
79 2 }
80 1 key_buf[0]= keycode; //将键值送入缓冲区
81 1 key_COUNT++; //按键计数器加一
82 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 157 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -