//程序名:KeyBoard_8255_Apply
//功能描述:1.开机后,按下OPEN(K12)显示HELLO-;
//2.按下RUN(K13)后,后两位开始计数00-99;
//3.按下STOP(K15)后,停止运行,继续显示HELLO- ;
//4.按下+1(K14)后,对四位数码管的最后一位做+1调整,0-9;
//硬件电路,J8中1,3短接,独立按键
//调用函数:Disp_HELLO();Disp_number();Disp_increment();
//Set_Init_Timer1();Delayx1ms(uint cout);
#include<reg51.h>
#include<ABSACC.H>
#define uchar unsigned char
#define uint unsigned int
#define COM8255 XBYTE[0XFFFF]
#define PA8255 XBYTE[0XFFFC]
#define PB8255 XBYTE[0XFFFD]
#define PC8255 XBYTE[0XFFFE]
sbit P1_2 = P1^2;
sbit P1_1 = P1^1;
sbit P1_0 = P1^0;
sbit SLCK = P2^4;
//函数声明
void Disp_HELLO();
void Disp_number();
void Set_Init_8255();
void Delayx1ms(uint count);
void Set_Init_Timer1();
void Disp_increment();
uchar code dis_HELL[]={0x89,0x86,0xc7,0xc7}; //四位数码管HELL
uchar code dis_number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //四位串并转换控制数码管0-9
uchar code dis_count[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//四位数码管0-9,
uchar number=0,numberh,numberl,i=0,j=0;
void main()
{
Set_Init_Timer1();
do{
Set_Init_8255();
switch(PB8255)
{
case 0xef: Disp_HELLO(); break; //K12按下
case 0xdf: TR1=1; Disp_number(); break; //K13按下
case 0xbf: Disp_increment(); break; //K14按下
case 0x7f: Disp_HELLO(); break; //K15按下
}
}while(1);
}
void Set_Init_Timer1() //定时器1初始化
{
TMOD =0X10; //Timer 1,Moder 1
TH1 =0X3C; //50ms定时
TL1 =0XB0;
EA =1;
ET1 =1;
}
/*******************************************************/
//函数名:Run_Timer1() interrupt 3 using 1
//功能:利用定时器精确定时50ms
//说明:定时器1中断服务程序
/*******************************************************/
Timer1_int() interrupt 3 using 1
{
static unsigned char count =0;
TH1 =0X3C; //50ms定时
TL1 =0XB0;
count ++;
if(count ==20) //每秒时间到
{
number++;
count =0;
if(number==99)
{
number=0;
}
}
}
/******************************************************/
//函数名:Disp_HELLO();
//功能:动态显示HELL,串行口移位寄存器工作显示o-
//调用函数 Delayx1ms(5)
/******************************************************/
void Disp_HELLO()
{ TR1=0;
P1=0x7f; //四位数码管显示
P2=dis_HELL[0];
Delayx1ms(1);
P1=0xbf;
P2=dis_HELL[1];
Delayx1ms(1);
P1=0xdf;
P2=dis_HELL[2];
Delayx1ms(1);
P1=0xef;
P2=dis_HELL[3];
Delayx1ms(1);
SCON=0X00; //串口方式0工作
SBUF=0XFC; //发送0字符
while(! TI);
TI=0;
SLCK=0;
SLCK=1; //产生上升沿,将74HC595存储器数据输出
SBUF=0X02; //发送- 字符
while(! TI);
TI=0;
SLCK=0;
SLCK=1; //产生上升沿,将74HC595存储器数据输出
for(i=0;i<0xff;i++);//调整数码管显示效果
}
/************************************************************************/
//函数名:void Delayx1ms(uint count);
//功能:延时时间为1ms,
//输入参数,1ms计数
//说明:总共延时时间为1ms x count
/*********************************************************************/
void Delayx1ms(uint c)
{
uint j;
while(c--!=0)
{
for(j=0;j<72;j++);
}
}
void Disp_number()
{ SCON=0X00; //串口方式0工作
numberl=number%10;
numberh=number/10;
SBUF=dis_number[numberl]; //计数低位
while(! TI);
TI=0;
SLCK=0;
SLCK=1; //产生上升沿,将74HC595存储器数据输出
SBUF=dis_number[numberh]; //计数高位
while(! TI);
TI=0;
SLCK=0;
SLCK=1; //产生上升沿,将74HC595存储器数据输出
for(i=0;i<0xff;i++);//调整数码管显示效果
}
void Set_Init_8255()
{
COM8255=0X82; //8255B口输入
P1_2=0; //8255片选P1_2=0
P1_1=1; //8255片选P1_1=0
P1_0=0; //8255片选P1_0=0
}
/********************************************************************/
//函数名:void Disp_increment();
//功能: 加一计数0-9
//调用函数: Delayx1ms(5)
/************************************************************/
void Disp_increment()
{
j++;
if(j==10){j=0;}
P1=0x7f;
P2=0xff;
Delayx1ms(5);
P1=0xbf;
P2=0xff;
Delayx1ms(5);
P1=0xdf;
P2=0xff;
Delayx1ms(5);
P1=0xef;
P2=dis_count[j];
Delayx1ms(5);
Delayx1ms(1000);
}