本帖最后由 千年老姚 于 2023-1-4 19:26 编辑
各位晚上好!
刚才看完了第十三集,以下为简略版笔记
若笔记有误,请各位指正
第十章:数码管的动态显示
1.数码管动态刷新的原理
后面附图
2.控制原理
注意:延时不能太短,人眼难以分辨50hz以上动态刷新
3.八位数码管的同时点亮
1.在上一节课的基础上,新增一个位码选择的数组
数组
P77 P76 P75 P74 P73 P72 P71 P70
1 2 3 4 5 6 7 8 十六进制
点1 0 1 1 1 1 1 1 1 7F
点2 1 0 1 1 1 1 1 1 BF
点3 1 1 0 1 1 1 1 1 DF
点4 1 1 1 0 1 1 1 1 EF
点5 1 1 1 1 0 1 1 1 F7
点6 1 1 1 1 1 0 1 1 FB
点7 1 1 1 1 1 1 0 1 FD
点8 1 1 1 1 1 1 1 0 FE
2.调用数组选择位码
- //以下省略部分头文件
- u8 SEG_Tab[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9,参照上方码表
- u8 COM_Tab[8]= {0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE} //点亮某个数码管
- void main()
- {
- while(1)
- {
- P7 = COM_Tab[0];
- P6 = SEG_Tab[0];
- delay_ms(200);
- P7 = COM_Tab[1];
- P6 = SEG_Tab[1];
- delay_ms(200);
- P7 = COM_Tab[2];
- P6 = SEG_Tab[2];
- delay_ms(200);
- P7 = COM_Tab[3];
- P6 = SEG_Tab[3];
- delay_ms(200); //显示0123
- }
- }
复制代码
简略写法(省去部分头文件,函数定义):
- while(1)
- {
- P7 = COM_Tab[num];
- P6 = SEG_Tab[num+1];
- delay_ms(200);
- num++;
- if(num > 7)
- num = 0;
- }
复制代码
3.新建一个数组选择每个位需要显示的内容
- //以下省略部分头文件
- u8 SEG_Tab[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9,参照上方码表
- u8 COM_Tab[8]= {0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE} //点亮某个数码管
- u8 Show_Tab[8] = [1,9,1,9,8,1,0,0]
- void main()
- {
- while(1)
- {
- P7 = COM_Tab[num]; //位码的选择
- P6 = SEG_Tab[Show_Tab[num]]; //需要显示数字的内码 赋给 P6
- //num = 0 —> Show_Tab[num] = 1 —> P6 = 0xF9
- P6 = SEG_Tab[num+1];
- delay_ms(200);
- num++;
- if(num > 7)
- num = 0;
- }
- }
复制代码
实战小练:简易10秒免单计数器
1.在前四位数码管上显示目标时间,即“ 10. 00 ”表示定时时间10秒钟
2.后四位显示当前的计时00.00,最小单位为10ms.
3.按下开始按钮后,每10ms最末尾的数字+1;直到按下结束按钮后停止计数。
- //以下省略部分头文件
- //u8 SEG_Tab[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9,参照上方码表
- //带小数点段码:最高位- 0x80就可以
- u8 SEG_Tab[10] = { 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
- u8 COM_Tab[8]= {0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE}; //点亮某个数码管
- u8 Show_Tab[8] = {0,0,0,0,10,0,0,0};
- u32 TimCount = 0; //计数单位1ms
- bit RUN_State = 0 //开始运行/结束运行
- void main()
- {
- while(1)
- {
-
- Show_Tab[0] = 1;
- Show_Tab[1] = 10;
- Show_Tab[2] = 0;
- Show_Tab[3] = 0;
-
-
- P7 = COM_Tab[num]; //位码的选择
- P6 = SEG_Tab[Show_Tab[num]]; //需要显示数字的内码 赋给 P6
- //num = 0 —> Show_Tab[num] = 1 —> P6 = 0xF9
- P6 = SEG_Tab[num+1];
- delay_ms(200);
-
- if (RUN_State == 1)
- {
- TimCount++;
- Show_Tab[4] = TimCount/1000%10;
- Show_Tab[5] = TimCount/1000%10; //显示小数点和千位
- Show_Tab[6] = TimCount/100%10; //取百位
- Show_Tab[7] = TimCount/10%10; //取十位
-
- }
-
- num++;
- if(num > 7)
- num = 0;
-
- if (KEY1 == 0)
- {
- delay_ms(10);
- if (KEY1 == 0)
- {
- BEEP = 0;
- delay_ms(10);
- BEEP = 1;
- while(KEY1 == 0)
- {
- P7 = COM_Tab[num];
- P6 = SEG_Tab[Show_Tab[num]];
- delay_ms(200);
- num++;
- if(num > 7)
- num = 0;
- }
- if (RUN_State == 0)
- RUN_State = !RUN_State;
- }
- }
-
- }
- }
复制代码
总结:
1.了解数码管怎么实现的动态显示。
2.学会每一位的数码管的任意内容的显示。
课后练习:
一、做一个简易时钟,功能如下
1.初始状态显示 00 - 00 - 00,分别作为时,分,秒
2.每隔一秒钟,秒+1,一分钟,分+1,以此类推
3.时间到达00 - 00 - 30的时候,蜂鸣响3秒钟表示闹钟 |