LED KEY SEG模块笔记

LED KEY SEG模块笔记

LED

点灯思路

  1. 对整体进行赋值,控制所有led灯

    P1 = 0x5f;//0101 1111
    
  2. 对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函数,从而达到动态显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值