本帖最后由 noonezero 于 2023-9-10 09:17 编辑
第十课:数码管的动态显示
动态点亮八个数码管控制原理
P7 开关显示对应数码管对应的值
作业代码
- #include <STC32G.H>
- #include <intrins.h>
- #include "../COMM/stc32_stc8_usb.h"
-
- #define KEY1 P32 // 功能按键一
- #define KEY2 P33 // 功能按键二
-
- #define BEEP P54 // 蜂鸣器引脚,低电平响
-
- u8 SEG_Tab[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF
- }; // 这里不写多少也行,会算出来
- bit onoroff = 0; // 开机还是关机
- u32 count = 18456000;
-
-
- //USB调试及复位所需定义
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
- void sys_init();
-
-
- void Delay_ms(int x) //@24.000MHz
- {
- unsigned long edata i;
- for(; x > 0; x--)
- {
- _nop_();
- _nop_();
- _nop_();
- i = 5998UL;
- while (i) i--;
- }
- }
-
- void show(u8 P7index, u8 showtabindex) // P7index 从1开始
- {
- u8 indexnum = 0x01;
- P6 = 0xFF;
- P7 = ~(indexnum << (8 - P7index));
- P6 = SEG_Tab[showtabindex];
- Delay_ms(1);
- }
-
- void showinit()
- {
- show(1, 0);
- show(2, 0);
- show(3, 10);
- show(4, 0);
- show(5, 0);
- show(6, 10);
- show(7, 0);
- show(8, 0);
- }
-
- void countshow() // count计数显示
- {
- u32 a = count / 100; // 显示延时了好多,这里如果按1000算 太慢了,100差不多
- int mouth =a/(60 * 60); // 求小时
- int min =(a - mouth * (60 * 60)) / 60; // 求分
- int s = a - mouth * (60 * 60) - min * 60; // 求秒
- show(1, (u8)mouth/10);
- show(2, (u8)mouth%10);
- show(3, 10);
-
- show(4, (u8)min/10);
- show(5, (u8)min%10);
- show(6, 10);
-
- show(7, (u8)s/10);
- show(8, (u8)s%10);
- }
-
- void main()
- {
- sys_init();
- usb_init(); //USB初始化
- EA = 1;
-
- while(1)
- {
- if(onoroff)
- {
- count++;
- countshow();
- }
- else
- {
- showinit();
- }
- Delay_ms(1); // 延时
-
- if(KEY1 == 0)
- {
- Delay_ms(10); // 软件消抖
- if(KEY1 == 0)
- {
- BEEP = 0; // 打开蜂鸣器
- Delay_ms(10); // 延时
- BEEP = 1; // 关闭蜂鸣器
- while(KEY1 == 0) // 死循环 等待抬起
- {
- showinit();
- }
- onoroff = !onoroff;
- count = 0;
- }
- }
- }
-
- }
-
-
- void sys_init()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
- P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
- P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
- }
复制代码
|