找回密码
 立即注册
楼主: soma

学习《Ai8051U教学视频》学习心得,送强大的 Ai8051U实验箱 | 已送

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-07-01 00:52:47
已绑定手机

19

主题

3233

回帖

5355

积分

论坛元老

积分
5355
发表于 2024-12-16 22:40:14 | 显示全部楼层
第9集 数码管上
数码管的介绍以及外观和类型有哪些。以及数码管组成,还有数码管abcdefgdp的定义,试验箱使用的是4位共阴数码管。如何用ISP软件生成显示数字。还有hc595锁存芯片的使用。hc595数据的传递先进先出,后进数据保存在当前595并锁存输出。由于人眼的识别频率在50hz左右,所以数码管数据刷新率要在20ms以内否则人眼就会看到明显的抖动。还有这节课作业:
9.png
可以设置一个10ms的调度程序,并设置一个全局变量类型为无符号的int类型每完成一次调度变量+1,由于Task_Comps是在c文件定于所以一个问题无法在io.c里面直接关闭调度,所以办法就是按下一个按键发送一个对一个变量进行处理,当按下按键后,调度程序不在对数据进行自增。部分代码如下
  1. void PLED_40(void)
  2. {
  3.         u8 cod[8];
  4.         cod[0] = 0x0f;                //表示开启P0-P3
  5.         cod[1] = 0X01;                //P0端口       
  6.         cod[2] = 0X01;                //P1
  7.         cod[3] = ~T_NUM[state_now];                //P2
  8.         cod[4] = 0X01;                //P3
  9.         LED40_SendData( cod,5 );
  10.        
  11.         P2 = ~T_NUM[state_now];
  12.        
  13.         state_now++;
  14.         if( state_now>7 )
  15.                 state_now = 0;
  16. }
  17. void SEG_PC( void )
  18. {
  19.         u8 cod[8];
  20.        
  21. //        cod[0] = SEG_NUM[shi/10];                                        //小时的十位数的数码管段码
  22. //        cod[1] = SEG_NUM[shi%10];
  23. //        cod[2] =SEG_NUM[16];                                                //数码管刷段码和位码
  24. //        cod[3] = SEG_NUM[fen/10];                                        //分钟
  25.         cod[0] = SEG_NUM[1];                                        //小时的十位数的数码管段码
  26.         cod[1] = 0xBF;   //SEG_NUM[shi%10];
  27.         cod[2] = SEG_NUM[0];                                                //数码管刷段码和位码
  28.         cod[3] = SEG_NUM[0];                                        //分钟
  29.         cod[4] = SEG_NUM[time%1000];
  30.         cod[5] =(SEG_NUM[time%100/10])|0x80;                                                //数码管刷段码和位码       
  31.         cod[6] = SEG_NUM[time/10%10];                                        //分钟
  32.         cod[7] = SEG_NUM[time%10];
  33.        
  34.         SEG7_ShowCode(cod);
  35. }
复制代码

使用擎天柱模拟8位数码管输出。
  1. void KEY_Task(void)
  2. {
  3.         if( P32 == 0 )
  4.         {
  5.                 Key_Vol[0]++;
  6.                 if( Key_Vol[0]==5 )
  7.                 {
  8.                         //按键按下的任务
  9.                         //printf( "按键单击\r\n" );
  10.                         timestop=1;
  11.                 }
  12.         }
  13.         else
  14.         {
  15.                 Key_Vol[0] = 0;
  16.         }
  17. }
复制代码
  1. void TIMECOUNT_Task(void)
  2. {
  3.         if(timestop==0)
  4.         time++;
  5.         if(time>3000) time=0;
  6. }
复制代码
程序还需部分优化,按下一次按键开始计时,在按一下停止计时。现只有停止计时还无恢复计时部分。




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-07-01 00:52:47
已绑定手机

19

主题

3233

回帖

5355

积分

论坛元老

积分
5355
发表于 2024-12-30 22:42:57 | 显示全部楼层
第10集、虚拟键盘LED和数码管
虚拟键盘:
功能: 在虚拟键盘上按键然后发送相应的键值到设备
命令格式: 4BH 45H 59H 50H 00H x1 00H 00H
命令说明:  
第1~4字节: 命令头
第5字节: 保留
第6字节: 按键键值
第7~8字节: 保留
示例: 接收到4BH 45H 59H 50H 00H 30H 00H 00H
  表示数字键0被按下
如果要读取按下按键就是读取UsbOutBuffer的第6位,也就是UsbOutBuffer[5],但是这个输出的是acsii码的数字如果是直接输出立即数的话就变成原数字+48,如果要用立即数输出就要减‘0’或数字立即数48才能正常显示正确。
10.png
作业可以通过一个8位数组来实现该功能。没输入一个数字数组内的i++,当加1到7后8位密码输入完成,通过判断数值是否和密码一致,一致则输出open否则对8位数组中的i清零并重新输入。但是有个问题成功后是多久是否要退出还是通过按键来实现重新输入。但这只是一个雏形。所以可以暂时不考虑。

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-1 05:50 , Processed in 0.123392 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表