📄 anjian.c
字号:
#include <reg51.h>
#include <intrins.h>
#define unchar unsigned char
unsigned char code TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,
0x5e,0x79,0x71}; //proteus里面CC数码管是共阴的
unchar m,sz[6];
sbit SDATA_595 = P3^6 ; /*串行数据输入14DS*/
sbit SCLK_595 = P3^4; /*移位时钟脉冲11SCH*/
sbit RCK_595 = P3^5; /*输出锁存器控制脉冲12STCP*/
static void WR_595(unsigned char data num2 )
{
unsigned char data count1;
for(count1=0;count1<=7;count1++)
{
if((num2&0x80)==0x80) /*最高位为1,则向SDATA_595发送1*/
SDATA_595=1; /*发出数据的最高位*/
else
SDATA_595=0;
num2<<=1; /*右移位*/
SCLK_595=0; /*产生上生沿*/
SCLK_595=1;
}
}
/*-------------------------------------------------------------------------------
打开锁存,更新74595输出子程序
---------------------------------------------------------------------------------*/
static void Out_595(void)
{
RCK_595=0;
_nop_();
_nop_();
RCK_595=1; /*上升沿锁存数据*/
}
//判断键值//
unsigned char k; //键值判断//
void delay_10ms(void) //延时//
{
unsigned char i,j;
for(i=0;i>0;i--)
for(j=248;j>0;j--);
}
void Getch()
{
unsigned char x,y,z;
P2=0xff;
P2=0x0f; //先对P2置数,进行行扫描//
if(P2!=0x0f) //判断是否有键按下//
{
delay_10ms(); //软件延时//
if(P2!=0x0f) //确认是否按下//
{
x=P2;
P2=0xf0; //列扫描//
y=P2;
z=x^y; //用Z取出键值//
switch(z) //判断键值//
{
case 0x77: k=0; break; //对按键附值//
case 0x7b: k=1; break;
case 0x7d: k=2; break;
case 0x7e: k=3; break;
case 0xb7: k=4; break;
case 0xbb: k=5; break;
case 0xbd: k=6; break;
case 0xbe: k=7; break;
case 0xd7: k=8; break;
case 0xdb: k=9; break;
case 0xdd: k=10;break;
case 0xde: k=11;break;
case 0xe7: k=12;break;
case 0xeb: k=13;break;
case 0xed: k=14;break;
case 0xee: k=15;break;
}
}
}
}
//显示//
void disp(void)
{
WR_595(TAB[k]);
WR_595(0x00);
Out_595();
}
void main(void) //主程序
{
while(1)
{ P2=0x00;
Getch();
disp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -