7sEG为晶体管,cc表示共阴极,mpx6表示6位1体,ca表示共阳极
一定要记得,if函数等于是==而不是=,不然会出现疯狂执行if语句里边的内容的情况
下面这个函数可以运行,说明可以用P2=_crol_(P2,1)这种方法,不懂为什么我自己用的时候不行。。。
#include <reg51.h>
#include <intrins.h> //循环移动的库函数;
/********软件延时*********/
void delay( unsigned int uMS)
{
unsigned int i , j;
for(i = 0; i < uMS; i++)
{
for(j = 0; j < 500; j++);
}
}
/**********主函数************/
main()
{
int i;
P2 = 0x01;
delay(200);
while(1)
{
for(i = 0; i < 7; i++)
{
P2 = _crol_(P2,1); //_crol_循环左移,该函数在#include <intrins.h>函数库中。
delay(150);
}
for(i = 0; i < 7; i++)
{
P2 = _cror_(P2,1); //_cror_循环右移,该函数在#include <intrins.h>函数库中。如果只希望LED从一个方向循环闪烁则从两个循环函数中任选一个即可。
delay(200);
}
}
}
单片机是弱上拉强下拉,也就是输出端接到0之后输出端也会变为低电平
比如这个键盘(纪念我浪费的一小时),原本是高电平的输出端,当接到0后,就会变为低电平
就是电流喜欢往低电阻跑,施密特触发器带有较高电阻的,所以电流直接往接地线跑,施密特触发器就接收不到高电平(为什么单片机本来输出的是高电平,但是接低电平之后又输出低电平的原因)
使用无参数函数的时候,括号里不能有参数,不然就会像我这样报错
定时器中断函数一定要重新赋初值
数码管出现混乱,不一定只是段选有问题
位选可能也有问题!!!!
P0口一定要记得接上拉电阻,而且上拉电阻一定要接电源
1.不接上拉电阻,P0端的输出会为灰色(无法预测)
2.上拉电阻不接电源,P0的输出会一直为低电平
输出正确的程序但数码管亮得不正确很有可能是程序和数码管的阴阳级不对应(详情看上面),把数码管的输出取反就可以了。
下面这个来源于别的博主(无授权)
oid delayms(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
int val=0;//使用全局变量定义键值
unsigned int keyscan(void)
{
P1 = 0xf0;
if(P1!=0xf0)
{
delayms(50); //按键消抖
switch(P1) //行扫描
{
case 0xe0:
val = 0; break;
case 0xd0:
val = 1; break;
case 0xb0:
val = 2; break;
case 0x70:
val = 3; break;
}
P1 = 0x0f;
switch(P1) //列扫描
{
case 0x0e:
val += 0; break;
case 0x0d:
val += 4; break;
case 0x0b:
val += 8; break;
case 0x07:
val += 12; break;
}while(P1!=0x0f); //等待按键松开
}
return val;
}
感觉好像一旦用错中文就会弹出这种奇怪的16进制数来
文件出现黄色感叹号,是因为没有把人家给的文件夹解压,把文件夹全部解压就可以了
一定要记住,锁存器的原理是先给一个数据,然后锁存器先置高电平再置低电平
要是弄反了锁存器就输入不进数据了
奇怪的BUG
break没有在switch循环内,说明switch的括号打错了或者打漏了
是函数类型不为void,而且没有设置返回值;要么直接结束前return 0,或者把函数类型改成void
不知道为什么,写sbit的时候就一定要用P1^7不能用P1_7这样的;或者说,不能用P1_7这样的话就试一下P1^7
keil一定要引入经过排除重复的.h文件而不能直接引入.c文件,不然文件重定义了直接报错+编译失败
有的时候数组明明定义好了但是值还是错乱,在中间加个code就好了
主文件里引用的是.h里的函数,所以在.c文件里更改函数后;记得也要在对应的.h文件里把对应的函数改好,不改的话会报错
一个和单片机没啥关系的BUG:文件后缀为7z.001,7z.002啥的不用改后缀,但是需要把文件放在同一个目录
下面是调用函数时把 函数名() 写成了 函数名【】 了
不可以用浮点数(float)来进行取余计算,下面这种做法是不对的,而且当类型为浮点数时,取余的运算也是针对浮点数的取余
下面这个就是单纯因为定义了两个名字相同的函数
bit型变量只能用&这样的运算符,用其他运算符会出现下面这个报错 在定义全局变量的时候忘加分号了,系统就会认为定义的是这个变量连同下面的一大段函数,就会出现这个报错
第一个报错指的就是重复定义了变量
20行忘加分号了
有趣的知识
指令周期:取出并执行一条指令所需要的时间(解释一条指令所需要的时间)
当我做题的时候,很容易忽略题目本身 的部分特殊性
比如国赛的这里,要求写的数是带符号的;那么在数等于0后不论按下哪个键都应当是加,