📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 06/15/2008 18:04:01 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\Developer_Factory\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include<reg51.h>
3
4 typedef unsigned char byte;
5
6 byte keyCode[4][16]={0,0,0,0,0,0,0,0xB4,0,0,0,0xD1,0,0xE1,0xF0,0,
7 0,0,0,0,0,0,0,0x2D,0,0,0,0x4B,0,0x78,0x87,0,
8 0,0,0,0,0,0,0,0,0,0,0,0,0,0x0F,0x1E,0,
9 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //低四位为按键编码,高四位为校验码
10 int clock=0; //全局计数器,每次时钟中断加一
11
12 void init() //初始化
13 {
14 1 /*keyCode[0][14]=0xF0; //0号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到14=(1110)
15 1 keyCode[0][13]=0xE1; //1号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到13=(1101)
16 1 keyCode[0][11]=0xD2; //2号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到11=(1011)
17 1 keyCode[0][7] =0xB4; //3号键按下,P1高四位输出~(1<<0)=(1110),低四位检测到 7=(0111)
18 1
19 1 keyCode[1][14]=0x87; //4号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到14=(1110)
20 1 keyCode[1][13]=0x78; //5号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到13=(1101)
21 1 keyCode[1][11]=0x4B; //6号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到11=(1011)
22 1 keyCode[1][7] =0x2D; //7号键按下,P1高四位输出~(1<<1)=(1101),低四位检测到 7=(0111)
23 1
24 1 keyCode[2][14]=0x1E; //8号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到14=(1110)
25 1 keyCode[2][13]=0x0F; //9号键按下,P1高四位输出~(1<<2)=(1011),低四位检测到13=(1101) */
26 1
27 1 TMOD=0x02; //使用计时器0,模式2,8位自动重装载,每当TL0溢出后自动重装载TH0 的值
28 1 TH0=0x9C;
29 1 TL0=0x9C; //赋8位时钟计数器初值,每 0xFF - 0x9C = 100us = 0.1ms中断一次
30 1 EA=1; //开中断
31 1 ET0=1; //注意,此时时钟并未启动
32 1 }
33
34 void sendLeadCode() //发送引导码,8ms高电平,8ms低电平
35 {
36 1 TR0=1; //启动时钟
37 1
38 1 clock=0;
39 1 while(clock<80)
40 1 P0|=1; //P0.0=1,循环持续8ms
41 1
42 1 while(clock<160)
43 1 P0&=0xFE; //P0.0=0。循环持续8ms
44 1
45 1 TR0=0; //关闭时钟
46 1 TL0=0x9C;
47 1 }
48
49 void sendBit(byte bitToSend)//发送一位脉位调制信号,1ms高电平,1ms或3ms低电平
50 {
51 1 TR0=1; //启动时钟
52 1
53 1 clock=0;
54 1 while(clock<10)
55 1 P0|=1; //P0.0=1,循环持续1ms
C51 COMPILER V8.08 MAIN 06/15/2008 18:04:01 PAGE 2
56 1
57 1 if(bitToSend & 0x01)//如果是bit"1"
58 1 while(clock<40)
59 1 P0&=0xFE; //P0.0=0,循环持续3ms
60 1 else //如果是bit"0"
61 1 while(clock<20)
62 1 P0&=0xFE; //P0.0=0,循环持续1ms
63 1
64 1 TR0=0; //关闭时钟
65 1 TL0=0x9C;
66 1 }
67
68 void sendEnd()
69 {
70 1 clock=0;
71 1 TR0=1;
72 1 while(clock<2)
73 1 P0|=1;
74 1 P0&=0xFE;
75 1 TR0=0;
76 1 }
77
78 void sendCode(byte keyCode)//发送编码code及其反码,共8位
79 {
80 1 char i;
81 1
82 1 sendLeadCode(); //发送引导码
83 1 for(i=0;i<8;i++) //依次从低到高发送8位编码
84 1 sendBit(keyCode>>i);
85 1 sendEnd();
86 1 }
87
88 void main()
89 {
90 1 byte i,t;
91 1
92 1 init();
93 1 while(1)//轮询检测按键
94 1 {
95 2 for(i=4;i<8;i++)//P1口高四位依次变低电位,检测低四位
96 2 {
97 3 P1=~(1<<i);
98 3 if((t=keyCode[i-4][P1 & 0x0F])!=0)//如果有按键按下,则查表得到的编码t不为0
99 3 sendCode(t);
100 3 }
101 2 }
102 1 }
103
104 void timer() interrupt 1 //时钟中断处理函数
105 {
106 1 clock++; //全局时钟加一
107 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 251 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 66 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.08 MAIN 06/15/2008 18:04:01 PAGE 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -