📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 11/16/2008 16:00:01 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND TABS(1)
stmt level source
1 /******************************************************************
2 本程序只供学习使用,未经作者许可,不得用于其它任何用途
3
4 欢迎访问我的USB专区:http://group.ednchina.com/93/
5 欢迎访问我的blog: http://www.ednchina.com/blog/computer00
6 http://computer00.21ic.org
7
8 感谢PCB赞助商——电子园: http://bbs.cepark.com/
9
10 main.c file
11
12 作者:电脑圈圈
13 建立日期: 2008.06.27
14 修改日期: 2008.07.15
15 版本:V1.1
16 版权所有,盗版必究。
17 Copyright(C) 电脑圈圈 2008-2018
18 All rights reserved
19 *******************************************************************/
20
21 #include <AT89X52.H> //头文件
22 #include "Key.h"
23 #include "Led.h"
24 #include "UART.h"
25 #include "pdiusbd12.h"
26 #include "UsbCore.h"
27 #include "config.h"
28
29 code uint8 HeadTable[][74]={
30 "********************************************************************\r\n",
31 "****** 《圈圈教你玩USB》之 带鼠标的USB键盘 ******\r\n",
32 "****** AT89S52 CPU ******\r\n",
33 "****** 建立日期:",__DATE__," ******\r\n",
34 "****** 建立时间:",__TIME__," ******\r\n",
35 "****** 作者:电脑圈圈 ******\r\n",
36 "****** 欢迎访问作者的 ******\r\n",
37 "****** USB专区:http://group.ednchina.com/93/ ******\r\n",
38 "****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
39 "****** BLOG2:http://computer00.21ic.org ******\r\n",
40 "****** 请按K1-K8分别进行测试 ******\r\n",
41 "****** K1:功能选择键:按下时K2~K8为键盘,松开时K2~K8为鼠标 ******\r\n",
42 "****** 键盘功能时 ******\r\n",
43 "****** K2:左Shift键 K3:左Alt键 K4:1键 ******\r\n",
44 "****** K5:2键 K6:3键 K7:Caps Lock键 K8:Num Lock键 ******\r\n",
45 "****** 注意:数字键是数字小键盘,必须打开Num Lock才是数字键 ******\r\n",
46 "****** 鼠标功能时 ******\r\n",
47 "****** K2:光标左移 K3:光标右移 K4:光标上移 K5:光标下移 ******\r\n",
48 "****** K6:鼠标左键 K7:鼠标中键 K8:鼠标右键 ******\r\n",
49 "********************************************************************\r\n",
50 };
51
52 /********************************************************************
53 函数功能:根据按键情况返回报告的函数。
54 入口参数:无。
55 返 回:无。
C51 COMPILER V7.06 MAIN 11/16/2008 16:00:01 PAGE 2
56 备 注:无。
57 ********************************************************************/
58 void SendReport(void)
59 {
60 1 //需要返回的9字节报告的缓冲(一字节报告ID加键盘8字节报告)
61 1 //而鼠标报告只有4字节,加上一字节报告ID总共5字节,9字节够了。
62 1
63 1 uint8 Buf[9]={0,0,0,0,0,0,0,0,0};
64 1
65 1 //由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
66 1 //由于报告ID占用第一字节,所以普通按键从第四字节开始存放。
67 1 uint8 i=3;
68 1
69 1 //我们用KEY1键来选择剩余的7个键是键盘功能还是鼠标功能。
70 1 //当KEY1按住时,剩余7个键为键盘功能,这7个键的功能跟键盘
71 1 //实例的一样。当KEY1松开时,剩余7个键为鼠标功能,功能分别为:
72 1 //KEY2:光标左移,KEY3:光标右移,KEY4:光标上移,KEY5:光标下移。
73 1 //KEY6:鼠标左键,KEY7:鼠标中键,KEY8:鼠标右键。
74 1
75 1 //根据不同的按键设置输入报告
76 1
77 1 if(KeyPress & KEY1) //如果KEY1按住,则为键盘功能
78 1 {
79 2 Buf[0]=0x01; //第一字节为报告ID,键盘报告ID为1。
80 2 if(KeyPress & KEY2) //如果KEY2按住
81 2 {
82 3 Buf[1]|=0x02; //KEY2为左Shift键。
83 3 }
84 2 if(KeyPress & KEY3) //如果KEY3按住
85 2 {
86 3 Buf[1]|=0x04; //KEY3为左Alt键
87 3 }
88 2 if(KeyPress & KEY4) //如果KEY4按住
89 2 {
90 3 Buf[i]=0x59; //KEY4为数字小键盘1键。
91 3 i++; //切换到下个位置。
92 3 }
93 2 if(KeyPress & KEY5) //如果KEY5按住
94 2 {
95 3 Buf[i]=0x5A; //KEY5数字小键盘2键。
96 3 i++; //切换到下个位置。
97 3 }
98 2 if(KeyPress & KEY6) //如果KEY6按住
99 2 {
100 3 Buf[i]=0x5B; //KEY6为数字小键盘3键。
101 3 i++; //切换到下个位置。
102 3 }
103 2 if(KeyPress & KEY7) //如果KEY7按住
104 2 {
105 3 Buf[i]=0x39; //KEY7为大/小写切换键。
106 3 i++; //切换到下个位置。
107 3 }
108 2 if(KeyPress & KEY8) //如果KEY8按住
109 2 {
110 3 Buf[i]=0x53; //KEY8为数字小键盘功能切换键。
111 3 }
112 2 //报告准备好了,通过端点1返回,长度为9字节。
113 2 D12WriteEndpointBuffer(3,9,Buf);
114 2 }
115 1 else //KEY1松开,为鼠标功能
116 1 {
117 2 Buf[0]=0x02; //第一字节为报告ID,鼠标报告ID为2。
C51 COMPILER V7.06 MAIN 11/16/2008 16:00:01 PAGE 3
118 2 if(KeyDown & KEY2) //如果KEY2按下
119 2 {
120 3 Buf[2]=-10; //KEY2为鼠标左移,按一次移动10个单位。
121 3 }
122 2 if(KeyDown & KEY3) //如果KEY3按下
123 2 {
124 3 Buf[2]=10; //KEY3为鼠标右移,按一次移动10个单位。
125 3 }
126 2 if(KeyDown & KEY4) //如果KEY4按下
127 2 {
128 3 Buf[3]=-10; //KEY4为鼠标上移,按一次移动10个单位。
129 3 }
130 2 if(KeyDown & KEY5) //如果KEY5按下
131 2 {
132 3 Buf[3]=10; //KEY5为鼠标下移,按一次移动10个单位。
133 3 }
134 2 if(KeyPress & KEY6) //如果KEY6按住
135 2 {
136 3 Buf[1]|=0x01; //KEY6为鼠标左键。
137 3 }
138 2 if(KeyPress & KEY7) //如果KEY7按住
139 2 {
140 3 Buf[1]|=0x04; //KEY7为鼠标中键。
141 3 }
142 2 if(KeyPress & KEY8) //如果KEY8按住
143 2 {
144 3 Buf[1]|=0x02; //KEY8为鼠标右键。
145 3 }
146 2 //报告准备好了,通过端点1返回,长度为5字节。
147 2 D12WriteEndpointBuffer(3,5,Buf);
148 2 }
149 1 Ep1InIsBusy=1; //设置端点忙标志。
150 1 //记得清除KeyUp和KeyDown
151 1 KeyUp=0;
152 1 KeyDown=0;
153 1 }
154 ////////////////////////End of function//////////////////////////////
155
156 /********************************************************************
157 函数功能:主函数。
158 入口参数:无。
159 返 回:无。
160 备 注:无。
161 ********************************************************************/
162 void main(void) //主函数
163 {
164 1 uint8 i;
165 1 uint16 id;
166 1 uint8 InterruptSource;
167 1
168 1 EA=1; //打开中断
169 1 InitKeyboard(); //初始化按键
170 1 InitUART(); //初始化串口
171 1
172 1 for(i=0;i<24;i++) //显示信息
173 1 {
174 2 Prints(HeadTable[i]);
175 2 }
176 1
177 1 id=D12ReadID();
178 1
179 1 Prints("Your D12 chip\'s ID is: ");
C51 COMPILER V7.06 MAIN 11/16/2008 16:00:01 PAGE 4
180 1 PrintShortIntHex(id);
181 1
182 1 if(id==0x1012)
183 1 {
184 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
185 2 }
186 1 else
187 1 {
188 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
189 2 }
190 1
191 1 UsbDisconnect(); //先断开USB连接
192 1 UsbConnect(); //将USB连接上
193 1 ConfigValue=0; //配置值初始化为0
194 1
195 1 while(1) //死循环
196 1 {
197 2 if(D12GetIntPin()==0) //如果有中断发生
198 2 {
199 3 D12WriteCommand(READ_INTERRUPT_REGISTER); //写读中断寄存器的命令
200 3 InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
201 3 if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
202 3 if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理
203 3 if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理
204 3 if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理
205 3 if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理
206 3 if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理
207 3 if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理
208 3 if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理
209 3 }
210 2 if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
211 2 {
212 3 //为显示KEY1选择功能,当KEY1按住时,将LED8点亮,表示键盘功能状态
213 3 if(KeyPress & KEY1)
214 3 {
215 4 OnLed8();
216 4 }
217 3 else
218 3 {
219 4 OffLed8();
220 4 }
221 3 if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
222 3 {
223 4 KeyCanChange=0; //禁止按键扫描
224 4 if(KeyUp||KeyDown) //如果有按键事件发生
225 4 {
226 5 SendReport(); //则返回报告
227 5 }
228 4 KeyCanChange=1; //允许按键扫描
229 4 }
230 3 }
231 2 }
232 1 }
233 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 425 ----
CONSTANT SIZE = 1883 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 13
C51 COMPILER V7.06 MAIN 11/16/2008 16:00:01 PAGE 5
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 + -