第十集 虚拟LED数码管 的学习记录 通过AIapp-isp软件中的“仿真调试接口”找到接口协议及帮助,可以找到适合使用的各种虚拟设备驱动函数。 1. 利用擎天柱转换板,向PC发送数据,用AIapp_isp软件中的仿真调试功能,虚拟擎天柱的各个IO端口。 通过DIP40—led界面展示出来。 库函数声明: void LED40_SendData(BYTE *dat, BYTE size); 库函数调用: BYTEcod[8]; cod[0] =0x0f; //第6字节:P0~P5端口用0屏蔽(bit0:P0, bit1:P1, bit2:P2,bit3:P3,bit4:P4,...) cod[1] =0x12; //bit0:P0发送的数据(8位) cod[2] =0x34; //bit2:P0发送的数据(8位) cod[3] =0x56; //bit3:P0发送的数据(8位) cod[4] =0x78; //bit4:P0发送的数据(8位) LED40_SendData(cod, 5);//“cod”指针数组,“5”里面包含5个对应内容字节的数据。 2. 虚拟数码管。虚拟一个8位的数码管 可以调用4个函数实现不同显示效果,常用的是直接显示段码 库函数调用: | BYTE cod[8];//定义一个数组
cod[0] = 0x3f;
cod[1] = 0x06;
cod[2] = 0x5b;
cod[3] = 0x4f;
cod[4] = 0x66;
cod[5] = 0x6d;
cod[6] = 0x7d;
cod[7] = 0x27;
SEG7_ShowCode(cod);//调用发送函数 |
3. 虚拟键盘。虚拟一个多功能键盘,向单片机发送指令和数据,接收处理并回传到USB调试接口,用虚拟的8位数码管显示出来。 一切都是虚拟,所以需要将这个函数规定的键值按照规律翻译,才能正确显示出来,视频教学里面采用“-48”,巧妙的同步的一致的显示在虚拟的数码管上。 冲哥非常厉害! 虚拟键盘直接以串行的方式发送出来,需要在“UsbOutBuffer[5]”提取。 if (bUsbOutReady) //如果接收到了数据
{
REC_NUM = UsbOutBuffer[5]; //验证“UsbOutBuffer[5]”只有PC发送了数据才会更新,无新数据不会变。
//放在了缓存里。
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
4. 课后练习:8位密码锁 -1.没有输入时,显示“- - - - - - - -” -2.有输入时,按下一个按键,开始按顺序写入 例如,第一个按下1,显示“1 - - - - - - -” 例如,第二个按下3,显示“1 3 - - - - - -” -3.当按下的密码为“ 1 2 3 4 5 6 7 8”时,数码管显示open的字符,否则,还是显示“- - - - - - - -” /* 课后任务8位密码锁 -1.没有输入时,显示“- - - - - -- -” -2.有输入时,按下一个按键,开始按顺序写入 例如,第一个按下1,显示“1 - - - - - - -” 例如,第二个按下3,显示“1 3 - - - - - -” -3.当按下的密码为“ 1 2 3 4 5 67 8”时,数码管显示open的字符,否则,还是显示“- -- - - - - -” */ 下面是实现该功能的部分程序,数码管段码数组用软件生成,放在SEG_NUM[19]数组里。 模拟当中出现的问题是,第8位显示不出来,直接跳转到“open”。里面还需要加延时语句。暂时不加。 还有就是开机显示“--------”部分,模拟的时候来不及显示,只有按出错了就显示了。哈哈,这单片机运行速度太快了!PC反应不过来。 u8 Step =0; u8REC_NUM = 0xff; u8 stop =0; voidTASK_5( void )//任务五 { u8 i ; u8 cod[8]; //新的函数(数组)里面需包含关键字“cod” if(stop == 0) //开机显示“--------”,只运行一次。如果要一直显示可以直接取消stop标志判断。持续发送。 { for(i=0;i<8;i++) { cod = SEG_NUM[19]; } SEG7_ShowCode(cod); // stop = 1; } if(REC_NUM != 0xff) //有新数据 { switch(Step) { case 0:cod[Step]=SEG_NUM[REC_NUM];break; //装入第1位的段码 case 1:cod[Step]=SEG_NUM[REC_NUM];break; //装入第2位的段码 case 2:cod[Step]=SEG_NUM[REC_NUM];break; //装入第3位的段码 case 3:cod[Step]=SEG_NUM[REC_NUM];break; //装入第4位的段码 case 4:cod[Step]=SEG_NUM[REC_NUM];break; //装入第5位的段码 case 5:cod[Step]=SEG_NUM[REC_NUM];break; //装入第6位的段码 case 6:cod[Step]=SEG_NUM[REC_NUM];break; //装入第7位的段码 case 7:cod[Step]=SEG_NUM[REC_NUM];break; //装入第8位的段码 default:break; } REC_NUM = 0xff;//清空缓存 SEG7_ShowCode(cod); Step++; if(Step ==8) { if((cod[0]==SEG_NUM[1])&&(cod[1]==SEG_NUM[2])&&(cod[2]==SEG_NUM[3])&&(cod[3]==SEG_NUM[4])&& (cod[4]==SEG_NUM[5])&&(cod[5]==SEG_NUM[6])&&(cod[6]==SEG_NUM[7])&&(cod[7]==SEG_NUM[8])) { cod[0] = SEG_NUM[20]; //第1位显示的段码 cod[1] = SEG_NUM[20]; //第2位显示的段码 cod[2] = SEG_NUM[20]; //第3位显示的段码 cod[3] = SEG_NUM[20]; //第4位显示的段码 cod[4] = SEG_NUM[17]; //第5位显示的段码 cod[5] = SEG_NUM[18]; //第6位显示的段码 cod[6] = SEG_NUM[14]; //第7位显示的段码 cod[7] = SEG_NUM[16]; //第8位显示的段码 } else//输入错误 { for(i=0;i<8;i++) { cod =SEG_NUM[19]; } Step = 0; } } SEG7_ShowCode(cod); //函数里必须包含调用的发送函数 } }
今天是2025年的1月1号。记录我的学习历程。 跟着冲哥学,学到了好多知识!感谢冲哥!感谢国芯! 2025,新的一年,祝愿大家新年快乐!收获满满!
|