2019-02-28 22:55:27 zy_like_study 阅读数 508
  • 蓝桥杯历届真题讲解

    应某大学邀请,为同学们做算法题目的讲解,蓝桥杯的题目很好,很适合学习编程的同学们,把这些算法掌握好,为将来的软件开发打下坚实的基础。

    951 人正在学习 去看看 付强

蓝桥杯单片机CT107D初始化程序(关闭蜂鸣器、LED、数码管)

void sys_init()	//初始化关闭外设函数
{
	P2 &= 0X1F;//清零P2高三位即P27P26P25 = 0
	
	P2 = P2 & 0X1F | 0XA0;//先清零P2高三位之后再给P27P26P25赋值101,蜂鸣器锁存器
	P0 = 0X00;//关闭蜂鸣器
	P2 &= 0X1F;//关闭蜂鸣器锁存器,释放P0口
	
	P2 = P2 & 0X1F | 0X80;//先清零P2高三位之后再给P27P26P25赋值100,LED锁存器
	P0 = 0XFF;//关闭LED
	P2 &= 0X1F;//关闭LED锁存器,释放P0口
	
	P2 = P2 & 0X1F | 0XE0;//先清零P2高三位之后再P27P26P25赋值111,数码管段锁存器
	P0 = 0XFF;//关闭数码管
	P2 &= 0X1F;//关闭数码管锁存器,释放P0口
}

以下以关闭蜂鸣器为例,分析初始化函数:

在这里插入图片描述
①图示是74HC138译码器,即由P27P26P25的输入,来决定Y的输出。
当P27P26P25 赋值为101时,输出有效位Y5 = 0;对应程序P2 = P2 & 0X1F | 0XA0;

在这里插入图片描述

②38译码器选中有效位后,再经过以下或非门,输出YxC。
当P27P26P25 = 101时,Y5 = 0为有效输出位,当WR为0时(默认为0),Y5C = (Y5 | WR)’=1。

在这里插入图片描述

③之后是锁存器,经过前面的电路,Y5C为1,即对应LE为1,锁存器开启,此时操作P0口,便可对ULN2003(蜂鸣器继电器等)操作:P0 = 0X00;(蜂鸣器继电器高电平开启,低电平关闭)
④并且P0口的值被储存存在锁存器里,此时关掉锁存器(Y5C清0)之后,即使改变P0口的值,也无法改变锁存器储存过的值了,达到解放P0口的目的:P2 & = 0X1F;

在这里插入图片描述
⑤打开或关闭LED,数码管位选、段选过程同上,参考电路图分析

总结:

P2 = P2 & 0X1F | 0XA0;		//给P27P26P25赋值101,打开蜂鸣器锁存器
P0 = 0X00;					//关闭蜂鸣器
P2 &= 0X1F;				//关闭蜂鸣器锁存器,释放P0口

我更喜欢这样写:

void sys_init()
{
	P2 &= 0X1F;
	
	P0 = 0X00;
	P2 = P2 & 0X1F | 0XA0;
	P2 &= 0X1F;
	
	P0 = 0XFF;
	P2 = P2 & 0X1F | 0X80;
	P2 &= 0X1F;
	
	P0 = 0XFF;
	P2 = P2 & 0X1F | 0XE0;
	P2 &= 0X1F;
}
2019-04-18 17:38:33 Labghost 阅读数 309
  • 蓝桥杯历届真题讲解

    应某大学邀请,为同学们做算法题目的讲解,蓝桥杯的题目很好,很适合学习编程的同学们,把这些算法掌握好,为将来的软件开发打下坚实的基础。

    951 人正在学习 去看看 付强


本文适用于CT107D竞赛板+IAP15转接板

通用操作

资料中提供了相对完整的IIC的库函数,所以,可以不用深入的了解IIC总线的时钟顺序。而以下是选手必须要了解的。
器件地址: 地址的前4位由器件的型号决定,后3位由A0 A1 A2三个引脚决定,在CT107DFCP8591的地址是0x90AT24C02的地址是0xa0
**读/写标志位:**器件地址的后一位为读写标志位,1为读操作,0为写操作。

写操作

pic1

顺序读操作

pic2

随机读操作

pic3

代码模板

FCP8591

FCP8591是一个用于数模相互转换的芯片。

控制字的说明

说明
7 0 置零
6 x D/A标志,1打开,0关闭
5 x 模拟信号的输入方式,与后一位一起使用,一般使用方式0
4 x
3 0 置零
2 x 自动增量标志,一般情况下置零,如果置位,则在每次A/D转换后,通道编号自动增加
1 x 设置通道编号,与后一位一起使用
0 x 通道0A/D引脚,通道1为光敏电阻,通道2为仪表放大器,通道3为电位器

读电位器和光敏电阻

#include <STC15F2K60S2.H>
#include <iic.h>

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[8];
unsigned int uval,lval;

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}

//数码管显示
void display(){
	u8 i;

	dis[0]=0xff;					//不显示	
	dis[1]=font[uval/100%10]&0x7f;	//显示电位器的电压				
	dis[2]=font[uval/10%10];	
	dis[3]=font[uval%10];
	dis[4]=0xff;					//不显示
	dis[5]=font[lval/100%10]&0x7f;	//显示光敏电阻的电压	
	dis[6]=font[lval/10%10];
	dis[7]=font[lval%10];

	//数码管显示
	for(i=0;i<8;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;//消隐
	}
	P2&=0x1f;
}

void uread(){//读电位器,随机读操作, 
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	uval=IIC_RecByte();
	uval=uval*500.0/255;
	IIC_Stop();
}
void lread(){//读光敏电阻,随机读操作,
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x01);
	IIC_WaitAck();
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	lval=IIC_RecByte();
	lval=lval*500.0/255;
	IIC_Stop();
}
int main(){
	while(1){
		lread();
		uread();
		display();	
	}
}

输出电压

#include <STC15F2K60S2.H>
#include <iic.h>

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[8];
unsigned int out_val=300;//输出电压为3.00伏

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}

//数码管显示
void display(){
	u8 i;

	dis[0]=0xff;					//不显示	
	dis[1]=0xff;			
	dis[2]=0xff;	
	dis[3]=0xff;
	dis[4]=0xff;				
	dis[5]=font[out_val/100%10]&0x7f;	//显示输出电压	
	dis[6]=font[out_val/10%10];
	dis[7]=font[out_val%10];

	//数码管显示
	for(i=0;i<8;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;//消隐
	}
	P2&=0x1f;
}
void output(){//输出电压,写操作
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(out_val*255.0/500);
	IIC_WaitAck();
	IIC_Stop();
}
int main(){
	while(1){
		output();
		display();	
	}
}

如果手边没有电压表的话,可以用短接片把A/D D/A引脚连接起来,这样自己测自己。以下是这个方式的代码

#include <STC15F2K60S2.H>
#include <iic.h>

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[8];
unsigned int u_val,out_val=472;//输出电压为4.72伏

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}

//数码管显示
void display(){
	u8 i;

	dis[0]=0xff;					//不显示	
	dis[1]=font[u_val/100%10]&0x7f;			
	dis[2]=font[u_val/10%10];	
	dis[3]=font[u_val%10];
	dis[4]=0xff;				
	dis[5]=font[out_val/100%10]&0x7f;	//显示输出电压	
	dis[6]=font[out_val/10%10];
	dis[7]=font[out_val%10];

	//数码管显示
	for(i=0;i<8;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;//消隐
	}
	P2&=0x1f;
}
void FCP(){//我测我自己,随机读操作
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(out_val*255.0/500);
	IIC_WaitAck();
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	u_val=IIC_RecByte();
	u_val=u_val*500.0/255;
	IIC_Stop();
}
int main(){
	while(1){
		FCP();
		display();	
	}
}

AT24C02

AT24C02是一个可擦写的ROM芯片,断电后数据不丢失,它提供了256B的存储空间。其中,256B被分为32页,每页8个字节。在进行写操作的时候,一次最多只能写一页。
其代码功能如下:
按键表

1 2 3 存储1
4 5 6 读取1
7 8 9 存储2
0 撤销 清零 读取2

要求运用按键对数字进行操作,并在数码管上显示出来。能在EEPROM中存储两个数,并能读取出来。

#include <STC15F2K60S2.H>
#include <iic.h>

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[8],num[8]={0,0,0,0,0,0,0,0};

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
void delay300ms()		//@12.000MHz
{
	unsigned char i, j, k;

	i = 14;
	j = 174;
	k = 224;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void add_num(u8 val){//在末尾增加一位数
	u8 i;

	if(num[0]==0){
		for(i=0;i<7;i++)
			num[i]=num[i+1];
		num[7]=val;
	}
}
void dec_num(){//去掉末尾的一位数
	u8 i;

	for(i=7;i>0;i--)
		num[i]=num[i-1];
	num[0]=0;
}
//数码管显示
void display(){
	u8 i;

	for(i=0;i<8;i++)
		dis[i]=font[num[i]];
	for(i=0;dis[i]==font[0]&&i<7;i++)
		dis[i]=0xff;

	for(i=0;i<8;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;//消隐
	}
	P2&=0x1f;
}
void rom_read(u8 addr){//读取数据,addr代表地址
	u8 i;

	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	for(i=0;i<8;i++){
		num[i]=IIC_RecByte();
		IIC_SendAck(i==7);
	}
	IIC_Stop();
}
void rom_write(u8 addr){//存入数据,addr代表地址
	u8 i;
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	for(i=0;i<8;i++){
		IIC_SendByte(num[i]);
		IIC_WaitAck();
	}
	IIC_Stop();
}
void scankey(){//按键设置
	u8 key,i;

	P42=0;P44=0;P3=0x0f;
	if(P3!=0x0f){
		delay100us();
		if(P3!=0x0f){
			key=P3;
			P3=0xf0;P42=1;P44=1;
			key|=P3;
			if(P42==0) key&=0xbf;
			if(P44==0) key&=0x7f;
			delay300ms();
			switch(key){
				//返回按键编号
				case 0x77:add_num(0);break;				//s4
				case 0x7e:add_num(1);break;				//s7
				case 0xbe:add_num(2);break;				//s11	  
				case 0xde:add_num(3);break;				//s15	
				case 0x7d:add_num(4);break;				//s6 
				case 0xbd:add_num(5);break;				//s10	 
				case 0xdd:add_num(6);break;				//s14
				case 0x7b:add_num(7);break;				//s5	
				case 0xbb:add_num(8);break;				//s9	
				case 0xdb:add_num(9);break;				//s13
				case 0xb7:dec_num();break;				//s8“撤销”
				case 0xd7:for(i=0;i<8;i++)num[i]=0;break;//s12 “清零”
				case 0xee:rom_write(0x00);break;		//s19 “存储1”
				case 0xed:rom_read(0x00);break;			//s18 “读取1”
				case 0xeb:rom_write(0x08);break;		//s17 “存储2”
				case 0xe7:rom_read(0x08);break;			//s16 “读取2”
			}
		}	
	}
}
int main(){
	while(1){
		scankey();
		display();	
	}
}
2016-03-27 17:12:06 u013151320 阅读数 13429
  • 蓝桥杯历届真题讲解

    应某大学邀请,为同学们做算法题目的讲解,蓝桥杯的题目很好,很适合学习编程的同学们,把这些算法掌握好,为将来的软件开发打下坚实的基础。

    951 人正在学习 去看看 付强

近期和我们实验室的小伙伴一起参加了第七届蓝桥杯单片机开发与设计组省赛,在这里将备赛期间的一些资料和经验总结一下,并分享给大家。

蓝桥杯单片机开发板是国信长天的CT107D单片机综合训练平台,个人感觉这块开发板的设计还是很不错的。之前一直用的普中的板子,自己也做过一些最小系统板,练习了蓝桥杯的板子后根本不想再用普中的板子了。普中的板子将单片机的学习划分成很多个模块,操作各个模块时需要手动接线,因此很适合初学者,而蓝桥杯的板子则不需要自己手动接线,开发板也没有模块划的划分,能够让我们对单片机编程有更深入的理解,适合进阶练习。

虽然CT107D中使用了很多的锁存器,电路看起来比较复杂,但是熟悉之后会发现自己对之前毫不在意的锁存器有了更深刻的认识,对于模块化编程与代码复用也有了更深入的认识。通过这次比赛我对单片机编程也有了不同的认识,学到一个很重要的单片机编程套路就是通过定时器来实现前后台的编程思想,虽然以前也这么用过中断来处理一些事务,但是没有这么深刻的认识。同时,学会看芯片文档对于你以后做开发会有很大的帮助。总之,比赛过后有很多想要分享的东西,我会慢慢的写好每一篇博客。

在这一系列的笔记中,我会将自己蓝桥杯备赛期间写的一些代码以及做过的一些模拟题与大家进行分享,欢迎大家与我交流心得。

2019-04-04 16:39:58 Labghost 阅读数 456
  • 蓝桥杯历届真题讲解

    应某大学邀请,为同学们做算法题目的讲解,蓝桥杯的题目很好,很适合学习编程的同学们,把这些算法掌握好,为将来的软件开发打下坚实的基础。

    951 人正在学习 去看看 付强


本文适用于CT107D竞赛板+IAP15转接板

控制原理

CT107D竞赛板中共有4块74HC537D锁存器,它们使P0成为控制总线,控制LED灯、四相步进电机、继电器、直流马达、蜂鸣器、LM386及数码管显示(或8x8LED矩阵)。另外,138编码器及02或非门,用来选择锁存器,即P27 P26 P25三个I\O口,用于选择锁存器。

138编码器及02与非门

pic1
先是P27 P26 P25组成三位二进制数,先由138编码器将对应管脚拉低其余管脚拉高,再接入或非门。一般情况下,J13短接的是WRGND脚,即IO模式。其作用是将Y4 Y5 Y6 Y7四个管脚取反,原先被拉低的管脚,变成唯一被拉高的管脚,达到片选的目的。

关于138编码器,其特性如下:

C B A 被拉低管脚 锁存器编号 对应可控元件
H L L Y4 U6 LED灯
H L H Y5 U9 继电器、蜂鸣器等
H H L Y6 U8 数码管位选
H H H Y7 U7 数码管段选

Y0 Y1 Y2管脚是空闲的,所以控制完成后P27 P26 P25全部拉低即可。

控制LED灯

pic2
P27 P26 P25设置成H L L,选择U6锁存器,以控制LED灯。

注意:拉低为点亮,拉高为熄灭。

控制继电器和蜂鸣器

pic3
P27 P26 P25设置成H L H,选择U9锁存器,以控制继电器和蜂鸣器。

实际操作中,将P04拉高,通过ULN2003取反,继电器打开,同时L10点亮;将P07拉高,通过ULN2003取反,蜂鸣器响(无需调制方波信号)。

ULN2003是一个高电压、高电流的驱动器,其逻辑上相当于非门。

数码管显示

pic4
P27 P26 P25设置成H H L,选择U8锁存器,即数码管位选。
P27 P26 P25设置成H H H,选择U7锁存器,即数码管段选。

注意:竞赛板为共阳数码管

代码模板

#include<reg52.h>

#ifndef u8
#define u8 unsigned char
#endif

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit RELAY = P0^4;
sbit BUZZ = P0^6;

u8 code font[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//"共阳数码管"的字模
u8 code y4=0x80;y5=0xa0;y6=0xc0;y7=0xe0;
//用于锁存器片选
u8 dis[8],val1=123,val2=234;
//用于数码管显示
bit relay=1,buzz=1,l1=0,l2=0;

void display();			
void delay100us();		//延时

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}

void display(){
	u8 i;

	//将val1,val2的值,调整成想要的格式
	dis[0]=0xbf;
	dis[1]=font[val1/100];
	dis[2]=font[val1/10%10];
	dis[3]=font[val1%10];
	dis[4]=0xbf;
	dis[5]=font[val2/100];
	dis[6]=font[val2/10%10];
	dis[7]=font[val2%10];

	for(i=0;i<8;i++){
		//数码管位选
		P2&=0x1f;	   
		P0=1<<i;	  
		P2|=y6;		   
		//数码管段选
		P2&=0x1f;	  
		P0=dis[i];	  
		P2|=y7;		  
		delay100us();  
		P0=0xff;	   //消隐
	}
	//控制继电器和蜂鸣器
	P2&=0x1f;
	P0=0x00;RELAY=relay;BUZZ=buzz;
	P2|=y5;
	//控制LED灯
	P2&=0x1f;
	P0=0xff;L1=l1;L2=l2;
	P2|=y4;
	//将P27 P26 P25管脚拉低
	P2&=0x1f;
}
int main(){
	while(1){
		display();	
	}
}
2019-04-04 16:42:10 Labghost 阅读数 281
  • 蓝桥杯历届真题讲解

    应某大学邀请,为同学们做算法题目的讲解,蓝桥杯的题目很好,很适合学习编程的同学们,把这些算法掌握好,为将来的软件开发打下坚实的基础。

    951 人正在学习 去看看 付强

蓝桥杯单片机 赛后资料整理(二)——矩阵键盘


本文适用于CT107D竞赛板+IAP15转接板

按键

电路原理

pic1
2 3脚短接时,S4 S5 S6 S7用作独立按键;1 2脚短接时,用作4x4矩阵键盘。

需要说明的是,IAP15转接板中P36/WRP37/RD分别被P42/WR P44/RD代替,编程中需要注意。
另外,P36 P37还被用于8255WR RD,在个人练习中要防止冲突。P30 P31还被用作串口通信的TXD RXD,因此,在仿真过程中按下S7 S6等按键时,计算机与MCU之间无法实现通信,此时Keil会报错。
如果要实现串口通信或者使用仿真功能的话,尽量避免使用S7 S6按键,甚至是P30 P31

代码模板

独立按键

#include<reg52.h>

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;

bit l1=1,l2=1,l3=1;		//初始熄灭

void delay100us()		//延时100us@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
void delay300ms()		//延时300ms@12.000MHz
{
	unsigned char i, j, k;

	i = 14;
	j = 174;
	k = 224;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


bit scans4(){
	if(S4==0){
		delay100us();//消抖
		if(S4==0){
			return 1;
		}
	}
	return 0;
}
bit scans5(){
	if(S5==0){
		delay100us();//消抖
		if(S5==0){
			return 1;
		}
	}
	return 0;
}
bit scans6(){
	if(S6==0){
		delay100us();//消抖
		if(S6==0){
			return 1;
		}
	}
	return 0;
}
bit scans7(){
	if(S7==0){
		delay100us();//消抖
		if(S7==0){
			return 1;
		}
	}
	return 0;
}

int main(){	
	P3|=0x0f;
	//初始化
	while(1){
		//按下S7点亮L1,按下S6熄灭L1
		if(scans7())
			l1=0;
		if(scans6())
			l1=1;
		//按下S5时,L2亮,松开S5时,L2灭
		if(scans5())
			l2=0;
		else
			l2=1;
		//按一次S4,L3亮,再按一次,L3灭
		if(scans4()){
			delay300ms();
			l3=~l3;
		}
		//设置锁存器,控制LED灯
		P2&=0x1f;
		P0=0xff;L1=l1;L2=l2;L3=l3;
		P2|=0x80;	
		P2&=0x1f;
	}
}

矩阵键盘

#include <STC15F2K60S2.H>//使用P4时,注意修改头文件

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[2],key;

void delay100us()		//延时100us@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
u8 scankey(){
	u8 key;

	P42=0;P44=0;P3=0x0f;
	if(P3!=0x0f){
		delay100us();
		if(P3!=0x0f){
			key=P3;
			P3=0xf0;P42=1;P44=1;
			key|=P3;
			if(P42==0) key&=0xbf;
			if(P44==0) key&=0x7f;
			switch(key){
				//返回按键编号
				case 0x77:return 4;
				case 0x7b:return 5;
				case 0x7d:return 6;
				case 0x7e:return 7;
				case 0xb7:return 8;
				case 0xbb:return 9;
				case 0xbd:return 10;
				case 0xbe:return 11;
				case 0xd7:return 12;
				case 0xdb:return 13;
				case 0xdd:return 14;
				case 0xde:return 15;
				case 0xe7:return 16;
				case 0xeb:return 17;
				case 0xed:return 18;
				case 0xee:return 19;
			}
		}	
	}
	return 0;
}
//数码管显示
void display(){
	u8 i;

	//显示按键编号
	dis[0]=font[key/10];
	dis[1]=font[key%10];
	
	for(i=0;i<2;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;
	}
	P2&=0x1f;
}
int main(){
	while(1){
		key=scankey();
		display();	
	}
}
没有更多推荐了,返回首页