赞
踩
1.硬件部分
普中单片机开发板 数码管 独立按键
2.软件部分
keil软件
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; /*端口引脚定义*/ sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit KEY1 = P3^0; sbit KEY2 = P3^1; /*变量定义*/ int number; unsigned char KeyNum=0; //被触发的按键编号 unsigned char KeyLock1=0; unsigned char KeyLock2=0; unsigned int cnt; /*函数声明部分*/ void KEY_Scan(); void KEY_Action(); void Light_Scan(); void delay(u16 i); void Display(); void Time0Iint(); /*数码管码表*/ unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管显示0~F的值 unsigned char LightBuf[]={0xFF,0xFF,0xFF,0xFF,0XFF}; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 数 名 : Display * 函数功能 : 数码管显示部分 *******************************************************************************/ void Display() { LightBuf[0]=smgduan[number%10]; LightBuf[1]=smgduan[number/10%10]; LightBuf[2]=smgduan[number/100%10]; LightBuf[3]=smgduan[number/1000%10]; LightBuf[4]=smgduan[number/10000%10]; } /******************************************************************************* * 函 数 名 : Light_Scan() * 函数功能 : 数码管扫描函数,选择显示的位置 *******************************************************************************/ void Light_Scan() { u8 i; for(i=0;i<8;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0;P0=LightBuf[4];break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0;P0=LightBuf[3];break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0;P0=LightBuf[2];break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0;P0=LightBuf[1];break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1;P0=LightBuf[0];break;//显示第4位 default: break; } delay(100); //间隔一段时间扫描 P0=0x00;//消隐 } } /******************************************************************************* * 函 数 名 : KEY_Scan() * 函数功能 : 按键扫描函数 *******************************************************************************/ void KEY_Scan() { static unsigned char cnt1 = 0xFF; static unsigned char cnt2 = 0xFF; cnt1 =(cnt1<<1)|KEY1; cnt2 =(cnt2<<1)|KEY2; if(cnt1 != 0x00) { KeyLock1 = 0; } else if(KeyLock1==0) { KeyNum = 1; KeyLock1 = 1; } if(cnt2 != 0x00) { KeyLock2 = 0; } else if(KeyLock2==0) { KeyNum = 2; KeyLock2 = 1; } } /******************************************************************************* * 函 数 名 : KEY_Action() * 函数功能 : 按键执行操作部分 *******************************************************************************/ void KEY_Action() { switch(KeyNum) { case 1:number++; KeyNum = 0; break; case 2:number--; KeyNum = 0; break; default:break; } } /******************************************************************************* * 函 数 名 :Time0Iint * 函数功能 :定时器0配置,定时器初始化函数 *******************************************************************************/ void Time0Iint() { EA=1; TH0 = (65536-2000)/256;//定时2ms TL0 = (65536-2000)%256; TMOD &= 0xFC; TMOD = 0x01; ET0 = 1; TR0 = 1; } /******************************************************************************* * 函 数 名 :void InterruptT0() interrupt 1 * 函数功能 : 定时器0中断执行部分 *******************************************************************************/ void InterruptT0() interrupt 1 { TH0 = (65536-2000)/256;//定时2ms TL0 = (65536-2000)%256; Light_Scan(); KEY_Scan(); } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { Time0Iint(); while(1) { Display(); KEY_Action(); } }
1.海创电子学习https://space.bilibili.com/93630735/
2.普中单片机论坛http://prechin.net/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。