今天学的不多,内容为:静态、动态数码管的控制,模块化编程和lcd1602调试工具
数码管的控制
由于内部电路的设计,数码管每次只能显示一个位置的一个数字,动态的实现是基于不同位置的闪烁频率高。
P2_4,P2_3,P2_2控制位置(与led模块共用接口)
显示数字,顺时针旋转依次为ABCDEFG DP,0为灭,按顺序写出后由右向左读出,例如6为 1011 1110(对应ABC...),为7D(0111 1101)
静态
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
}
void main()
{
Nixie(5,9);
while(1)
{
}
}
动态
我们可以将delay的时间由高到低观察,发现确实是闪烁
(但是不进行delay清零,否则上次的会串到当前的,导致乱码)
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number)//????,????????ABCDEFG DP,0??,????????????
//??6? 1011 1110,?7D
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
Delay(1);//数码管消影,位选 段选 清零 位选 段选
P0=0x00;
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
}
}
模块化编程
模块化编程就是将函数单独生成两个文件一个.c一个.h,达到和头文件类似的效果。
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
.h文件的固定声明格式
这是达成的效果,使代码更加简洁,同时也方便在后续的使用。后续再用可以将相应的文件粘贴到对应的文件夹里
lcd1602调试工具
lcd1602主要学习了会使用的函数
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
int Result=0;
void main()
{
LCD_Init();
/*LCD_ShowChar(1,1,'A');
LCD_ShowString(1,3,"HELLO");
LCD_ShowNum(1,9,521,3);
LCD_ShowSignedNum(1,13,-66,2);
LCD_ShowHexNum(2,1,0xA8,2);
LCD_ShowBinNum(2,4,0xAA,8);
*/
while(1)
{
Result++;
Delay(1000);
LCD_ShowNum(1,1,Result,3);
}
}
今天学习的内容不是很多,主要是数码管的硬件原理听了好长时间,虽然还是似懂非懂,但是感觉挺有用的。