📄 series to p.c
字号:
/*本设计主要在按键设计的基础构思而来的,实验74LS164来实现简单的并串转换
大大节省了单片机的IO口线
char bdata tmp1;
bit tmp2;
...
tmp2=tmp1^7;这样是取不出tmp1的第七位的
*/
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop_() _nop_()
uchar code ncode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ncode_2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//取位时候用的,分别取到第零位到最高位
sbit P32=P3^2;
sbit P20=P2^0;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
void delay(uint t)
{
while(t>1){t--;}
}
unsigned char scan_key()//最通用的4*4键盘扫描程序
{
uchar key_1;
uchar key_2;
P1=0x0f;
key_2=P1;
key_2&=0x0f;
P1=0xf0;
key_1=P1;
key_1&=0xf0;
key_1|=key_2;
return(key_1);
}
void deal_2(uchar i)
{
uchar counter=0;
uchar a=0x3f;
while(counter<8)
{
P20=(bit)(ncode[i]&ncode_2[counter]);//这是该设计的核心部分,在此用了强制类型转换,等效为if(ncode[i]&ncode_2[counter]!=0)P22=1;else P22=0;
P22=1;//在此要强调一点,先送数据,然后再把CLK拉高
_Nop_();//不管在高电平还是低电平都需要保持一定时间,时间长度根据不同的器件而定
_Nop_();
_Nop_();
_Nop_();
_Nop_();
P22=0;
_Nop_();
_Nop_();
_Nop_();
_Nop_();
_Nop_();
counter++;
delay(20000);
delay(20000);
}
P20=0;
P24=1;
_Nop_();
_Nop_();
_Nop_();
_Nop_();
_Nop_();
P24=0;
}
void deal(uchar code_)
{
switch(code_)
{
case 0xe7:deal_2(0);break;
case 0xeb:deal_2(1);break;
case 0xed:deal_2(2);break;
case 0xee:deal_2(3);break;
case 0xd7:deal_2(4);break;
case 0xdb:deal_2(5);break;
case 0xdd:deal_2(6);break;
case 0xde:deal_2(7);break;
case 0xb7:deal_2(8);break;
case 0xbb:deal_2(9);break;
}
}
void in_i(void) interrupt 0 using 0
{
uchar t;
EA=0;
t=200;
while(t--);
if(P32){EA=1;return;}
deal((scan_key()));
P1=0xf0;
EA=1;
return ;
}
void main()
{
P1=0xf0;
P20=0;
P22=0;
P23=0;
P24=0;
_Nop_();
_Nop_();
_Nop_();
_Nop_();
_Nop_();
_Nop_();
P23=1;
EX0=1;
IT0=1;
EA=1;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -