📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 06/17/2010 09:51:38 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************
2 本程序只供学习使用,未经作者许可,不得用于其它任何用途
3
4 欢迎光临天祥电子 www.txmcu.cn
5
6 *******************************************************************/
7
8 #include <AT89X52.H> //头文件
9 #include "Key.h"
10 #include "Led.h"
11 #include "UART.h"
12 #include "pdiusbd12.h"
13 #include "UsbCore.h"
14 #include "config.h"
15
16 unsigned char s6,s7,s10,s11,s14,s15,s,again1,again2,again3,again4,again5,again6,pp,qq,rr,ss,tt,uu;
17
18 /*
19 code uint8 HeadTable[][74]={
20 "********************************************************************\r\n",
21 "****** 《圈圈教你玩USB》之 USB键盘 ******\r\n",
22 "****** AT89S52 CPU ******\r\n",
23 "****** 建立日期:",__DATE__," ******\r\n",
24 "****** 建立时间:",__TIME__," ******\r\n",
25 "****** 作者:电脑圈圈 ******\r\n",
26 "****** 欢迎访问作者的 ******\r\n",
27 "****** USB专区:http://group.ednchina.com/93/ ******\r\n",
28 "****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
29 "****** BLOG2:http://computer00.21ic.org ******\r\n",
30 "****** 请按K1-K8分别进行测试 ******\r\n",
31 "****** K1:左Ctrl键 K2:左Shift键 K3:左Alt键 K4:1键 ******\r\n",
32 "****** K5:2键 K6:3键 K7:Caps Lock键 K8:Num Lock键 ******\r\n",
33 "****** 注意:数字键是数字小键盘,必须打开Num Lock才是数字键 ******\r\n",
34 "********************************************************************\r\n",
35 }; */
36 code uint8 HeadTable[][74]={
37 "********************************************************************\r\n",
38 "****** “天祥电子”之 USB鼠标 ******\r\n",
39 "****** www.txmcu.cn ******\r\n",
40 "****** www.txmcu.com ******\r\n",
41 "****** AT89S52 CPU ******\r\n",
42 "****** 建立日期:",__DATE__," ******\r\n",
43 "****** 建立时间:",__TIME__," ******\r\n",
44 "****** 请按下列按键分别进行测试 ******\r\n",
45 "****** S10:左Shift键 S11:左Alt键 S14:1键 ******\r\n",
46 "****** S15:2键 S6:Caps Lock键 S7:Num Lock键 ******\r\n",
47 "****** 注意:数字键是数字小键盘,必须打开Num Lock才是数字键 ******\r\n",
48 "********************************************************************\r\n",
49 };
50
51 /********************************************************************
52 函数功能:根据按键情况返回报告的函数。
53 入口参数:无。
54 返 回:无。
55 备 注:无。
C51 COMPILER V8.02 MAIN 06/17/2010 09:51:38 PAGE 2
56 ********************************************************************/
57 void SendReport(void)
58 {
59 1 //需要返回的8字节报告的缓冲
60 1 //通过报告描述符的定义及HID用途表文档,可知Buf[0]的D0是左Ctrl键,
61 1 //D1是左Shift键,D2是左Alt键,D3是左GUI(即Window键),
62 1 //D4是右Ctrl,D5是右Shift,D6是右Alt,D7是右GUI键。
63 1 //Buf[1]保留,值为0。Buf[2]~Buf[7]为键值,最多可以有6个。
64 1 //由于我们这里普通键最多只有5个,因此不会超过6个。
65 1 //对于实际的键盘,如果按键数太多时,后面的6个字节都为0xFF,
66 1 //表示按下的键太多,无法正确返回。
67 1
68 1 uint8 Buf[8]={0,0,0,0,0,0,0,0};
69 1 //由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
70 1 uint8 i=2;
71 1 //if(s)
72 1 //{
73 1 s=0;
74 1 pp=0;
75 1 qq=0;
76 1 if(s14)
77 1 {
78 2 s14=0;
79 2 Buf[i]=0x59; //S14为数字小键盘1键。
80 2 i++; //切换到下个位置。
81 2 }
82 1 if(s15)
83 1 {
84 2 s15=0;
85 2 Buf[i]=0x5A; //S15数字小键盘2键。
86 2 i++; //切换到下个位置。
87 2 }
88 1
89 1 //报告准备好了,通过端点1返回,长度为4字节。
90 1 D12WriteEndpointBuffer(3,8,Buf);
91 1 Ep1InIsBusy=1; //设置端点忙标志。
92 1 //}
93 1 }
94 ////////////////////////End of function//////////////////////////////
95
96 /********************************************************************
97 函数功能:主函数。
98 入口参数:无。
99 返 回:无。
100 备 注:无。
101 ********************************************************************/
102 void main(void) //主函数
103 {
104 1 uint8 i;
105 1 uint16 id;
106 1 uint8 InterruptSource;
107 1
108 1 EA=1; //打开中断
109 1 InitKeyboard(); //初始化按键
110 1 InitUART(); //初始化串口
111 1
112 1 for(i=0;i<19;i++) //显示信息
113 1 {
114 2 Prints(HeadTable[i]);
115 2 }
116 1
117 1 id=D12ReadID();
C51 COMPILER V8.02 MAIN 06/17/2010 09:51:38 PAGE 3
118 1
119 1 Prints("Your D12 chip\'s ID is: ");
120 1 PrintShortIntHex(id);
121 1
122 1 if(id==0x1012)
123 1 {
124 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
125 2 }
126 1 else
127 1 {
128 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
129 2 }
130 1
131 1 UsbDisconnect(); //先断开USB连接
132 1 UsbConnect(); //将USB连接上
133 1 ConfigValue=0; //配置值初始化为0
134 1
135 1 while(1) //死循环
136 1 {
137 2 if(D12GetIntPin()==0) //如果有中断发生
138 2 {
139 3 outportb(D12COMMAND,0xF4);// READ_INTERRUPT_REGISTER);
140 3 InterruptSource=inportb(D12DATA);//D12ReadByte(); //读回第一字节的中断寄存器
141 3 if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
142 3 if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理
143 3 if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理
144 3 if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理
145 3 if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理
146 3 if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理
147 3 if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理
148 3 if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理
149 3 }
150 2 if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
151 2 {
152 3 if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
153 3 {
154 4 KeyCanChange=0; //禁止按键扫描
155 4 if(s) //如果有按键事件发生
156 4 {
157 5 SendReport(); //则返回报告
158 5 }
159 4 KeyCanChange=1; //允许按键扫描
160 4 }
161 3 }
162 2 }
163 1 }
164 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 278 ----
CONSTANT SIZE = 1290 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 12
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 + -