?? 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,
//0x01,0x3B,0x42,0x12,0x38,0x14,0x04,0x33,0x00,0x10,0x7e,0x44,0x28,0x4D,0x60,0xff,
0x01,0x3B,0x42,0x12,0x38,0x14,0x04,0x33,0x00,0x10,0x7e,0x20,0x0c,0x45,0x0a,0x44,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -