📄 lesson5.c
字号:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma data:code
const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void show(uchar j,uchar k)
{//第4集第4-5分钟就讲这个过程
PORTA|=BIT(3);//导通U6这个573 段选
PORTB=table[j];//选中段选,即是选中显示哪个数据。
PORTA&=~BIT(3);//锁存
PORTB=0XFF;//设初值。其实写成PORTB=0xFE也行,但是由于这个是根据别的程序改的,故加了这句话。
PORTB&=~BIT(k);//把第一个数码管变成低电平,低电平表示接通的意思。每次只选中第一个数码管。
PORTA|=BIT(4);//打开U7这个573
PORTA&=~BIT(4);//关闭U7这个573
delay(1);
}
uchar key_press()
{
uchar j;
DDRD|=0X0F;//00001111 右边为低4位,左边为高4位即把RXD TXD INT0 INT1变为输出
PORTD|=0X0F;
DDRD&=0XF0;//谁与0都是0谁与1都不变,谁或0都不变,谁或1都变1. 把RXD TXD INTO INT1 变为输入
j=PIND;
j=j&0X0F;//00001111 我们不看高4位是什么我们给他屏弊了,我们只看低4位。
if(j==0X0F)//就是判断一下低是4位是否有为0的.若有为0的,证明有键按下了。
{
return 0;
}
else
{
return 1;
}
}
uchar key_scan()
{
uchar key;
delay(10);//消抖
if(key_press())//再确认一下是否按下
{
key=PIND;
key&=0X0F;//让高4位变成0
switch(key)
{
case 0X0E:
key=1;
break;
case 0X0D:
key=2;
break;
case 0X0B:
key=3;
break;
case 0X07:
key=4;
break;
default:
key=16;
}
while(key_press());//松手检测
}
else
{
key=16;
}
return key;
}
void main()
{
uchar i,l;
DDRA|=0X18;//0001 1000 不改变其它口的输出,只改变p3、p4口~~考虑若是00100010 |00011000 的情况是不是只改变了P3P4其它没有改//变
DDRB=0XFF;//让发光二极管全部灭掉。
while(1)
{
i=key_press();
if(i)
{
l=key_scan();
show(l,0);
}
}
}//键盘扫描程序:首先先将DDRD的低4位置为输出高电平即RXD TXD INT0 INT1 置为高电平,然后再将这4个IO变为输入,若S1-S4其中一个被//按下时,那么将导通,那么PD0-PD4中将有被变为低电平,我们程序就检测哪个被变为低电平,哪个被变为低电平,哪个就被按下了
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -