?? st_key_new_ok_up.c
字號:
#include <SST89x5x4.H>
#define uchar unsigned char
#define uint unsigned int
#define lcd_clr 0x01
/*
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
*/
//全局變量定義
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);
//keyboard
uchar key_data(void);
uchar check_key(void);
uchar key_data_ok(void);
//總線控制--使能和釋放
void ad_en(void);
void lcd_en(void);
void three_en(void);
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();
// P0 = 0X00;
e = 1;
rs = 0;
rw = 1;
// e = 1;
delay(10);
dat = P0;
// delay(10);
// e = 0;
return(dat&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 a = 0;
uchar b = 0;
b = check_key();
if(b != 0x0f)
{
a = key_data();
}
while(b != 0x0f)
{
b = check_key();
}
lcd_add(4,4);
lcd_dis_num(b);
return(a);
}
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;
lcd_off();
lcd_on();
lcd_ini();
// lcd_wrc(0x80);
/*
for(i=0;i<60;i++)
{
lcd_wrd(0x00+i);
}
*/
// delay(100);
lcd_add(1,2);
// lcd_wrc(0x98);
for(i=0;i<20;i++)
{
lcd_dis_ch(0xb5,0xa1+i);
}
// lcd_dis_ch(0xb5,0xa1);
// lcd_dis_ch(0xb5,0xa1);
// lcd_dis_ch(0xb5,0xa1);
delay(200);
// i=lcd_read_ac();
// i=lcd_read_ac();
i=lcd_read_ac();
// delay(200);
lcd_dis_num(i);
lcd_dis_num(12458);
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 + -