main.c

来自「89s51单片机做的计数器」· C语言 代码 · 共 158 行

C
158
字号
////////////////////////////
//private counter
//cjy 2006 11.28 at GDUT
///////////////////////////
#include "reg51.h"
#include"24c02.h"
////////端口定义///////////
#define data_port  P0
#define bit_port   P2
sbit total_led =P3^1;//总计数LED
sbit src       =P3^0;//可控硅
sbit relay     =P3^6;//继电器
///////按键定义///////////
#define set   1
#define right 2
#define up    3
#define rst   4
/////////led数码管笔画表////////////
unsigned char code led_tab[]={     
        0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/
		0x88,/*A*/
        0x83,/*b*/
        0xBF,/*-*/};
///////函数声明/////////////////////
void sys_init(void);
void delay(unsigned int t);
void led_diplay(void);
unsigned  char scan_key(void);
unsigned  char get_key(void);
void conver(void);
void read_all(void);
///////变量声明/////////////////////
unsigned char buff_pointer=0;
struct buff
{
 unsigned char bits[7];
 unsigned int num;
};
struct buff led_buff[3];

////////////主函数//////////////////
void main(void)
{
 sys_init();//系统初始化
 x24c02_init();//初始化EEPROM
 //read_all();//从EEPROM读出各个计数值
 led_buff[0].num=12345;
 while(1){
	  conver();
     led_diplay();}
 while(1)
 {
   //unsigned char key;
   switch(get_key())
    {
     case set:      ;  break;
     case right:    ;  break;
     case up:      led_buff[0].num-- ;  break;
     case  rst:   led_buff[0].num++  ;  break;
     default:  	;      break;
     }while(1){
	  conver();
     led_diplay();}

  }
}
//INT0中断服务程序
void INT0_ISR (void) interrupt 0
{

total_led=~total_led;
//src=~src;
//relay=~relay;
}

void sys_init(void)
{
//这里编写需要初始化的参数
total_led=0;
IT0=1;//负边缘触发
EX0=1;//开INT0中断
EA=1;//开总中断

}
unsigned  char scan_key(void)
  { 
    unsigned char result=0;
    P1|=0x78;//01111000
    //if(P1&0x78!=0x78)
    switch (P1&0x78)
	   {
	     case 0x38:  result=1; break;
	     case 0x58:  result=2; break;
		 case 0x68:  result=3; break;
		 case 0x70:  result=4; break;
		 default: 	 result=0; break;		
	   }
    return result;
  }

unsigned  char get_key(void)
  {
   unsigned char temp1,key_num=0;
   unsigned int i=8000;//按键时间
   if((temp1=scan_key())!=0);
      {
	     delay(30);
        if(temp1==scan_key())
		{
		 key_num=temp1;
	     while(scan_key()!=0&&i--);//放开按键或时间到都可以退出循环
		}
	   }
   return key_num;
  }

 void delay(unsigned int t)
{
 unsigned int i;
 for(i=0;i<t;i++)//
      ;
} 
void conver(void)
{
 unsigned int i;
 unsigned char j;
 i=led_buff[buff_pointer].num;
 for(j=0;j<6;j++)
 {
  led_buff[buff_pointer].bits[j]=i%10;
  i/=10;
 }
}
void led_display(void)
{
 unsigned char k,temp,num;
 temp=0x80;
 for(k=0;k<6;k++)//从右到左扫描,低位到高位
 {
   num=led_buff[0].bits[0];
   data_port=led_tab[num];
   bit_port=~temp;
   temp=temp>>1;
   delay(300);
   bit_port=0xff;//消除鬼影
    //delay(10);
  }
 }

⌨️ 快捷键说明

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