/*******************************************************************************
* 文件名称:数码管控制实验
* 实验目的:1.掌握数码管动态扫描的基本原理,掌握数码管消除“鬼影”的方法
* 2.掌握51单片机定时器工作模式和配置方法
* 3.掌握keil uvision集成开发环境下,中断服务函数设计方法
* 程序说明:无
* 日期版本:2015-8 NUAA
*******************************************************************************/
#include "reg52.h" //定义51单片机特殊功能寄存器
#include "intrins.h"
sbit HC138A = P2^5;
sbit HC138B = P2^6;
sbit HC138C = P2^7;
//以下是P25 P26 P27变化对应使Y0-Y7为0
#define Y0 0x1f
#define Y1 0x3f
#define Y2 0x5f
#define Y3 0x7f
#define Y4 0x9f
#define Y5 0xbf
#define Y6 0xdf
#define Y7 0xff
//0 1 2 3 4 5 6 7 8 9 a b c d e f
code unsigned char duan[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
code unsigned char wei[9] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff};
bit key_re;
unsigned char key_press;
unsigned char key_value;
bit key_flag;
unsigned char intr;
unsigned char read_keyboard(void);
void key_proc(unsigned char key);
void U6suocun(void);
//段锁存器锁存
void U7suocun(void) //LED对应锁存器U7控制端LE 从高位变为低位
{
//Y7 为0 其他为高
P2 = Y7;
_nop_();
_nop_();
P2 = Y0;
//Y7 为1 (此时只有Y0是0 不过Y0在板子上没有用到)
}
//位锁存器锁存
void U8suocun(void) //LED对应锁存器U8控制端LE 从高位变为低位
{
//Y6 为0 其他为高
P2 = Y6;
_nop_();
_nop_();
P2 = Y0;
//Y6 为1 (此时只有Y0是0 不过Y0在板子上没有用到)
}
//主函数
void main(void)
{
unsigned char key_temp = 0xff;
TMOD |= 0x01;//配置定时器0工作模式 模式1 16位计数器
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
while(1)
{
if(key_flag)
{
key_flag = 0;
key_temp = read_keyboard();//20ms 进来扫描一次
}
key_proc(key_temp);//对应按键按下的操作
key_temp = 0xff;//清除旧键值
}
}
//定时器中断服务函数
void isr_timer_0(void) interrupt 1 //默认中断优先级 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256; //定时器重载
if(++intr == 10) //2ms执行一次
{
intr = 0;
key_flag = 1;//20ms按键扫描标志位置1
}
}
//读取矩阵键盘键值 返回的就是按键的对应值 0-15
unsigned char read_keyboard(void)
{
unsigned char key_temp;
static unsigned char col;
P3 = 0xf0;
key_temp = (P3&0xf0);
if(key_temp != 0xf0) //有按键按下
key_press++;
else
key_press = 0;//抖动
if(key_press == 3) //连续三次都是有按键按下 则确定为有按键按下
{
key_press = 0;
key_re = 1;
switch(key_temp)
{
case 0x70:
col = 1; //第一列按键按下
break;
case 0xb0:
col = 2; //第二列按键按下
break;
case 0xd0:
col = 3; //第三列按键按下
break;
case 0xe0:
col = 4; //第四列按键按下
break;
}
P3 = 0x0f;
key_temp = (P3&0x0f);
switch(key_temp)
{
case 0x0e:
key_value = (col-1); //第一行按键按下
break;
case 0x0d:
key_value = (3+col); //第二行按键按下
break;
case 0x0b:
key_value = (7+col); //第三行按键按下
break;
case 0x07:
key_value = (11+col); //第四行按键按下
break;
}
}
//连续三次检测到按键被按下,并且该按键已经释放
P3 = 0x0f;
key_temp = (P3&0x0f);
if((key_re == 1) && (key_temp == 0x0f))
{
key_re = 0;
return key_value;
}
return 0xff; //无按键按下或被按下的按键未被释放
}
//按键处理函数
void key_proc(unsigned char key)
{
if(key != 0xff)
{
P0=wei[0];
U8suocun();//送位数据和位锁存
P0=duan[key];
U7suocun();//送段数据和段锁存
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
STC15F2K60S2芯片的官方例程、很全
共310个文件
lst:41个
obj:41个
bak:27个
4星 · 超过85%的资源 需积分: 45 118 下载量 107 浏览量
2018-03-29
14:02:31
上传
评论 8
收藏 670KB RAR 举报
温馨提示
例程合集包括,定时器扫描、EEPEOM、温度、时钟、串口、A/D、矩阵键盘、外部中断、点阵等
资源推荐
资源详情
资源评论
收起资源包目录
STC15F2K60S2芯片的官方例程、很全 (310个子文件)
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
ADC 11KB
LED_1.uvgui.Administrator 70KB
KEY_1.uvgui.Administrator 70KB
EEPROM_1.uvgui.Administrator 70KB
KEY_1.uvgui.Administrator 70KB
KEY_1.uvgui.Administrator 70KB
KEY_3.uvgui.Administrator 70KB
DS18B20_1.uvgui.Administrator 70KB
KEY_BOARD.uvgui.Administrator 70KB
LED_3.uvgui.Administrator 70KB
DISPLAY_2.uvgui.Administrator 70KB
UART.uvgui.Administrator 70KB
DISPLAY_2.uvgui.Administrator 70KB
Ultrasonic.uvgui.Administrator 69KB
DS18B20_1.uvgui_杰.bak 71KB
LED_1.uvgui_Administrator.bak 70KB
KEY_1.uvgui_Administrator.bak 70KB
KEY_1.uvgui_Administrator.bak 70KB
KEY_1.uvgui_Administrator.bak 70KB
EEPROM_1.uvgui_Administrator.bak 70KB
KEY_3.uvgui_Administrator.bak 70KB
KEY_BOARD.uvgui_Administrator.bak 70KB
LED_3.uvgui_Administrator.bak 70KB
DISPLAY_2.uvgui_Administrator.bak 70KB
DISPLAY_2.uvgui_Administrator.bak 70KB
Ultrasonic.uvgui_Administrator.bak 69KB
DS18B20_1.uvgui_www.bak 66KB
LED_1_uvproj.bak 13KB
DS18B20_1_uvproj.bak 13KB
Ultrasonic_uvproj.bak 13KB
KEY_BOARD_uvproj.bak 13KB
KEY_3_uvproj.bak 13KB
DISPLAY_2_uvproj.bak 13KB
INTR_uvproj.bak 13KB
LED_1_uvopt.bak 7KB
DS18B20_1_uvopt.bak 7KB
Ultrasonic_uvopt.bak 6KB
KEY_3_uvopt.bak 6KB
DISPLAY_2_uvopt.bak 6KB
KEY_BOARD_uvopt.bak 5KB
INTR_uvopt.bak 5KB
ex16.c 4KB
i2c.c 4KB
i2c.c 4KB
i2c.c 4KB
ex11.c 4KB
ex8.c 3KB
ex18.c 3KB
ex4.c 2KB
ex4.c 2KB
ex15.c 2KB
ex7.c 2KB
ex7.c 2KB
ex4.c 2KB
onewire.c 2KB
ex12.c 2KB
ex9.c 2KB
ex14.c 2KB
ex10.c 2KB
onewire.c 1KB
ex3.c 1KB
ex1.c 1KB
ex13.c 1KB
ex17.c 1KB
DAC 11KB
DISPLAY_2 4KB
DISPLAY_2 4KB
DS18B20_1 8KB
DS18B20_2 12KB
EEPROM_1 11KB
i2c.h 704B
i2c.h 700B
i2c.h 700B
onewire.h 213B
onewire.h 184B
Ultrasonic.hex 3KB
EEPROM_1.hex 2KB
ADC.hex 2KB
DS18B20_1.hex 2KB
KEY_3.hex 1KB
KEY_1.hex 1KB
KEY_1.hex 1KB
共 310 条
- 1
- 2
- 3
- 4
coffen_co
- 粉丝: 4
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页