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

📄 显示.c

📁 这是采用KeilC51进行编写的单片机程序
💻 C
字号:
/*
   1   2   3   4 
   5   6   7   8
   star
*/
#include "reg52.h"
unsigned int Volt;
        
#define    key_0  0
#define    key_1  1
#define    key_2  2
#define    key_3  3
#define    key_4  4
#define    key_5  5
#define    key_6  6
#define    key_7  7
#define    key_8  8
#define    key_9  9
#define    key_star 0x0a
#define    key_circle 11
#define    key_nul  255

unsigned char idata buff[9],p_led =50;
sbit       P1_4=P1^4;
sbit       P1_5=P1^5;
sbit       P1_6=P1^6;
sbit       P1_7=P1^7;
//
// 按键扫描程序:如果有键值则返回键值,无键值返回 key_nul
//

unsigned char rKey( void )
{
    unsigned char temp= key_nul ;	//无按键值
    P1=0xff ;     // 读键时先对P1口置1
    P1= 0xfe ;     // 将p1.0置0,实现读第一列值    1111 1110
    if ( !P1_4 )
          temp= key_1 ;
    if ( !P1_5 )
          temp= key_5;
    if ( !P1_6 )
          temp= key_star ;
     
//第二行
    P1= 0xfd ;    // 将p1.1置0,实现读第二列值    1111 1101
    if ( !P1_4 )
          temp= key_2 ;
    if ( !P1_5 )
          temp= key_6 ;
	if ( !P1_6 )
		  temp= key_circle;
 
//第三行
    P1= 0xfb ;    // 将p1.2置0,实现读第三列值      1111 1011
	if ( !P1_4 )
          temp= key_3 ;
    if ( !P1_5 )
          temp= key_7 ;
         
//第四行
    P1= 0xf7 ;    // 将p1.3置0,实现读第四列值         1111 0111
    if ( !P1_4 )
          temp= key_4 ;
    if ( !P1_5 )
          temp= key_8 ;
     
    return( temp ) ;
}

//
//  响应用户按的一个键, 返回一个正确的键值
//
unsigned char read_key( void )     //  aa= getch() ;
{
     unsigned char i;
     unsigned int j;
     for( ; rKey( )!= key_nul ; );     // 等待用户松开按键 即无返回键值
     for( j= 0; j< 1000; j++ ) ;      // 延时,起到消抖作用
     for( ; rKey( )!= key_nul ; );     // 等待用户松开按键 即无返回键值

loop:
     for ( ; rKey( )== key_nul; );     // 等待用户重新按键
     i=rKey( );                       // 第一次读入按键值
     for ( j= 0; j< 1000; j++ );      // 延时,起到消抖作用
                     // 和第二次读回来比较,如果相等,返回键值,如果不等继续等键值
     if ( i== rKey())
	 {
	 	return ( i ) ;
	 }
      
     else
     {
     	goto loop;
     }
}

void Delay( void )
{
	unsigned int i;
	for( i=0; i<40000 ;i++ ) ;
}



#define  DIS_NULL   0x0a
char code LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00} ;
unsigned char DisBuff[4]={9,8,7,6},LedP=0;
unsigned char num[8]={0x23,0x43,0x61,0x34,0x64,0x91,0xfd,0x32};

// 每2ms执行一回中断的中断程序, 实现LED数码管动态显示

void timero(void) interrupt 1    // time0中断 中断号为 1
{                                
	unsigned char temp ;
	TL0= ( 65536-1000 ) % 256 ;
	TH0= ( 65536-1000) / 256 ;
	P2= P2 & 0xf0 ;		// P2 同 1111 0000 与 
	P2= P2 | 1<<LedP ; 		//0000 0001 | 0000 0000
    if(LedP==1&&DisBuff[LedP]!=DIS_NULL)
		P0= LEDCODE[DisBuff[LedP]]+0x80;
	else 
		P0= LEDCODE[DisBuff[LedP]] ;
	LedP++ ;
	if( LedP >=4 ) LedP= 0;
   	Volt=num[rKey()-1];
	Volt=Volt*50/255;
}


void PrintT( void )
{   
	/*unsigned char i;
	unsigned int n;
	i=0;	
loop:
	if( rKey()==11 )
	{	
		i=0;
		while(1)
		{
			Volt=num[i];
			Volt=Volt*50/255;
			DisBuff[3]= i+1; 
			DisBuff[0]= Volt%10;
			DisBuff[1]= Volt/10;
			i++;
			if(i==8)i=0;
			for(n=30000;n>0;n--)
			{
				if(rKey()!=key_nul)
				goto loop;
			}
    	}
	}
	else
	{*/
    DisBuff[3]= read_key(); 
	DisBuff[0]= Volt%10;
	DisBuff[1]= Volt/10;
	//}
}
/*void	INT() interrupt	4	//采用中断方式实现与PC通信
{	
	unsigned char i;
	EA=0;               	//关中断
	if(RI)					//判断何种中断,RI或TI
	{
		
		RI=0;				//清接收标志位
		buff[num]=SBUF;			//接收到的数据送P0口,数码管显示
		num++;
		if(num>7)
		{
			num=0;

		}
	}
	else					//发送完成标志位清0
	{
		TI=0;
	}
	EA=1;					//开中断
}
void	send()
{
	  EA=0;
      SBUF=rKey();
	  while(!TI);
	  TI=0;
	  num=0;
	  EA=1;
}*/
void  main( void )
{
	unsigned long DispNum= 0 ;
	unsigned char i ;
	TMOD= 0x01 ;		// 模式配置,time0 16位计数方式
	TR0= 1 ;			// time0 计数开始
	ET0= 1 ;			// 允许产生中断
	TL0= ( 65536-2000 ) % 256 ;
	TH0= ( 65536-2000 ) / 256 ;
/*	
	TMOD^= 0x20;			//使用T1计数器
	TL1 = 0xfd;				//9600bps
	TH1 = 0xfd;
	SCON = 0x50;			//允许接收
	PCON = 0x00;*/
	ES=1;					//开串口中断/			
	EA=1;					//开总中断
	TR1 = 1;	
	for( i= 0; i< 4; i++ ) DisBuff[i]= DIS_NULL;      
	for( ; ; )
	{   
	
		ES=1;					//开串口中断/			
		EA=1;					//开总中断
		TR0= 1 ;			// time0 计数开始
		ET0= 1 ;			// 允许产生中断
		TR1 = 1;	
	/*	REN=1;
  		if(rKey( )!=key_nul)
		send( );*/
        PrintT( ) ;

	}
}


⌨️ 快捷键说明

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