📄 main.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 + -