?? key_new.c
字號:
#include <SST89x5x4.H>
#define uchar unsigned char
#define uint unsigned int
#define lcd_clr 0x01
#define option_num 8
uchar basic_time=0;
uchar page = 0;
uchar page_old = 0;
uchar page_new = 1;
/*
keyboard data
0 12
1 8
2 4
3 0
4 1
5 2
6 3
7 5
8 6
9 7
10-ok 9
11 10
12-wrong11
13 13
14 14
15 15
*/
#define key_0 12
#define key_1 8
#define key_2 4
#define key_3 0
#define key_4 1
#define key_5 2
#define key_6 3
#define key_7 5
#define key_8 6
#define key_9 7
#define key_o 9
#define key_d 10
#define key_c 11
#define key_l 13
#define key_u 14
#define key_r 15
//全局變量定義
sbit rs = P1^7;
sbit rw = P1^6;
sbit e = P2^1;
sbit lcd_deng = P2^3;
sbit le = P2^6;
sbit ce = P2^4;
//函數申明
void lcd_ini(void);
void lcd_wrc(uchar com);
void lcd_wrd(uchar dat);
void lcd_checkbusy();
void delay(uchar n);
void ldelay(uchar n);
void lcd_on();
void lcd_off();
uchar lcd_read_ac();
void lcd_dis_num(uint dat);
void lcd_dis_ch(uchar h,uchar l);
void lcd_add(uchar h,uchar l);
void page_0();
void page_1();
void page_2();
void page_3();
void page_4();
void page_5();
//keyboard
uchar key_data(void);
uchar check_key(void);
uchar key_data_ok(void);
uchar lcd_line = 0;
//總線控制--使能和釋放
void ad_en(void);
void lcd_en(void);
void three_en(void);
/*
struct caidan
{
uchar key_index;
uchar key_ok;
uchar key_cancel;
uchar (*function)(); //定義一個指向函數的指針變量
};
struct caidan menu[]=
{
// {0,0,1,(*page_0)},
// {0,0,1,(*function)},
{1,6,0,(*page_1)},
{2,7,0,(*page_2)},
{3,8,0,(*page_3)},
{4,9,0,(*page_4)},
{5,10,0,(*page_5)},
};
*/
void page_1()
{
uchar i = 0;
uchar dat_1[] = {"1.列車檢測"};
uchar dat_2[] = {"2.單車檢測"};
uchar dat_3[] = {"3.參數設置"};
uchar dat_4[] = {"4.歷史數據"};
uchar dat_5[] = {"5.兩相測量"};
// lcd_wrc(0x01);
// ldelay(200);
page_new = 0;
lcd_add(1,1);
for (i=0; i<10; i++)
{
lcd_wrd(dat_1[i]);
}
// lcd_wrc(0x04);
lcd_add(2,1);
for (i=0; i<10; i++)
{
lcd_wrd(dat_2[i]);
}
lcd_add(3,1);
for (i=0; i<10; i++)
{
lcd_wrd(dat_3[i]);
}
lcd_add(4,1);
for (i=0; i<10; i++)
{
lcd_wrd(dat_4[i]);
}
// lcd_wrc(0x34);
// lcd_wrc(0x05);
}
void page_0(void)
{
uchar dat_1[] = {"一二三四五六日"};
uchar i = 0;
basic_time ++;
page_new = 0;
// lcd_wrc(0x01);
//計算溫度和濕度年月日
if(basic_time==100)
{
cal_temp_humi();
lcd_read_time();
basic_time = 0;
}
else
{
lcd_read_time();
}
// cal_basic(); //
lcd_add(1,1);
lcd_dis_num_2(20);
lcd_dis_num_2((uint)b_data.year);
lcd_dis_ch(0xc4,0xea); //uchar h,uchar l);
lcd_wrd(0x20);
lcd_wrd(0x20);
lcd_add(1,5);
lcd_dis_num_2((uint)b_data.month);
lcd_dis_ch(0xd4,0xc2);
lcd_add(1,7);
lcd_dis_num_2((uint)b_data.date);
lcd_dis_ch(0xc8,0xd5);
lcd_add(2,1);
lcd_dis_ch(0xd0,0xc7);
lcd_dis_ch(0xc6,0xda);
// lcd_dis_num_1((uint)b_data.day);
i=b_data.day;
lcd_dis_ch(dat_1[2*(i-1)],dat_1[2*(i-1)+1]);
lcd_add(2,5);
lcd_dis_num_2((uint)b_data.hour);
lcd_wrd(0x3a);
// lcd_add(2,6);
lcd_dis_num_2((uint)b_data.minute);
lcd_wrd(0x3a);
// lcd_add(2,8);
lcd_dis_num_2((uint)b_data.second);
lcd_add(3,1);
lcd_dis_ch(0xca,0xaa);
lcd_dis_ch(0xb6,0xc8);
lcd_wrd(0x3a);
lcd_add(3,4);
lcd_dis_num_2((uint)b_data.humi);
// lcd_wrd(0x25);
lcd_dis_ch(0xa3,0xa5);
lcd_add(3,7);
lcd_dis_ch(0xc7,0xeb);
lcd_dis_ch(0xb0,0xb4);
lcd_add(4,1);
lcd_dis_ch(0xce,0xc2);
lcd_dis_ch(0xb6,0xc8);
lcd_wrd(0x3a);
lcd_add(4,4);
lcd_dis_num_2((uint)b_data.temp);
lcd_dis_ch(0xa1,0xe6);
lcd_add(4,7);
lcd_dis_ch(0xc8,0xa1);
lcd_dis_ch(0xcf,0xfb);
}
void ad_en(void)
{
/*
e = 0; //lcd not enable
le = 0; //three-states latched
ce = 0; //ad enable
*/
}
void lcd_en(void)
{
ce = 1; //ad not enable
le = 0; //three-states latched
e = 1; //lcd enable
}
void three_en(void)
{
ce = 1; //ad not enable
e = 0; //lcd not enable
le = 1; //tree-states open
}
void lcd_ini()
{
delay(100);
lcd_wrc(0x34);
delay(10);
lcd_wrc(0x30);
delay(10);
lcd_wrc(0x01);
delay(10);
lcd_wrc(0x06);
delay(10);
lcd_wrc(0x0c);
delay(200);
}
void lcd_wrc(uchar com)
{
lcd_en();
lcd_checkbusy();
rs = 0;
rw = 0;
P0 = com;
e = 1;
delay(10);
e = 0;
}
void lcd_wrd(uchar dat)
{
// checkbusy();
lcd_en();
lcd_checkbusy();
rs = 1;
rw = 0;
P0 = dat;
e = 1;
delay(5);
e = 0;
}
void lcd_checkbusy()
{
uchar busy = 0;
lcd_en();
P0 = 0XFF;
busy = P0;
if(busy>0x7f)
{
rs = 0;
rw = 1;
e = 1;
busy = P0;
e = 0;
delay(10);
}
}
uchar lcd_rdd();
void delay(uchar n)
{
while(n--);
}
void ldelay(uchar n)
{
uchar a=100;
while(a--)
{
while(n--);
}
}
void lcd_on()
{
lcd_deng = 0;
}
void lcd_off()
{
lcd_deng = 1;
}
uchar lcd_read_ac()
{
// uchar dat = 0;
lcd_en();
_nop_();
P0 = 0XFF;
// e = 1;
rs = 0;
_nop_();
rw = 1;
_nop_();
e = 1;
// delay(10);
// dat = P0;
// delay(10);
// e = 0;
// return(dat&0x7f);
return(P0&0x7f);
}
void lcd_dis_num(uint dat)
{
uint a=0;
dat =dat%10000;
a =dat/1000;
lcd_wrd(0x30+a);
dat =dat%1000;
a =dat/100;
lcd_wrd(0x30+a);
dat =dat%100;
a=dat/10;
lcd_wrd(0x30+a);
dat =dat%10;
lcd_wrd(0x30+dat);
}
void lcd_dis_ch(uchar h,uchar l)
{
lcd_wrd(h);
lcd_wrd(l);
}
void lcd_add(uchar h,uchar l) //定位地址
{
l--;
switch(h)
{
case 1:
{
lcd_wrc(0x80+l);
break;
}
case 2:
{
lcd_wrc(0x90+l);
break;
}
case 3:
{
lcd_wrc(0x88+l);
break;
}
case 4:
{
lcd_wrc(0x98+l);
break;
}
}
}
//高位發送,低位讀入
uchar check_key(void)
{
uchar a = 0;
P1 = 0x0f;
a = P1&0X0f;
return(a);
}
uchar key_data_ok(void)
{
uchar keydata = 0;
uchar key_data_check = 0;
key_data_check = check_key();
if(key_data_check != 0x0f)
{
keydata = key_data();
}
while(key_data_check != 0x0f)
{
key_data_check = check_key();
}
lcd_add(4,4);
lcd_dis_num(key_data_check);
return(keydata);
}
unsigned char key_data() //判斷鍵值
{
uchar a=0,b=0,c=0,d=0,i=0;
a = 0xef;
for(i = 0;i<4;i++) //讀行
{
P1 = a;
delay(10);
b = P1;
b = b&0x0f;
// b = b>>4;
if(b!=0x0F) //表示有鍵按下
{
delay(200); //軟件延時 確認有鍵按下
b = P1&0X0F;
// b = b>>4;
if(b != 0x0F)
{
// return b;
c=b;
if(c==0X07)
{
d=i*4+3;
}
else if(c==0X0B)
{
d=i*4+2;
}
else if(c==0X0D)
{
d=i*4+1;
}
else if(c==0X0E)
{
d=i*4;
}
break;
}
}
else
{
a = a<<1;
a = a+0x01;
if(a==0xFF)
{
// return 0x0f;
d = 0x0f+1;
break;
}
}
}
return d;
}
void main()
{
/*
P0 = 0XFF;
P1 = 0XFF;
P2 = 0XFF;
P3 = 0XFF;
P0 = 0X00;
P1 = 0X00;
P2 = 0X00;
P3 = 0X00;
*/
uchar i = 0;
uchar v = 0;
uchar keydata = 0;
uchar key_data_check = 0;
// uchar KeyWord[]="1.單步執行2.單步執行3.單步執行4.單步執行5.單步執行6.單步執行7.單步執行";
uchar KeyWord[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ是一種具有并行線或線串行多種接口方式";
uchar dat_1[] = {"1.列車檢測"};
uchar dat_2[] = {"2.單車檢測"};
uchar dat_3[] = {"3.參數設置"};
uchar dat_4[] = {"4.歷史數據"};
lcd_off();
lcd_on();
lcd_ini();
// lcd_wrc(0x80);
/*
for(i=0;i<60;i++)
{
lcd_wrd(0x00+i);
}
*/
// delay(100);
lcd_add(1,1);
for(i=0;i<60;i=i+2)
{
lcd_dis_ch(KeyWord[i],KeyWord[i+1]);
}
// lcd_dis_ch(0xb5,0xa1);
// lcd_dis_ch(0xb5,0xa1);
// lcd_dis_ch(0xb5,0xa1);
ldelay(200);
// i=lcd_read_ac();
// i=lcd_read_ac();
// i=lcd_read_ac();
// delay(200);
// lcd_dis_num(i);
// lcd_dis_num(12458);
/*
lcd_add(2,1);
lcd_dis_num(KeyWord[0]);
lcd_dis_num(KeyWord[1]);
*/
while(1)
{
key_data_check = check_key();
if(key_data_check != 0x0f)
{
keydata = key_data();
}
while(key_data_check != 0x0f)
{
key_data_check = check_key();
}
lcd_add(4,4);
lcd_dis_num(key_data_check);
lcd_add(4,7);
switch(keydata)
{
case 0:
{
v = 3;
lcd_dis_num(v);
break;
}
case 1:
{
v = 4;
lcd_dis_num(v);
break;
}
case 2:
{
v = 5;
lcd_dis_num(v);
break;
}
case 3:
{
v = 6;
lcd_dis_num(v);
break;
}
case 4:
{
v = 2;
lcd_dis_num(v);
break;
}
case 5:
{
v = 7;
lcd_dis_num(v);
break;
}
case 6:
{
v = 8;
lcd_dis_num(v);
break;
}
case 7:
{
v = 9;
lcd_dis_num(v);
break;
}
case 8:
{
v = 1;
lcd_dis_num(v);
break;
}
case 9:
{
v = 10;
lcd_dis_num(v);
break;
}
case 10:
{
v = 11;
lcd_dis_num(v);
break;
}
case 11:
{
v = 12;
lcd_dis_num(v);
break;
}
case 12:
{
v = 0;
lcd_dis_num(v);
break;
}
case 13:
{
v = 13;
lcd_dis_num(v);
break;
}
case 14:
{
v = 14;
lcd_dis_num(v);
break;
}
case 15:
{
v = 15;
lcd_dis_num(v);
break;
}
default:
{
v = 16;
lcd_dis_num(v);
break;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -