2019-07-15 08:48发布
小S咯 发表于 2018-3-20 09:26 #include #include
zhifubao 发表于 2018-3-20 17:14 你说的估计是正解。
最多设置5个标签!
#include<reg52.h>
#include<string.h>
sbit si=P3^5; //数码管三位数据线
sbit sck=P3^6;
sbit rck=P3^7;
//函数声明
void delay(unsigned int j);
unsigned char KEY_SCAN(void);
unsigned char seg_diaplay(void);
void middle(void);
void mod(void);
void open_gun(void);
void delay(unsigned int j);
void capcharge(void);
void display_595(unsigned int dat,unsigned int wei)
code char mima[]={1,2,3}; // *ERROR :can’t initialize .bad type or class 试图初始化位或sfr
unsigned int code wei_1[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//控制显示位置的数组,从左向右数,需要在第几个数码管显示内容就填几,从1开始,wei[0]什么也不显示。
unsigned int code table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管 段码 共阳数码管
bit open; //开机状态
char num; //储存每次扫描的结果
char jiamima[4]; //输入的密码数组 密码最多为4位
char len;
/*******************************
* 延时函数
*******************************/
void delay(unsigned int j)
{
unsigned int i;
for(i = 0;i<j;i++);
}
/*******************************
* 扫描矩阵键盘
*******************************/
unsigned char KEY_SCAN()
{
unsigned char key_buf; //暂时存储P1口状态
unsigned char key_state; //存储按键状态
P2 = 0x70; //高四位高电平,第四位低电平
key_buf = P2; //读取P1口状态
if(key_buf != 0x70)
{
delay(1000); //延时消抖
if(P2 == key_buf) //再次判断是否有按键按下
{
key_state = key_buf; //高四位状态存入key_state
P2 = 0x0f; //高四位低电平,第四位高电平
key_buf = P2; //读取P1口状态
key_state = key_state | key_buf; //低四位状态存入key_state
while(1)
{
if(P2 != key_buf)
return key_state; //返回该按键坐标值(请允许我用坐标形容这个值)
}
}
else
return 0; //如果没有按键按下,返回0
}
else
return 0; //如果没有按键按下,返回0
}
/*******************************
* 按键赋值
*******************************/
unsigned char seg_diaplay()
{
unsigned char x; //存储字符在数组中对应的编号
unsigned char table_num;
x=KEY_SCAN();
switch(x)
{
case 0x6e: table_num = 1;break;
case 0x5e: table_num = 2;break;
case 0x3e: table_num = 3;break;
case 0x6d: table_num = 4;break;
case 0x5d: table_num = 5;break;
case 0x3d: table_num = 6;break;
case 0x6b: table_num = 7;break;
case 0x5b: table_num = 8;break;
case 0x3b: table_num = 9;break;
case 0x67: table_num = 0;break;
case 0x57: table_num = 10;break;
case 0x37: table_num = 11;break;
default: table_num = 12; //如有其它坐标值,不作处理
}
if(table_num<=11)
{
return table_num;
}
else
return 12;
}
/*******************************
* 按键中间过程转换
*******************************/
void middle()
{
num=seg_diaplay(); //按键赋值
if(open==0) //执行开机密码程序
open_gun();
else //执行开机之后的操作
mod(); //执行功能
}
/*******************************
* 开机程序
*******************************/
void open_gun()
{
char k;
bit j;
j=0;
if (num!=12)
{
if(len<=3)
{
if(num!=11)
{
jiamima[len]=num;
len++;
display_595(num,len);//显示密码
}
else
{
for(k = 0;k<3;k++)
{
if(jiamima[k]!=mima[k])
{
j=1;
}
}
if(j==1)
{
jiamima[k]=0;
len=0;
}
else
{
open=1;
P1=0X00;
len=0;
for(k = 0;k<3;k++)
{
jiamima[k]=0;
}
}
}
}
else
{
for(k = 0;k<3;k++)
{
jiamima[k]=0;
len=0;
}
}
}
}
/*******************************
* 数码管显示程序
display_595(9,6);//在第6个数码管显示9
*******************************/
void display_595(unsigned int dat,unsigned int wei)
{
unsigned int i,k;
unsigned int wei1,dat1;
for(i=0;i<8;i++) //先移 片选码;低位在前,高位在后。
{
wei1=wei_1[wei];
si=(wei1<<i)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
for(k=0;k<8;k++) //后移段码
{
dat1=table[dat];
si=(dat1<<k)&0x80;//si是传输数据位 移位寄存器往出移的数据:先出来高位,再出来低位
sck=0;
_nop_();
_nop_();
sck=1; //当sck上升沿时,si改变有效
}
rck=0;
_nop_();
_nop_();
rck=1; //上升沿时移位寄存器的数据进入数据存储寄存器
}
/*******************************
* 主程序
*******************************/
void main()
{
open=0; //开机
while(1) //循环扫描
{
middle(); //处理扫描按键
}
}
你说的估计是正解。
说实话,我看到这里发现少了;,下面就没有继续看了,不知道下面还有没有。。
额,确实是缺少个分号造成
一周热门 更多>