📄 显示.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 + -