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

📄 display1.c

📁 基于S51单片机的C源码 对学习S51单片机的同学很有帮助 包含了实验室的和多模块程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
2005.3.8:
       COM_key=0xff;  空键时,键值为0xff
2005。1。6
修改:为了调试主机接收功能,从机的INT0和在INT1中当上一个字节发生完毕后应将准备送出的BIT预先放到
DOUT线上,并预先左移一个BIT :
INT0中
iab=COM_buff[0];
dout=iabit7;
iab<<=1;
COM_buff[0]=iab;
和(INT1中):
if(bit_count==0){
       bit_count=0x08;
       COM_ptr++;
       iab=COM_buff[COM_ptr];
       dout=iabit7;
       iab<<=1;
       COM_buff[COM_ptr]=iab;

  该函数主要完成的功能有:LED动态扫描,按键扫描,SPI从机接口
      SPI从机接口:
                   从机:      1         2       3       4       5       6       7
                    地        P1。1     P1。2   P3。2   P3。3
                                                INT0     INT1 (中断方式实现CS CLK)
                             DOUT     DIN       CS      CLK
                 选通和时钟都采用中断方式,提高系统的适时性能
void ex_int0(void) interrupt 0 using 2
{
//dis_buff[4]++;
COM_ptr=0; bit_count=0x08;  字节指针范围0--3  位指针范围0--7
iab=COM_buff[0];            将当前字节(首字节)准备左移
dout=iabit7;                移到发送线上
busy=1; second_COM=0;       设置'忙'信号,超时逃脱定时器清零
IE0=0;                      外中断标志位清零
}
void ex_int1(void) interrupt 2 using 3
{
//if(!busy) return;
EX0=0;                      外中断0关闭
//dis_buff[5]++;
iab=COM_buff[COM_ptr];     将当前字节的最高位移到DOUT上
dout=iabit7;
iab<<=1;
iabit0=din;                将DIN接收到当前字节的最低位
COM_buff[COM_ptr]=iab;
bit_count--;               位计数器减1
if(bit_count==0){          位计数器减到零时,字节指针下移,准备发送下移个字节
       bit_count=0x08;
       COM_ptr++;
       if(COM_ptr>3){COM_ptr=0; busy=0; flag_COM=1;} 发送完毕设置标志
       }
IE0=0; EX0=1;              外中断0打开
}



动态扫描 9个LED显示  9个按键,两组灯LED动态扫描

Og 段码    P0.7     P0.6        P0.5    P0.4    P0.3    P0.2    P0.1    P0.0
           dp        c           d       e       a       b       f       g                          O b
Of 位码
          百      十      个              百      十      个            百      十      个          O f
Oe       P3.7    P3.6    P2.0           interr
.1    P2.2    P2.3            P2.4    P2.5    P2.6                                                                           .2
P3.5                                                                                                O dp

按键:                                                                                              O c
                                                                                                    P2.7
         P3.7  P3.6   P2.0             P2.1  P2.2   P2.3               P2.4  P2.5   P2.6
        P1.7--公共线
看门狗  P1.0

*/


#pragma small //LARGE
#include <absacc.h>
#include <reg52.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int
#define KEYBORD P2
#define dis_wei P2
#define dis_out   P0
data uchar xpos,ypos;
sbit disw0=P3^7;
sbit disw1=P3^6;
sbit disw2=P2^0;
sbit disw3=P2^1;
sbit disw4=P2^2;
sbit disw5=P2^3;
sbit disw6=P2^4;
sbit disw7=P2^5;
sbit disw8=P2^6;
sbit disw9=P2^7; //4灯 a g b f
sbit diswa=P3^5; //3灯 a g b f
sbit int_key=P3^0;
bit  key0,key1;
bit   busy;
 bdata uchar ab;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
bdata uchar iab;
sbit iabit0=iab^0;sbit iabit1=iab^1;sbit iabit2=iab^2;sbit iabit3=iab^3;
sbit iabit4=iab^4;sbit iabit5=iab^5;sbit iabit6=iab^6;sbit iabit7=iab^7;

data uchar dis_p,dis_buff[12],key_value;
//idata uchar str[20];
sbit key_enable=P1^7;
data uchar us250,ms50,second,second1,second_COM,T_key,minuter,old_minute;
//data unsigned char T_50ms,T_key,ms_timing,second,second2,minute,minuter,minute1;
data  uchar key_sfr,COM_key;
bdata  uchar key_sfr0;
       sbit key_set             =key_sfr0^0;
       sbit key_up              =key_sfr0^1;
       sbit key_down            =key_sfr0^2;
       sbit key_ok              =key_sfr0^3;
       sbit key_set2            =key_sfr0^4;
       sbit key_up2             =key_sfr0^5;
       sbit key_down2           =key_sfr0^6;
       sbit key_ok2             =key_sfr0^7;
bit    key_run;
bit flag_key,flag_key0,flag_cursor;
idata unsigned  char second_k,speed;
sbit load=P1^4; /*0;*/
sbit clk=P1^3;  /*1;*/
sbit din=P1^2;
sbit dout=P1^1;
//sbit flag=P1^0;
sbit x25_cs=P1^0;
bit    flag_COM;
uchar  ex_int_ok;
uchar COM_buff[4],COM_ptr,bit_count;
/*---------------------------------------------------------*/

/*----------------------------------------------------*/
void from_sfr_sfr0(void)
{
static data uchar old_key=0xff,count=0;
if(key_sfr==old_key){
	count++;
	if(count>15){
		speed=1; count=15;
		}
	if(second_k>2){
		speed=0; count=0;
		}
	second_k=0;
	}else{
	old_key=key_sfr;
	speed=0;
	count=0;
	second_k=0;
	}
key_sfr0=0;
switch(key_sfr){
	case 0:
		key_set=1;   /*cut=1;*/
                key_ok=1;
		break;

	case 1:
		key_up=1;  /*start=1;*/
		break;

	case 2:
		key_down=1;
		break;
	case 3:
		key_set2=1;   /*cut=1;*/
                key_ok2=1;
		break;

	case 4:
		key_up2=1;  /*start=1;*/
		break;

	case 5:
		key_down2=1;
		break;

	default:
		break;
	}
}
/*----------------------------------------------------*/
/*
getkey0:
	uchar getkey0(uchar i,uchar j)
	i---line
	j---columue
	key_value=i+3*j  i=0,1,2 j=0,1,2,3  key value=0--11  no key down when return 0xff
	*/
/*----------------------------------------------------*/
uchar getkey0(void)
{
data uchar ch,i;
code uchar colu[8]={0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,0x7f};
//                 P2.0  P2.1   P2.2   P2.3   P2.4   P2.5   P2.6  P2.5   P2.7

//KEYBORD=0xff;
while(!flag_key0){}
flag_key0=0;
ch=key_value&0x7f; //没有P2.7线的按键
//PC8155=0xff;
if(ch==0x7f){
        if(key0&key1) return 0xff;
        }
for(i=0;i<7;i++){
  if(ch==colu[i]) return i+2;
  }
if(!key0)return 0;
if(!key1) return 1;
return 0xff;  //=change[ch];
}
/*----------------------------------------------------*/
void rst_wdog(void);

/*----------------------------------------------------*/
/*RIGTH  →   0
  定点        1
  查询        2
  UP      ↑  3
  巡检        4
  LEFT    ←  5
  快速    K   6
  打印        7
  设定        8
  DOWN    ↓  9
  消音    *   10
  确认    #   11
  */
void getkey(void)
{
static data key_num=0;
data uchar ch,i;  /*xdata*/
	ch=getkey0();
	if(flag_key){
		if(ch==key_sfr&&ch!=0xff){
			minuter=0;
			return;
			}

		flag_key=0;
		key_sfr0=0;
		key_num=0;
		T_key=0;
		key_sfr=0xff;

		return;
	        }
	key_sfr=ch;
	rst_wdog();
	if(ch==0xff){
		key_sfr0=0;
		key_num=0;
		if(T_key>2){ //4
                            T_key=0;
                            //bee=0;
                            }
		return;
		}
	for(i=0; i<10; i++){ //20
		ch=0;
		ch=0;
		ch=0;
		ch=0;
		ch=getkey0();
		if(key_sfr==ch)continue;
		minuter=0;
		return;
	  }
	  /*
	key_num++;
	if(key_num<2)return;
	key_num=0;
	*/
	if(T_key<2)return; //4
	from_sfr_sfr0();
	flag_key=1;
	//bee=1;
	for(i=0;i<200;i++)ch=0;
//	for(i=0;i<200;i++)ch=0;
//	for(i=0;i<200;i++)ch=0;
	/*bee=0; 2001.3.*/
}
/*----------------------------------------------------*/
/*----------------------------------------------------*/
void rst_wdog(void)
{
x25_cs=0;    //cs_5045=0;
x25_cs=0;    //cs_5045=0;
x25_cs=1;    //cs_5045=1;
}
/*----------------------------------------------------*/

void init_t0(void)
{
TMOD=0x22;
TH0=TL0=0;
TR0=1;
EA=ET0=1;
}
/*
void watch_dog(void)
{
x25_cs=0;
x25_cs=0;
x25_cs=1;
}
*/
uchar  r_7219(uchar iw,uchar ix);
/*********************************************************/
void ex_int0(void) interrupt 0 using 2
{
//dis_buff[4]++;
COM_ptr=0; bit_count=0x08;
COM_buff[0]=COM_key;
//iab=COM_buff[0];
//dout=iabit7;
//iab<<=1;
//COM_buff[0]=iab;
busy=1; second_COM=0;
IE0=0; IE1=0;
}
/*********************************************************/
void ex_int1(void) interrupt 2 using 3
{
//if(!busy) return;
EX0=0;
//dis_buff[5]++;
iab=COM_buff[COM_ptr];
dout=iabit7; iab<<=1;
iabit0=din;
COM_buff[COM_ptr]=iab;
bit_count--;
if(bit_count==0){
       bit_count=0x08;
       COM_ptr++;
       //iab=COM_buff[COM_ptr];
       //dout=iabit7;
       //iab<<=1;
       //COM_buff[COM_ptr]=iab;
       if(COM_ptr>3){COM_ptr=0; busy=0; flag_COM=1;}  //>3
       }
 EX0=1;  IE1=0;
}

/*********************************************************/
void t0int(void) interrupt 1 using 1
{
//                     0  1      2  3      4    5  6      7    8  9    -    E    H    L     P
code uchar seg[48]={0x81,0xbB,0xc2,0x92,0xb8,0x94,0x84,0xb3,0x80,0x90,0xfe,0xc4,0xa8,0xcD,0xe0,0xff,

⌨️ 快捷键说明

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