📄 display1.c
字号:
/*
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 + -