⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电脑时钟.txt

📁 里面含有含有5个不同的源代码。他们有是对51内部资源的编程
💻 TXT
字号:
#include <io8515.h>
#include <macros.h>
#include <slavr.h>
#pragma interrupt_handler timer1:7
#pragma data:code
          /*   七段译码字形表     */        
const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data
          /*     显示缓冲区       */
unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
unsigned char time[3]={0,0,0};
unsigned char flag=0;
/*****************************************
               初始化
*****************************************/
/***********************************************/	
void write_lcd(unsigned char data,unsigned char data_type);
/************************************************
         从LCD读取数据或地址                                            
 	     data_type:数据类型
		 1表示数据,0表示指令		 
************************************************/		
unsigned char read_lcd(unsigned char data_type);
/*****************************************************
                LCD初始化函数
******************************************************/	
void lcd_init(void);
/*********************************
          单字符输出函数
*********************************/
void lcd_putc(unsigned char c) ;
/*********************************
         字符串输出函数
*********************************/
void lcd_puts(unsigned char *s);
/*********************************
         清除LCD显示函数
*********************************/
void lcd_clear(void);
/*****************************************************
       写数据到指定DDRAM/CGRAM位置
	   
*****************************************************/
void lcd_write(unsigned char adder,unsigned char data);
/*****************************************************
             写数据到DDRAM当前位置
	   
*****************************************************/
void lcd_write_data(unsigned char data);
/*****************************************************
       从指定DDRAM/CGRAM位置读取数据
	   
*****************************************************/
unsigned char lcd_read(unsigned char adder);
/*****************************************************
      将光标转移到DDRAM指定位置处
	      x:0~39,y:0~1
*****************************************************/
void lcd_gotoxy(unsigned char x,unsigned char y);
/************************************************
            LCD字符移位函数
	n:移动的次数 
	p:移动方向,'l'或'L'表示左移,'r'或'R'表示右移		
*************************************************/
void lcd_shift(unsigned char n,unsigned char p);
/****************************************************
      延时函数(mS),对应晶振频率为8MHZ  
*****************************************************/
void delay_1ms(void);
void delay_ms(unsigned int n);
/****************************************************
      键盘扫描函数,注意本函数不作按键释放检查					 
	  返回值:1、没有键按下返回0x7f
              2、如果shift按下,返回值最高位为1
              3、其余键按下时,返回键名对应数值
	  
****************************************************/
unsigned char scan_key(void);
/****************************************************
      键盘扫描函数,注意本函数作按键释放检查					 
	  返回值:1、没有键按下返回0x7f
              2、如果shift按下,返回值最高位为1
              3、其余键按下时,返回键名对应数值
	  
****************************************************/
unsigned char keypad(void);
/**************************************
            I2C启动
**************************************/
void Start(void);
/*************************************
            I2C停止
**************************************/
void Stop(void);
/**************************************
            发送应答信号
**************************************/
void Ack(void);
/*************************************
             不发送答信号
**************************************/
void NoAck(void);
/**************************************
            测试应签信号         
**************************************/
unsigned char TestAck(void);
/***************************************
             I2C写数据
***************************************/
void Write8Bit(unsigned char input);
/****************************************
              写24C02            
*****************************************/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number);
/*****************************************
             读取I2C数据
*****************************************/
unsigned char Read8Bit(void);
/***************************************
              读24C02
***************************************/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
/***************************************
            微秒延时程序
***************************************/
void delay_us(int time);
/*********************************************
          检查DS1820是否存在:
	如果DS1820不存在返回1,否则返回0
*********************************************/
unsigned char ds1820_ack(void);
/*********************************************
           写ROM或存贮器命令到DS1820
*********************************************/
void ds1820_write(unsigned char cmd);
/*********************************************
          从DS1820读1字节数据
*********************************************/ 
unsigned char ds1820_read(void);
/*********************************************
                CRC校验
*********************************************/
unsigned char crccheck(unsigned char *p,unsigned char len);

void port_init(void)
 {
  DDRD=0x3f;
  DDRB=0xff;
  PORTD=0xff;
  PORTB=0xff;
  TIMSK=0x80;//开放T1溢出中断
  TCCR1A=0x00;
  TCCR1B=0x04;
  TCNT1=0x85ee;
  SEI();
 }
/*****************************************
             刷新LED显示缓冲区
*****************************************/
void hextobcd (void)
   {
    unsigned char i,temp;
	for (i=0;i<3;i++)
    {
	temp=time[i]/10;
	temp=temp%10;
	ledbuff[5-2*i]=tabel[temp];
	temp=time[i]%10;
	ledbuff[4-2*i]=tabel[temp];
	}
   } 
/*****************************************
          六路动态扫描显示电路
*****************************************/   
void display(void)
{
 unsigned char i;
 for (i=0;i<6;i++)
  {
   PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
   PORTD=~(1<<i);   //开始显示
   delay_1ms();     //每一位显示保持一定时间
   PORTD|=(1<<i);   //关闭显示
  }
}
/*****************************************
          设定校时时间
*****************************************/  
void settime(void)
   { 
    unsigned char t1,t2,t3;
	for (t1=0;t1<3;t1++)
	{ 
	   ledbuff[5-2*t1]|=0x80;
       do
	     {
		 t2=scan_key();
	  	 display();
		 }
	   while(t2==0x7f);	 
	   do 
	     {
		 t3=scan_key();
	     display();	    
	     }
       while (t2==t3);
	   time[t1]=time[t1]%10+t2*10;
	   hextobcd();
	   ledbuff[5-2*t1]&=0x7f;
	   ledbuff[4-2*t1]|=0x80;
       do
	     {
		 t2=scan_key();
	  	 display();
		 }
	   while(t2==0x7f);	 
	   do 
	     {
		 t3=scan_key();
	     display();	    
	     }
       while (t2==t3);
	   t3=time[t1]/10;
	   time[t1]=t3*10+t2;
	   ledbuff[4-2*t1]&=0x7f;
	   hextobcd();	   		 	    
    }
    }
/*****************************************
主程序功能:演示了电脑时钟程序的工作过程
*****************************************/
void main(void)
{
 unsigned char i,j;
 MCUCR=0;
 flag=0;
 port_init(); //端口初始化
 i=scan_key();
 while(1)
  {
   i=scan_key(); 
   if (i!=0x7f)
     {
	  do 
	   {
	    j=scan_key();
	    display();	    
	   }
	  while (i==j); 
      if ((i&0x80)==0x80) 
	      settime();//设定时间
	 }
   if(flag==1)
    {
	 flag=0;
	 if (time[2]>=60) 
	    {
		 time[2]-=60;
		 time[1]++;
		 }
	if (time[1]>=60) 
    {
	 time[1]-=60;
	 time[0]++;
	 } 
	if (time[0]>=24) 
	    {
		 time[0]-=24;
		 }
	 hextobcd();
    }
   display();
  }
}
/*****************************************
          T1溢出中断
*****************************************/  
void timer1(void)
   {
    flag=1;
	time[2]++;
	TCNT1=0x85ee;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -