📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 06/17/2010 09:52:09 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 unsigned char s6,s7,s10,s11,s14,s15,s,again1,again2,pp,qq;
16
17 code uint8 HeadTable[][74]={
18 "********************************************************************\r\n",
19 "****** “天祥电子”之 USB鼠标 ******\r\n",
20 "****** www.txmcu.cn ******\r\n",
21 "****** www.txmcu.com ******\r\n",
22 "****** AT89S52 CPU ******\r\n",
23 "****** 建立日期:",__DATE__," ******\r\n",
24 "****** 建立时间:",__TIME__," ******\r\n",
25 "****** 请按下列按键分别进行测试 ******\r\n",
26 "****** S6:光标左移 S7:光标右移 S10:光标上移 S11:光标下移 ******\r\n",
27 "****** S14:鼠标左键 S15:鼠标右键 ******\r\n",
28 "********************************************************************\r\n",
29 };
30
31
32 /********************************************************************
33 函数功能:根据按键情况返回报告的函数。
34 入口参数:无。
35 返 回:无。
36 备 注:无。
37 ********************************************************************/
38 void SendReport(void)
39 {
40 1 //需要返回的4字节报告的缓冲
41 1 //Buf[0]的D0就是左键,D1就是右键,D2就是中键(这里没有)
42 1 //Buf[1]为X轴,Buf[2]为Y轴,Buf[3]为滚轮
43 1 uint8 Buf[4]={0,0,0,0};
44 1
45 1 //我们不需要KEY1~KEY6按键改变的信息,所以先将它们清0
46 1 // KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
47 1 // KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
48 1
49 1 //如果有按键按住,并且不是KEY7、KEY8(左、右键)
50 1 //或者KEY7、KEY8任何一个键有变动的话,则需要返回报告
51 1 if(s)
52 1 {
53 2 s=0;
54 2 if(s6)
55 2 {
C51 COMPILER V8.02 MAIN 06/17/2010 09:52:09 PAGE 2
56 3 s6=0;
57 3 Buf[1]=-1; //这里一次往左移动一个单位。
58 3 }
59 2 if(s7)
60 2 {
61 3 s7=0;
62 3 Buf[1]=1; //这里一次往右移动一个单位。
63 3 }
64 2 if(s10)
65 2 {
66 3 s10=0;
67 3 Buf[2]=-1; //这里一次往上移动一个单位。
68 3 }
69 2 if(s11)
70 2 {
71 3 s11=0;
72 3 Buf[2]=1; //这里一次往下移动一个单位。
73 3 }
74 2 if(s14)
75 2 {
76 3 s14=0;
77 3 Buf[0]|=0x01; //D0为鼠标左键
78 3 }
79 2 if(s15)
80 2 {
81 3 s15=0;
82 3 Buf[0]|=0x02; //D1为鼠标右键
83 3 // Buf[0]|=0x01; //D0为鼠标左键
84 3 }
85 2 //报告准备好了,通过端点1返回,长度为4字节。
86 2 D12WriteEndpointBuffer(3,4,Buf);
87 2 if(pp|qq)
88 2 {
89 3 pp=0;
90 3 qq=0;
91 3 D12WriteEndpointBuffer(3,4,Buf);
92 3
93 3 }
94 2 Ep1InIsBusy=1; //设置端点忙标志。
95 2 }
96 1 }
97 ////////////////////////End of function//////////////////////////////
98
99 /********************************************************************
100 函数功能:主函数。
101 入口参数:无。
102 返 回:无。
103 备 注:无。
104 ********************************************************************/
105 void main(void) //主函数
106 {
107 1 uint8 i;
108 1 uint16 id;
109 1 uint8 InterruptSource;
110 1
111 1 EA=1; //打开中断
112 1 InitKeyboard(); //初始化按键
113 1 InitUART(); //初始化串口
114 1
115 1 for(i=0;i<18;i++) //显示信息
116 1 {
117 2 Prints(HeadTable[i]);
C51 COMPILER V8.02 MAIN 06/17/2010 09:52:09 PAGE 3
118 2 }
119 1
120 1 id=D12ReadID();
121 1
122 1 Prints("Your D12 chip\'s ID is: ");
123 1 PrintShortIntHex(id);
124 1
125 1 if(id==0x1012)
126 1 {
127 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
128 2 }
129 1 else
130 1 {
131 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
132 2 }
133 1
134 1 UsbDisconnect(); //先断开USB连接
135 1 UsbConnect(); //将USB连接上
136 1 ConfigValue=0; //配置值初始化为0
137 1
138 1 while(1) //死循环
139 1 {
140 2 if(D12GetIntPin()==0) //如果有中断发生
141 2 {
142 3 outportb(D12COMMAND,0xF4);// READ_INTERRUPT_REGISTER);
143 3 //D12WriteCommand(READ_INTERRUPT_REGISTER); //写读中断寄存器的命令
144 3 InterruptSource=inportb(D12DATA);//D12ReadByte(); //读回第一字节的中断寄存器
145 3 if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
146 3 if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理
147 3 if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理
148 3 if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理
149 3 if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理
150 3 if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理
151 3 if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理
152 3 if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理
153 3 }
154 2 if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
155 2 {
156 3 LEDs=~KeyPress; //利用板上8个LED显示按键状态,按下时亮
157 3 if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
158 3 {
159 4 KeyCanChange=0; //禁止按键扫描
160 4 if(s) //如果有按键事件发生
161 4 {
162 5 SendReport(); //则返回报告
163 5 }
164 4 KeyCanChange=1; //允许按键扫描
165 4 }
166 3 }
167 2 }
168 1 }
169 ////////////////////////End of function//////////////////////////////
170
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 337 ----
CONSTANT SIZE = 1212 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 8
IDATA SIZE = ---- ----
C51 COMPILER V8.02 MAIN 06/17/2010 09:52:09 PAGE 4
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 + -