我在按键按下2键时,不能连续取反(标志位为:pt),
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ch451_rst 0x0201 //复位
#define ch451_lmov 0x0300 //设置移动方式-左移
#define ch451_lcyc 0x0301 //设置移动方式-左循
#define ch451_rmov 0x0302 //设置移动方式-右移
#define ch451_rcyc 0x0303 //设置移动方式-右循
#define ch451_soff 0x0400 //关显示、键盘、看门狗
#define ch451_son 0x0401 //开显示
#define ch451_dsp 0x0500 //设置默认显示方式
#define ch451_BCD 0x0580 //设置BCD译码方式
#define ch451_twinkle 0x0600 //设置闪烁控制
#define ch451_DIG0 0x0800 //数码管位0显示
#define ch451_DIG1 0x0900 //数码管位1显示
#define ch451_DIG2 0x0A00 //数码管位2显示
#define ch451_DIG3 0x0B00 //数码管位3显示
#define ch451_DIG4 0x0C00 //数码管位4显示
#define ch451_DIG5 0x0D00 //数码管位5显示
#define ch451_DIG6 0x0E00 //数码管位6显示
#define ch451_DIG7 0x0F00 //数码管位7显示
/*
:TLV2543端口配置
*/
sbit TCL2543_CS=P3^5;
sbit TCL2543_CLK=P3^6;
sbit EOC=P3^7;
sbit TCL2543_ADIN=P2^4;
sbit TCL2543_DOUT=P2^3;
/*
ch451端口配置
*/
sbit ch451_load=P2^0;//片选输入端
sbit ch451_din =P2^1;//串行数据输入/输出端
sbit ch451_dclk=P2^2;//同步时钟输入端
/*
hc245端口配置
*/
sbit hc245_E=P1^0;//输出使能端
sbit hc245_E1=P1^1;//
sbit hc373_LE1=P1^5;
sbit hc373_LE2=P1^6;
sfr P4=0xe8;
sbit led1=P0^4;
bit flag,fdeng=0,shuc=0,pt=0;
unsigned char key,pp;
unsigned int ad_ji;
unsigned char num=0,pj=0,x=5,mj=0;
/*
开8个单元
*/
unsigned char a[8]/*={0,10,12,13,14,15,16,17}*/;
//sbit LED1=P0^4;
/*
led编码
*/
unsigned char code LED[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,/*0,1,2,3,4,5,6,7,8,9*/
0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3e,0x5c,0x38,/*a,b,c,d,e,f,p,u,o,L*/
0x76,0x00,0x40,0x54,0x1E,0x86,0xdb,0x01,0x08,0x09/*H,black,-,n,J,1.,2.,*/};
/* H L 口 */
const uint DigCode[8]={ch451_DIG0,ch451_DIG1,ch451_DIG2,ch451_DIG3,
ch451_DIG4,ch451_DIG5,ch451_DIG6,ch451_DIG7};
/*
:AT24C02B口配置
*/
sbit sda=P2^7;
sbit scl=P2^6;
sbit wp=P2^5;
bit write;
uchar num,z;
//微秒级延时函数(晶振为11.0592MHz, 延时大概4~5微秒, 用来操作I2C总线用)
void delay()
{
;
;
}
//发送启动信号: scl为高电平期间, sda发生负跳变
void start()
{
sda = 1;
delay();
scl = 1;
delay();
sda = 0;
delay();
}
//发送停止信号: scl为高电平, sda发生正跳变
void stop()
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
//应答信号: scl为高电平期间, sda被接受设备拉为低电平, 最后scl置0
void response()
{
uchar i;
scl = 1;
delay();
while((sda == 1) && (i < 250))
i++;
scl = 0;
delay();
}
//总线初始化: 将总线拉高以释放总线
void init()
{
sda = 1;
delay();
scl = 1;
delay();
}
//写字节数据: 将8位数据通过左移到CY(进位),然后赋值给数据线SDA
//每发送一位,scl出现正跳变
//发送完数据后,需要将scl置0, sda置1
void write_byte(uchar dat)
{
uchar i, temp;
temp = dat;
for (i = 0; i < 8; i++)
{
temp = temp << 1;
scl = 0;
delay();
sda = CY;
delay();
scl = 1;
delay();
}
scl = 0;
delay();
sda = 1;
delay();
}
//读字节数据: 将数据一位一位从sda中获取, 每读取一位scl出现负跳变
//通过变量k将8位数据整合为1个字节数据
//读数据前, 先将scl置0, sda置1
uchar read_byte()
{
uchar i, k;
scl = 0;
delay();
sda = 1;
delay();
for (i = 0; i < 8; i++)
{
scl = 1;
delay();
k = (k << 1) | sda;
scl = 0;
delay();
}
return k;
}
//特定地址写数据
void write_add(uchar address, uchar dat)
{
//发送启动信号
start();
//发送控制字
//at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
//1010对应16进制为a, R/W为0(写操作), 合并起来就是0xa0
write_byte(0xa0);
//写入地址后,需要响应
response();
//送一个字节存储单元的子地址
write_byte(address);
//写入地址后,需要响应
response();
//发送8为数据位
write_byte(dat);
//响应信号
response();
//发送停止信号
stop();
}
//特定地址读数据
uchar read_add(uchar address)
{
uchar dat;
//发送启动信号
start();
//发送写控制字
//at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
//1010对应16进制为a, R/W为0(写操作), 合并起来就是0xa0
write_byte(0xa0);
//写入地址后,需要响应
response();
//送一个字节存储单元的子地址
write_byte(address);
//写入地址后,需要响应
response();
//发送启动信号
start();
//发送读控制字
//at24c02的芯片地址为1010,地址控制字格式为1010A2A1A0R/W
//1010对应16进制为a, R/W为1(读操作), 合并起来就是0xa1
write_byte(0xa1);
//读地址后,需要响应
response();
//读取数据赋值给变量dat
dat = read_byte();
//发送停止信号
stop();
return dat;
}
/*
函数:write_ch451()
功能:执行ch451带数据指令
参数:
cmd:命令字
*/
void write_ch451(unsigned int cmd)
{
uchar i;
ch451_load=0;
for(i=0;i<12;i++)
{
ch451_din=cmd&1;
ch451_dclk=0;
cmd=cmd>>1;
ch451_dclk=1;
}
ch451_load=1;
}
/******
显示函数
*******/
void display()
{
if(pj>=1)
{
pj=0;
write_ch451(DigCode[0]|LED[a[0]]);
write_ch451(DigCode[1]|LED[a[1]]);
write_ch451(DigCode[2]|LED[a[2]]);
write_ch451(DigCode[3]|LED[a[3]]);
write_ch451(DigCode[4]|LED[a[4]]);
write_ch451(DigCode[5]|LED[a[5]]);
write_ch451(DigCode[6]|LED[a[6]]);
write_ch451(DigCode[7]|LED[a[7]]);
}
}
/*
ch451初始化
*/
void ch451_init()
{
write_ch451(ch451_rst);
write_ch451(0x0500);
write_ch451(0x0401); //开显示
}
/*
:P0口初始化
*/
void kchushua()
{
wp=0;
hc373_LE1=0;
hc373_LE2=0;
}
/*
延时函数
*/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*
矩阵键盘
*/
//P4.6----(*)----(*)----(*)----(*)----(*)
// | | | | |
//P4.5----(*)----(*)----(*)----(*)----(*)
// | | | | |
//P4.4----(*)----(*)----(*)----(*)----(*)
// | | | | |
// P0.4 P0.3 P0.2 P0.1 P0.0
unsigned char KeyScan()
{
unsigned char temp6;
P4=P4|0x70;//P4=x111 xxxx
P4=P4&0xef;//P4=x110 xxxx
P0=P0|0x1f;//P0=xxx1 1111
temp6=P0;
temp6=P0&0x1f;//temp6=0001 1111
if(temp6!=0x1f)
{
delayms(10);
P4=P4|0x70;//P4.6~4都是1
P4=P4&0xef;//P4.4为0
P0=P0|0x1f;//P0.4~0都是1
temp6=P0;
temp6=temp6&0x1f;
if(temp6!=0x1f)
{
flag=1;//有键按下了
temp6=P0&0x1f;
switch(temp6)
{
case 0x1e:
key=15;
break;
case 0x1d:
key=1;
break;
case 0x1b:
key=2;
break;
case 0x17:
key=3;
break;
case 0x0f:
key=4;
break;
}
}
while(temp6!=0x1f/*()&&(++afolat<500)*/)
{
temp6=P0;
temp6=temp6&0x1f;
}
//display();
return key;//返回key值,退出程序
}
//P4.5取0;其他全1
P4=P4|0x70;//P4=x111 xxxx
P4=P4&0xdf;//P4=x110 xxxx
P0=P0|0x1f;//P0=xxx1 1111
temp6=P0;
temp6=P0&0x1f;//temp6=0001 1111
if(temp6!=0x1f)
{
delayms(10);
P4=P4|0x70;//P4.6~4都是1
P4=P4&0xdf;//P4.5为0
P0=P0|0x1f;//P0.4~0都是1
temp6=P0;
temp6=temp6&0x1f;
if(temp6!=0x1f)
{
flag=1;//有键按下了
temp6=P0&0x1f;
switch(temp6)
{
case 0x1e:
key=5;
break;
case 0x1d:
key=6;
break;
case 0x1b:
key=7;
break;
case 0x17:
key=8;
break;
case 0x0f:
key=9;
break;
}
}
while(temp6!=0x1f)
{
temp6=P0;
temp6=temp6&0x1f;
}
//display();
return key;//返回key值,退出程序
}
//P4.6取0;其他全1
P4=P4|0x70;//P4=x111 xxxx
P4=P4&0xbf;//P4=x110 xxxx
P0=P0|0x1f;//P0=xxx1 1111
temp6=P0;
temp6=P0&0x1f;//temp6=0001 1111
if(temp6!=0x1f)
{
delayms(10);
P4=P4|0x70;//P4.6~4都是1
P4=P4&0xbf;//P4.4为0
P0=P0|0x1f;//P0.4~0都是1
temp6=P0;
temp6=temp6&0x1f;
if(temp6!=0x1f)
{
flag=1;//有键按下了
temp6=P0&0x1f;
switch(temp6)
{
case 0x1e:
key=10;
break;
case 0x1d:
key=11;
break;
case 0x1b:
key=12;
break;
case 0x17:
key=13;
break;
case 0x0f:
key=14;
break;
}
}
while(temp6!=0x1f)
{
temp6=P0;
temp6=temp6&0x1f;
}
//display();
return key;//返回key值,退出程序
}
return key;
}
/*
:按键测试
*/
void kaiqi()
{
hc245_E=0;
key=KeyScan();
if(flag!=0)
{
}
hc245_E=1;
}
/*
:
*/
void wait(unsigned int T_ms)
{
unsigned int i,j ;
for(j=0;j<T_ms;j++)
for(i=0;i<100;i++);
}
/***********串 口 初 始 化 函 数***************/
void TimerInit()
{
TMOD=0x01;//T1,计数模式,T0,定时模式,方式1
EA=1;//开中中断
ET0=1;//开定时器T0中断
TH0=0x4c;//T0,50ms定时初值
TL0=0x00;//T0,50ms定时初值
TR0=1;//开定时0
}
/***********定 时 中 断***************/
void T0_time() interrupt 1
{
TH0=0x4c;
TL0=0x00;
num++;
if(num>=10)
{
num=0;
pj=1;
}
}
/*
:
*/
void anjianpd()
{
kaiqi();
if(key==2)
{
hc373_LE2=1;
led1=~led1;
hc373_LE2=0;
pt=~pt;
}
}
/*
:
*/
void AT24c02()
{
kaiqi();
if(pt==0)
{
a[0]=16;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;pp=0x00;
}
display();
}
/*
:
*/
void cztai()
{
if(pt==1)
{
a[0]=12;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;pp=0x01;
}
display();
}
/*
:ad
*/
void adcaij()
{
a[0]=16;a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=21;
display();
}
/*
:主函数
*/
void main()
{
//uchar z;
init();//总线初始化
TimerInit();//串口初始化
kchushua();
ch451_init();
//adcaij();
while(1)
{
anjianpd();
AT24c02();
cztai();
}
} |