⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 STM8S105S4程序
💻 C
字号:
/******************** 2011电子科技协会 ********************
;名称 :矩阵键盘
;作者 : 郑品洪
;日期 : 07/25/2011
;描述 : 按下相应按键显示0到F中对应的数
;***********************************************************/
#include <stm8s105s4.h>
#define uint unsigned int 
#define uchar unsigned char 
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar num;
void delay(uchar a)
{
	uchar i;
	for(a;a>0;a--)
	  for(i=0;i<255;i++);
}

void init(void)
{
		PB_DDR=0XFF;
    PB_CR1=0XFF;    // 将PB设置成推挽输出
    
    PC_DDR=0X1F;
    PC_CR1=0XFF;    // 将PC设置成推挽输出
		
	  PE_DDR=0x26;
    PE_CR1=0XFF;     //将PE5,PE2,PE1为推挽输出,其他的设为上拉输入
		
    PD_DDR=0X80;
    PD_CR1=0X80;   //将PD7设为推挽输出	
}
	/***这里的设置比LED的和数码管的设置要复杂,开始引入输入 模式,矩阵键盘列为输出,行为输入,请参考协会开发板原理图及STM8转51PDF资料***/
	/***扫描方式也可为行输出,列输入,读者可以自己尝试着修改***/
	
uchar keys(void)    //此子函数看起来很长,实则只有前面一截内容,下面的“同理可得”
{
	uchar temp;
	PE_ODR=0X26;             //将列中的PD7置为低电平,列中的其他三个置为高电平
	PD_ODR=0x00;
	delay(40);          //这里要说明一下,由于矩阵键盘第一列和AD键盘共用一个IO口
											//AD键盘的RC会影响IO口电平变化的时间,这里需要延时一段时间,让电容C放电完毕
	if((PE_IDR&0x40)==0)    //如果第一列的第四行按键被按下,则进入if语句内
	{
    delay(5);               //延时一段时间,等待IO口电平稳定,即消抖
		if((PE_IDR&0x40)==0)    //再次判断按键是否被按下,避免干扰
		{
      num=12;                //如果第一列的第四行按键被按下,则令num=12,即数码管显示 为C        
		  while((PE_IDR&0x40)==0);   //如果按键没有松开,则等待
   	}
  }
	temp=PC_IDR&0xe0;       
	if(temp!=0xe0)
  {
		 delay(5);
		 temp=PC_IDR&0xe0;
		 if(temp!=0xe0)           
		 {
			 switch(temp)
			 {
				 case 0xc0:num=0;       //如果temp的值为0xc0,则说明第1个按键被按下,下面的依次类推
									break;
				 case 0xa0:num=4;
									break;
				 case 0x60:num=8;
									break;
			 }
			 while((PC_IDR&0xe0)!=0xe0);
	   }
	}
	
	
	PE_ODR=0X24;
	PD_ODR=0x80;
	if((PE_IDR&0x40)==0)
	{
    num=13;
		delay(5);
		while((PE_IDR&0x40)==0);
  }		
	temp=PC_IDR&0xe0;
	if(temp!=0xe0)
  {
		 delay(5);
		 temp=PC_IDR&0xe0;
		 if(temp!=0xe0)
		 {
			 switch(temp)
			 {
				 case 0xc0:num=1;
									break;
				 case 0xa0:num=5;
									break;
				 case 0x60:num=9;
									break;
			 }
			 while((PC_IDR&0xe0)!=0xe0);
	   }
	}
	
		PE_ODR=0X22;
	PD_ODR=0x80;
	if((PE_IDR&0x40)==0)
	{
    num=14;
		delay(5);
		while((PE_IDR&0x40)==0);
  }		
	temp=PC_IDR&0xe0;
	if(temp!=0xe0)
  {
		 delay(5);
		 temp=PC_IDR&0xe0;
		 if(temp!=0xe0)
		 {
			 switch(temp)
			 {
				 case 0xc0:num=2;
									break;
				 case 0xa0:num=6;
									break;
				 case 0x60:num=10;
									break;
			 }
			 while((PC_IDR&0xe0)!=0xe0);
	   }
	}
	
	PE_ODR=0X06;
	PD_ODR=0x80;
	if((PE_IDR&0x40)==0)
	{
    num=15;
		delay(5);
		while((PE_IDR&0x40)==0);
  }		
	temp=PC_IDR&0xe0;
	if(temp!=0xe0)
  {
		 delay(5);
		 temp=PC_IDR&0xe0;
		 if(temp!=0xe0)
		 {
			 switch(temp)
			 {
				 case 0xc0:num=3;
									break;
				 case 0xa0:num=7;
									break;
				 case 0x60:num=11;
									break;
			 }
			 while((PC_IDR&0xe0)!=0xe0);
	   }
	}
	
  return num;    	
	
}
void main()
{
	uchar n;
	init();
	while(1)
  {
		n=keys();              //把函数keys()的返回值num赋给n
		PB_ODR=table[n];        
		PC_ODR|=0x00;          //选择第一个数码管
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -