AI8051U 第六课: I/O 输入输出
昨晚尝试使用 Keil 创建项目, 发现无法找到设备型号 AI8051U 32bits ,并且打开下载回来的项目, 编译按钮和配置按钮都是灰色的。最后才弄清楚,原来我没有安装 Keil C251的缘故。下载安装后就正常了。
下面是第六课的学习记录。
1. 第六课验证了我的想法。 前面使用 P_SW2 |= 0x80 的写法, 可以使用 EAXFR = 1 代替。
2. 讲了 I/O 口的四种工作模式。 初步理解是某些场景需要不同的电流, 所以需要用到对应的模式。 目前我们只用到 准双向。 这一块知识还需要在后续学习中去检验。
3. 课程着重讲了按钮的抖动和处理, 并介绍了处理抖动的方法。 这个由于以前使用 89C52RC 时有过了解, 理解起来没有障碍。
4. 重点完成了两个练习。代码和效果如下。
练习(1) : 按一下 P32 灯亮 / 灯灭
- #include "ai8051u.h" //调用头文件
- #include "stc32_stc8_usb.h" //调用头文件
-
- //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- bit state = 0;
-
- void Delay(unsigned int ms) //@24.000MHz
- {
- unsigned char data i, j;
-
- while(ms--){
- i = 24;
- j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
- }
-
-
- void main(void)
- {
- //P_SW2 |= 0x80; //B7位写1,使能访问XFR 等同于 EAFXR = 1;
- WTST = 0;
- EAXFR = 1;
- CKCON = 0;
-
-
- P0M1 = 0x00; P0M0 = 0x00;
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M1 = 0x00; P3M0 = 0x00;
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
- P6M1 = 0x00; P6M0 = 0x00;
- P7M1 = 0x00; P7M0 = 0x00;
-
- usb_init(); //USB CDC 接口配置
-
- IE2 |= 0x80; //使能USB中断
- EA = 1; //IE |= 0X80;
-
- while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
-
- // P2 = 0xFE;
- P20 = 0;
-
- while(1)
- {
-
- if(P33 == 0){
-
- Delay(20);
- while(P33 == 0);
- Delay(20);
-
- state = !state;
- P20 = state;
-
- printf("state = %d \r\n", (unsigned int)state);
-
- }
-
-
-
- if (bUsbOutReady)
- {
- //USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
-
-
- usb_OUT_done();
- }
-
- }
- }
复制代码
练习(2) : 按一下 P32 亮一颗灯,直到全部点亮。
- #include "ai8051u.h" //调用头文件
- #include "stc32_stc8_usb.h" //调用头文件
-
- //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- unsigned int state = 0xFF;
-
- void Delay(unsigned int ms) //@24.000MHz
- {
- unsigned char data i, j;
-
- while(ms--){
- i = 24;
- j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
- }
-
-
- void main(void)
- {
- //P_SW2 |= 0x80; //B7位写1,使能访问XFR 等同于 EAFXR = 1;
- WTST = 0;
- EAXFR = 1;
- CKCON = 0;
-
-
- P0M1 = 0x00; P0M0 = 0x00;
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M1 = 0x00; P3M0 = 0x00;
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
- P6M1 = 0x00; P6M0 = 0x00;
- P7M1 = 0x00; P7M0 = 0x00;
-
- usb_init(); //USB CDC 接口配置
-
- IE2 |= 0x80; //使能USB中断
- EA = 1; //IE |= 0X80;
-
- while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
-
- // P2 = 0xFE;
- // P2 = FF;
-
- while(1)
- {
-
- if(P33 == 0){
-
- Delay(20);
- while(P33 == 0);
- Delay(20);
-
- // 按一次, 右移1位,直到等于 0
- if(state > 0){
- state = state >> 1;
- P2 = state;
- }
-
- printf("state = %d \r\n", (unsigned int)state);
-
- }
-
-
-
- if (bUsbOutReady)
- {
- //USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
-
-
- usb_OUT_done();
- }
-
- }
- }
复制代码
|