标题: 求此程序的proteus仿真图 [打印本页]
作者: 梦落 时间: 2015-6-30 17:20
标题: 求此程序的proteus仿真图
#include "reg52.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define IO_ADDR P2
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit RST=P1^3;
sbit PSB=P1^5;
sbitmode=P0^0; //key1 模式
sbitinc=P0^1; //kye2 分
sbitdec=P0^2; //key3 时
sbitfmq=P3^4; //蜂鸣器接口
//=============================================
code uchar data1[16]={"作息时间控制系统"};
code uchar data2[]={"某某某 2011026103"};
code uchar data3[]={"时间: : : "};
code uchar data4[]={"打铃: : : "};
uchar disp_buff[4][16];//定义一个二维数组,4行,16个字符
uchar hour,min,sec,minisec;
uchar mode_value=0 ,xf; //调节模式
uchar ds[20][2] =
{
{8,0},{8,45},{8,55},{9,40},{10,0},{10,45},{10,55},{11,40},{14,0},{14,45},
{14,55},{15,40},{16,0},{16,45},{16,55},{17,40},{19,0},{19,45},{19,55},{20,40}
};
//======================================================
/*******************************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//=========================
void delayus(uint i)
{
uchar y;
while(--i)
for(y=0;y<2;y++)
{;}
}
//======================================================
uchar read_data(void)//读状态。//返回值1---空。0-----忙。
{
uchar temp;
RS=0;
RW=1;
delayus(2);
EN=1;
delayNOP();
IO_ADDR=0XFF;
temp=IO_ADDR;//读输入口。
temp=temp&0x80;
EN=0;
if(temp==0x00)
{
return(0);
}
else
{
return(1);}//注:如需软件仿真,需要将此处改为1
}
//============================
void write_data(uchar type,uchar date)//写命令或写数据。
{
while(read_data());
//delayus(100);
if(type)//写数据1
{
RS=1;
}
else//0//写命令
{
RS=0;
}
delayus(1);//1。5US
RW=0;
delayus(1);//1。5US
EN=0;
delayus(1);
delayus(1);
delayus(1);
IO_ADDR=date;
delayNOP();
EN=1;
delayNOP();
EN=0;
delayus(10);
}
//***************************************************************
voidinit_system()//12864初始化部分。
{
PSB=1;
RST=1;
delayus(4);
RST=0;
delay(3);
RST=1;
delay(3);
write_data(0,0x30);//功能设定,8位并行接口
delay(5);
write_data(0,0x30);//功能设定,基本指令集。
delay(5);
write_data(0,0x30);//功能设定,8位并行接口
delay(5);
write_data(0,0x01);//清屏,
delay(5);
write_data(0,0x01);//清屏,
delay(5);
write_data(0,0x02);//将地址指针移到开头位置。
write_data(0,0x0c);//整体显示开。
write_data(0,0x01);//清屏,
write_data(0,0x01);//清屏,
}
//=========================================
//==============================================
void display_buff()//显示2维数组内的内容。
{
uchar i;
uchar *point;
point=&disp_buff[0][0];
//write_data(0,0x01);//清屏,
//delayus(5);
//write_data(0,0x02);//地址归0
//delayus(10);
//write_data(0,0x06);//地址归0
///////////////一行一行的显示////////////////
//行地址:0X80 0X90 0X88 0X98
write_data(0,0X80);//移到0X80位置。
delayus(1);
for(i=0;i<16;i++)
{
write_data(1,*point);
point++;
delayus(1);
}
//=======================================
//=========================================
write_data(0,0X90);
delayus(1);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[1]);
delayus(1);
}
write_data(0,0X88);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[2]);
delayus(1);
}
write_data(0,0X98);
for(i=0;i<16;i++)
{
write_data(1,disp_buff[3]);
delayus(1);
}
}
//=====================================
voidtime0() interrupt 1
{
TH0=0X4C;
TL0=0X00;
if(minisec++>20)
{
minisec=0;
if(++sec>59)
{sec=0;
if(++min>59)
{min=0;
if(++hour>24)
{
hour=0;
min=0;
sec=0;
}
}
}
}
}
voiddelaysj(unsigned char j)//延时程序
{
unsignedchar i;
while(j--)
{
for(i=0;i<50;i++);
}
}
//蜂鸣器
voids_fmq()
{
unsignedchar j=2;
//蜂鸣器叫
while(j--)
{
fmq=0;
delaysj(200);
}
}
/*************************闹铃判断**********************************/
void nling()
{ uchar i ;
for(i=0;i<20;i++)
{
if(hour==ds[0]&&min==ds[1]) //判断是否到闹铃时间
{ if(sec<10)
s_fmq(); //调用蜂铃
}
}
}
//调节模块
voidtiaojie()
{ uchar i;
if(mode==0)
{
while(!mode);
mode_value++;
}
//zifu(0xbc,0xb8,2,mode_value,&shu);
switch(mode_value)
{ //模式0:正常工作。显示“天天向上”
case0:{//uchar i;
for(i=0;i<16;i++)
{
disp_buff[0]=data1;
disp_buff[1]=data2;
}} break ;
case1:{ // 模式1:可以修改时间,其中inc是改分钟,dec是改小时
if(inc==0){while(!inc);min++;if(min==60) min=0;}
if(dec==0){while(!dec);if(min==0) min=60; min--;}
//if(dec==0){while(!dec);hour++; if(hour==24) hour=0;}
// uchar i;
for(i=0;i<16;i++)
{
disp_buff[2]=data3;
}
disp_buff[2][5]=(hour/10)+0x30;
disp_buff[2][6]=(hour%10)+0x30;
disp_buff[2][8]=(min/10)+0x30;
disp_buff[2][9]=(min%10)+0x30;
disp_buff[2][11]=(sec/10)+0x30;
disp_buff[2][12]=(sec%10)+0x30;
display_buff();
};break;
case2:{if(inc==0){ while(!inc);hour++;if(hour==24) hour=0; } // 模式2:选择一个需要改变的闹铃
//if(inc==0){while(!inc);min+;if(min==60) min=0;}
if(dec==0){while(!dec);if(hour==0) hour=24;hour--; }
// uchar i;
for(i=0;i<16;i++)
{
disp_buff[2]=data3;
}
disp_buff[2][5]=(hour/10)+0x30;
disp_buff[2][6]=(hour%10)+0x30;
disp_buff[2][8]=(min/10)+0x30;
disp_buff[2][9]=(min%10)+0x30;
disp_buff[2][11]=(sec/10)+0x30;
disp_buff[2][12]=(sec%10)+0x30;
display_buff();
//zifu(0xbe,0x40,2,xf/10,&shu);
// zifu(0xbe,0x48,2,xf%10,&shu);
// zifu(0xbe,0x68,2,2,&fuhao);
// zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
// zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
/// zifu(0xbe,0x50,2,0,&fuhao);
// zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间”
// zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
} ;break;
case3: { // 模式3:修改选定的闹铃的分钟
if(inc==0){while(!inc);ds[xf][1]++;if(ds[xf][1]==60) ds[xf][1]=0;}
if(dec==0){while(!dec);if(ds[xf][1]==0) ds[xf][1]=60;ds[xf][1]--;}
// uchari;
for(i=0;i<16;i++)
{
disp_buff[3]=data4;
}
disp_buff[3][5]=ds[xf][0]/10+0x30;
disp_buff[3][6]=ds[xf][0]%10+0x30;
disp_buff[3][8]=ds[xf][1]/10+0x30;
disp_buff[3][9]=ds[xf][1]%10+0x30;
disp_buff[3][11]=0+0x30;
disp_buff[3][12]=0+0x30;
display_buff();// 显示“调整后的闹铃时间”
} ;break ;
case4:{ // 模式4:修改选定的闹铃的小时
if(inc==0){ while(!inc);ds[xf][0]++;if(ds[xf][0]==24)ds[xf][0]=0;}
if(dec==0){ while(!dec);ds[xf][0]--;if(ds[xf][0]==0) ds[xf][0]=23;}
// uchari;
//for(i=0;i<16;i++)
// {
// disp_buff[3]=data4;
// }
disp_buff[3][5]=ds[xf][0]/10+0x30;
disp_buff[3][6]=ds[xf][0]%10+0x30;
disp_buff[3][8]=ds[xf][1]/10+0x30;
disp_buff[3][9]=ds[xf][1]%10+0x30;
disp_buff[3][11]=0+0x30;
disp_buff[3][12]=0+0x30;
display_buff();
//hanzi(0xbe,0x40,2,2,&zi); // 显示“时”
// zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示“调整后的闹铃时间”
// zifu(0xbe,0x60,2,ds[xf][0]%10,&shu);
// zifu(0xbe,0x68,2,2,&fuhao);
// zifu(0xbe,0x70,2,ds[xf][1]/10,&shu);
// zifu(0xbe,0x78,2,ds[xf][1]%10,&shu);
} ;break;
case5:{ mode_value=0 ;};break; //模式5:确认修改,返回正常工作状态
default:break;
}
}
//从打铃时间表中找出下一个要打铃的时间
uchar Locate (void)
{//uchar xf;//n;
xf=0;
while(xf<20)
{ if(hour<ds[xf][0]) break;
else if((hour==ds[xf][0])&&(min<=ds[xf][1])) break;
xf++;
//n++;
}
if(xf==20) xf=0;//xf=0;
return(xf);
}
void shizhong()
{ uchar i;
for(i=0;i<16;i++)
{
disp_buff[0]=data1;
disp_buff[1]=data2;
disp_buff[2]=data3;
disp_buff[3]=data4;
}
disp_buff[2][5]=(hour/10)+0x30;
disp_buff[2][6]=(hour%10)+0x30;
disp_buff[2][8]=(min/10)+0x30;
disp_buff[2][9]=(min%10)+0x30;
disp_buff[2][11]=(sec/10)+0x30;
disp_buff[2][12]=(sec%10)+0x30;
//闹铃
disp_buff[3][5]=ds[xf][0]/10+0x30;
disp_buff[3][6]=ds[xf][0]%10+0x30;
disp_buff[3][8]=ds[xf][1]/10+0x30;
disp_buff[3][9]=ds[xf][1]%10+0x30;
disp_buff[3][11]=0+0x30;
disp_buff[3][12]=0+0x30;
display_buff();
}
/*******************************************************************/
/* */
/* 延时函数 */
/*
//========================================== */
//*******************************************************************
voidmain(void)
{
P0=0XFF;
P2=0XFF;
EA=1;
ET0=1;
TH0=0X4C;
TL0=0X00;
TMOD=0X01;
TR0=1;
init_system();
while(1)
{
tiaojie();
shizhong();
nling();
Locate ();
//s_fmq();
}
}
作者: danpianji2020 时间: 2015-6-30 19:04
你有万年历程序没,求帮助
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |