第10集 数码管的动态显示
点亮一位数码管:位码→段码→延时
点亮多个数码管:第一个数码管的位码→段码→延时→第2个数码管的位码→段码→延时→……第N个数码管的位码→段码
单个数码管延时在1ms左右,所有数码管的总延时加起来控制在20ms左右,即全部数码管刷新控制在50Hz以上,否则将明显闪烁。
定义段码数组,将0-9,0-9带小数点的16进制写在里面。
u8 SEG_Tab = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
定义位码数组,通过控制com0-com7控制其位码来点亮不同的数码管
u8 COM_Tab = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };
定义一个8位变量num,通过函数调用上面数组,进而控制点亮某位数码管并使其显示指定的数字。
TimCount是计数器?暂时没学过,不太了解。
第11集 定时器的使用
STC32G 系列内部包含了 5 个24 位定时器/计数器。
定时器是一个加法计算器,只能做加法。
设置为ET0=1和IE=0X02效果是相等的,前者更方便且不影响别的位。
TM0PS 定时器0的8位预分频寄存器,默认为0
默认不做设置的时候,是12分频器
Timer0_Init(); //定时器0初始化
INT0_Init(); //外部中断0初始化
放在主函数中EA=1(中断总开关)前面。
interrupt这个关键字,一定不能错,这是中断特有的关键字
STC32G规格书中可以查到所有定时器的中断号,定时器0的中断号是1
学会使用STCAI-ISP自带的定时器计算器,更加快捷方便。
没有试验箱只有屠龙刀,暂时不方便模拟
第13集 简单多任务处理 上
学习模块化编程复习:
创建程序文件三部曲
新建文件夹并保存,添加到工程(双击source Group1选择.c文件),添加引用路径(kile软件魔术棒→c251→include paths→……选择文件夹)
函数定义三步:定义,声明,调用
新知识:
关键字 :extern
用在变量或者函数的声明前,用来说明这个变量或函数是在别处定义的,要在此处引用。
extern修饰的变量不能赋初值
bdata 位寻址变量,可以单独的寻找每一个位
用sbit关键词去定义每一个位,每一位都可以重新命名。
static 静态变量
它的特点是,只有第一次执行的时候才会给它赋值,之后在该函数所有的执行次数中,它的值都是上一次函数执行结束后的值,即它可以保持前次的执行结果。
if……else if语句
if (条件) {语句 1;}
else if (条件 2) {语句 2;}
else if (条件 3) {语句 3;}
... ...
else {语句 n;}
他的执行过程是:依次判断条件表达式的值,当出现某个值为“真”时,则执行相对应的语句,然后跳出整个 if的语句块,执行“语句 n”后面的程序;如果所有的表达式都为“假”,则执行 else 分支的“语句 n”后,再执行“语句 n”后边的程序。
{:4_250:}持之以恒
第13集 简易多任务处理器 中
.h文件的规范书写头文件
引脚定义
变量声明
函数声明
垂直范围内的代码选择shift+ALT和鼠标配合
这功能挺好,之前看冲哥操作过几次没看明白是怎么回事
按键按下的时间检测不能一直增加,因为会溢出摘自其他书籍:当我们程序中写 TR0 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR0 = 0以后,定时器就会停止加 1,其值会保持不变化。TF0,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL0加 1 一次,当 TL0 加到 255 后,再加 1,TL0 变成 0,TH0 会加 1 一次,如此一直加到 TH0和 TL0 都是 255(即 TH0 和 TL0 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH0 和 TL0 同时都变为 0,只要一溢出,TF0 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。
补 第12集 计数器的使用
T1_GATE:控制定时器1,置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1。T1_C/T:控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T1/P3.5外部脉冲进行计数)。
本集用作计数器时,T1_GATE=0,T1_C/T=1;
数字电平从0变为1 的那一瞬间叫作上升沿 ,从1到0的那一瞬间叫作下降沿。
定时器1的中断号是3.
单独一个位取反用!,如P60!=P60;//将P60的电平读取出来然后取反然后再赋值给P60.
学会使用ISP中自带的io端口配置工具设置io口,如打开内部4.1K上拉电阻。
M法测速:又叫频率测量法。在一个固定的时间内(以s为单位),统计这段时间内的变卖其脉冲数,计算速度值。
第13集 简单多任务处理 下
根据中集的列表进行按键状态的判断和读取涉及for循环语句,摘自其他书籍:
for语句
在 C 语言中,for 语句最为灵活,它将一个由多条语句组成的代码块执行特定的次数。for语句也称for循环,因为程序通常会执行此语句多次。for语句的一般使用格式如下。
for(表达式1;表达式2;表达式3)
语句
上述格式语句的执行过程如下。
1)先求解表达式1。
2)求解表达式 2,如果值为真(非 0) ,则执行 for 语句中指定的内嵌语句,然后执行下面第 3 步;如果值为假(0) ,则结束循环,转到第5步。
3)求解表达式3。
4)转回上面第2步继续执行。
5)循环结束,执行for语句下面的一个语句。
具体流程如图所示
第13集 简单多任务处理 终
本集主要讲述模块化处理创建几个模块的.c和.h文件,分别放在对应文件夹,如按键在KEY文件夹,其中放置key.c和key.h,.h文件里面依次是调佣头文件,引脚定义,变量声明,函数声明。.c文件里面是函数定义。.c文件需在keil软件中双击source groups找到.c文件添加进去;.h文件点击魔术棒,选C251,选incline paths再选其右边的省略号选择.h文件所在的文件夹添加进去。同理,创建和添加蜂鸣器文件BEEP,定时文件TIM,数码管的led_seg。冲哥的数码管文件夹名字好像写错了写成LED_ESG了。日后使用时可以直接调用这些文件或者略作修改。
第14集 矩阵按键的使用
之前学习的是独立按键,每个按键占用一个端口,为了减少端口占用,在按键比较多时,将按键排列成矩阵形式,称之为矩阵按键。它的优点是占用端口较少,缺点是程序的编写变得复杂。识别原理是,io口默认是高电平,实时读取到按键引脚为低电平表示有按键按下。
1.将P0.0-0.3端口输出低电平,p0.6-0.7引脚输出高电平,如果有按键按下,那一列io口就会变成低电平,就可以判断那一列有按键按下了。
准双向口,可以输出,又可以输入。
2,p0.0-0.3输出高电平,p0.6-0.7输出低电平,如果有按键按下,那一行io口就会变成低电平,由此判断出是哪一行按下
3,综合比较,得出哪个按键按下。
涉及知识:
1.强制转换
强制转换的功能是,把表达式的运算结果强制转换成类型说明符所表示的类型。强制转换是通过类型转换运算来实现的,其具体格式如下:
(类型说明符)(表达式)
例如下面的转换:
(float) a //把a转换为实型
(int)(x+y) /把x+y的结果转换为整型
在使用强制转换时应注意如下两个问题。
1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如将(int)(x+y)写成(int)x+y则成了将x转换成int型之后再与y相加了。
2)无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
2.异或
按位异或运算符“^”是双目运算符,能够将参与运算的两个数各自对应的二进位进行相异或运算。
相同出0,相异出1
按位或运算
按位或运算符“|”是双目运算符,能够将参与运算的两个数各自对应的二进位实现相或操作。只要对应的两个二进位中有一个为 1,计算结果位就为 1,否则为0.
3.switch及 break
多分支结构语句switch
多分支选择结构可以有 n 个操作,实际上前面介绍的嵌套双分支语句可以实现多分支结构。在 C 语言中,专门提供了一种实现多分支结构的 switch 语句。switch 语句的使用格式如下:
switch(表达式){
case常量表达式1:语句1;
case常量表达式2:语句2;
…
case常量表达式n:语句n;
default :语句n+1;
}
上述格式的含义是:计算表达式的值,并逐个与表达式后面的常量表达式值进行比较当表达式的值与某个常量表达式的值相等时,会执行其后的语句,然后不再进行判断,继续执行后面所有 case 后的语句;如表达式的值与所有 case 后的常量表达式均不相同,则执行default后的语句。
在 C 语言中,break 语句在循环语句和开关语句中非常重要。当 break 用在 switch 语句中时,可使程序跳出 switch 而执行 switch 以后的语句;如果没有 break 语句,则将成为一个死循环而无法退出。break语句的格式如下:
break;
break语句的主要功能如下。
1)改变一个程序的控制流。
2)当用在 do-while、while、for 循环中时,可以使程序终止循环而执行循环后面的语句。
3)通常在循环中与条件语句一起使用,如果条件值为真则跳出循环,控制流转向循环后面的语句。
4)如果已执行break语句,就不会执行循环体中位于 break 语句后的语句。
5)在多层循环中,一个break语句只向外跳一层。
点赞,每天一小步,坚持学习