当前位置:文档之家› AT89C51单片机程序

AT89C51单片机程序

#include
#include"ch451.h"
sbit beep=P2^6;
uchar timecount=0;
uint count;
extern uchar shishi,shige,fenshi,fenge,miaoshi,miaoge;
extern bit stop_flag,ss_flag;
void main()
{
ch451_write(CH451_RESET); //CH451复位
ch451_write(CH451_SYSON2); //开显示、键盘
ch451_write(CH451_DSP); //设置BCD不译码方式 由于板画错了 此设置很重要
ch451_write(CH451_TWINKLE); //设置闪烁控制——正常显示
ch451_init();
timer0count_init();
while(1)
{
key_Recognize();
time_dispose();
smg_Display();
}
}
void timer0_isr() interrupt 1
{
TH0=0x08;
TL0=0x00;
timecount++;
if(timecount>3)
{
if(!stop_flag)
{
if(timecount>6)
{
timecount=0;
//beep=~beep;
miaoge++;
}
}
else if(stop_flag)
{
timecount=0;
ss_flag=~ss_flag;
}
}
}
void ch451_inter() interrupt 3
{
Get_keyValue();
TL1=1; //装载计数初值
TH1=200;
}





#include"ch451.h"
#include
sbit ch451_dclk=P3^4; //串行数据时钟上升延激活
sbit ch451_din=P3^3; // 串行数据输出,接CH451的数据输人
sbit ch451_load=P2^3; //串行命令加载,上升延激活
sbit ch451_dout=P2^2; //键值数据输入,接ch451数据输入
sbit beep=P2^6;
uchar ch451_key; // 存放键盘中断中读取的键值
uint display[8]={0x0a00,0x0900,0x0b00,0x0800,0x0c00,0x0d00,0x0e00,0x0f00};
uchar BCD[10]={0xbe,0x24,0xea,0xe6,0x74,0xd6,0xde,0xa4,0xfe,0xf6};//0~9
uchar shishi,shige,fenshi,fenge,miaoshi,miaoge;
bit stop_flag=0,ss_flag=0;
uchar num=1;
void delay(uint i)
{
while(--i);
}
void time_dispose()
{
if(miaoge>9)
{
miaoge=0;
miaoshi++;
if(miaoshi>5)
{
miaoshi=0;
fenge++;
if(fenge>9)
{
fenge=0;
fenshi++;
if(fenshi>5)
{
fenshi=0;
shige++;
if(shige>4)
{
shige=0;
shishi++;
if(shishi>2)
{
shishi=0;
}
}
}
}
}
}
}
void ch451_init()
{
ch451_din=0; //先低后高,选择4线输入
ch451_din=1;
TMOD=0x11; //设置定时器T1工作在16位计时状态
EA=1; //开中断总开关
ET1=1; //允许中断
TR1=1; //开中断
PT1=0; //设置低优先级
TL1=1; //装载计数初值
TH1=200; //此计数初值用来调试
}
void timer0count_init()
{
ET0=1;
TR0=1;
TH0=0x08;
TL0=0x00;
}
//*****************************************************
//定义一无符号整型变量存储12字节的命令字。
void ch451_write(uint command)
{
uchar i;
TR1=0;
ch451_load=0; //命令开始
for(i=0;i<12;i++)
{ //送入12位数据,低位在前
ch451_din=comm

and&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; //上升沿有效
}
ch451_load=1; //上升沿加载数据
TR1=1;
}
void smg_Display()
{
ch451_write(display[2]+0x40);
ch451_write(display[5]+0x40);
if(stop_flag)
{
if((num!=6)||(ss_flag==0))
{
ch451_write(display[7]+BCD[shishi]);
}
else if((num==6)&&(ss_flag==1))
{
ch451_write(display[7]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[7]+BCD[shishi]);
}
//ch451_write(display[0]+BCD[shishi]);
if(stop_flag)
{
if((num!=5)||(ss_flag==0))
{
ch451_write(display[6]+BCD[shige]);
}
else if((num==5)&&(ss_flag==1))
{
ch451_write(display[6]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[6]+BCD[shige]);
}
//ch451_write(display[1]+BCD[shige]|0x01);
if(stop_flag)
{
if((num!=4)||(ss_flag==0))
{
ch451_write(display[4]+BCD[fenshi]);
}
else if((num==4)&&(ss_flag==1))
{
ch451_write(display[4]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[4]+BCD[fenshi]);
}
//ch451_write(display[2]+BCD[fenshi]);
if(stop_flag)
{
if((num!=3)||(ss_flag==0))
{
ch451_write(display[3]+BCD[fenge]);
}
else if((num==3)&&(ss_flag==1))
{
ch451_write(display[3]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[3]+BCD[fenge]);
}
//ch451_write(display[3]+BCD[fenge]|0x01);
if(stop_flag)
{
if((num!=2)||(ss_flag==0))
{
ch451_write(display[1]+BCD[miaoshi]);
}
else if((num==2)&&(ss_flag==1))
{
ch451_write(display[1]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[1]+BCD[miaoshi]);
}
//ch451_write(display[4]+BCD[miaoshi]);
if(stop_flag)
{
if((num!=1)||(ss_flag==0))
{
ch451_write(display[0]+BCD[miaoge]);
}
else if((num==1)&&(ss_flag==1))
{
ch451_write(display[0]+0);
}
}
else if(!stop_flag)
{
ch451_write(display[0]+BCD[miaoge]);
}
}
void key_Recognize()
{
switch(ch451_key)
{
case 0x40:delay(65000);num=1;stop_flag=~stop_flag;
break;
case 0x48: delay(65000);
num++;
if(num>6)
{
num=1;
}break;
case 0x49: delay(65000);
num--;
if(num<1)
{
num=6;
}
break;
case 0x43:delay(65000);
if(stop_flag)
{
switch(num)
{
case 1:if(miaoge<9)
{
miaoge++;
}break;
case 2:if(miaoshi<5)
{
miaoshi++;
}break;
case 3:if(fenge<9)
{
fenge++;
}break;
case 4:if(fenshi<5)
{
fenshi++;
}break;
case 5:if(shige<4)
{
shige++;
}
case 6:if(shishi<2)
{
shishi++;
}
}
}break;
case 0x4b:delay(65000)

;
if(stop_flag)
{
switch(num)
{
case 1:if(miaoge>0)
{
miaoge--;
}break;
case 2:if(miaoshi>0)
{
miaoshi--;
}break;
case 3:if(fenge>0)
{
fenge--;
}break;
case 4:if(fenshi>0)
{
fenshi--;
}break;
case 5:if(shige>0)
{
shige--;
}
case 6:if(shishi>0)
{
shishi--;
}
}
}break;
default :;break;
}
}
void Get_keyValue()
{
uchar i; //定义循环变量
uchar command,keycode; //定义控制字寄存器,和中间变量定时器
command=0x07; //读取键值命令的高4位0111B
ch451_load=0; //命令开始
for(i=0;i<4;i++)
{
ch451_din=command&1; //低位在前,高位在后
ch451_dclk=0;
command>>=1; //右移一位
ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据
}
ch451_load=1; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i<7;i++)
{
keycode<<=1; //数据作移一位,高位在前,低位在后
keycode|=ch451_dout; //从高到低读入451的数据
ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位
ch451_dclk=1;
}
ch451_key=keycode; //保存上次的键值
TL1=1; //重新装载计数初值
TH1=100;
// beep=0;
}

相关主题
文本预览
相关文档 最新文档