LED KEY SEG模块笔记
LED
点灯思路
-
对整体进行赋值,控制所有led灯
P1 = 0x5f;//0101 1111
-
对IO口单独赋值,控制单个led灯
P1_2 = 0;//0还是1,取决于共阳极还是共阴极,可以试一下
共阳极指LED共同接点为电源,共阴极则是为GND。电灯条件为两端有电势差
流水灯思路
利用intrins.h中的crol cror实现
//变量定义区
unsigned char crol = 0xfe;//1111 1110
//主函数
void main()
{
while(1){
P2 = crol;
crol = _crol_(crol,1);//变量crol初始为1111 1110,通过将0实现循环左移,实现流水效果,1位置处指一次移动一位,也可移动多位
Delay(500);
}
}
原理:通过不断给P2中的不同IO口置低电平,达到流水效果。
KEY
学习按键思路通过学习彩灯系统来理解
按键读取函数
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_1 == 0) temp = 1;
if(P3_0 == 0) temp = 2;
if(P3_2 == 0) temp = 3;
if(P3_3 == 0) temp = 4;//通过按键置0 将局部变量temp对应为按键位号输出来读取按键
return temp;
}
按键消抖(需要熟练记忆,待理解)
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_old); //检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_old);//检测上升沿
Key_old = Key_Val;//扫描辅助变量
SEG
主要掌握几个Seg相关函数
位选 段选
unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//在选定位号后,显示需要的内容 0~9 加上 熄灭(无法显示)
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//选定位号亮
此为共阴极,0x5b为0101 1011 按如上顺序来点亮
Seg_Disp函数
锁存器相当于一扇门
P0 = 0xfe;//数据写到P0口,进入锁存器 一扇门
P2_7 = 1;//位选口置1 则相当于让锁存器里的数据进入到位选口 开门
P2_7 = 0;//关门 锁住数据
P0 = 0xa4;//段选数据
P2_6 = 1;//开门
P2_6 = 0;//关门
先位选再段选的一个逻辑
基础的过完,开始进入Seg_Disp的逻辑实现
void Seg_Disp(unsigned char wela,dula)
{
P0 = 0x00;//消影 将数码管熄灭
P2_6 = 1;
P2_6 = 0;
P0 = Seg_Wela[wela];
P2_7 = 1;
P2_7 = 0;
P0 = Seg_Dula[dula];
P2_6 = 1;
P2_6 = 0;
}
中断服务函数
用中断服务函数代替延迟函数,解决数码管显示的逻辑问题,达到视觉错误,如下为配置函数
/* 定时器0中断初始化函数 */
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器0中断打开
EA = 1; //总中断打开
}
实现中断服务的内容(代码逻辑部分)
void Timer0Server() interrupt 1
{
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
if(++Seg_Pos == 6) Seg_Pos = 0;//数码管显示专用
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
}
变量 Seg_Pos (在中断中实现扫描一遍遍数码管作用,位选) 和 数组变量 Seg_Buf[6] = {1,2,3,4,5,6}(段选)
总结
为了让数码管显示,在中断函数中执行Seg_Disp函数,从而达到动态显示