#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define GPIO_KEY P1
#define lcd_data P0 //数据口
sbit lcd_psb = P3^2; //串/并口选择
sbit lcd_rw = P2^5; //读写控制
sbit lcd_rs = P2^6; //寄存器选择 0为指令 1为数据
sbit lcd_EN = P2^7; //lcd使能信号(并口)
void lcd_wcmd(uchar cmd);
void delay(int ms);
void DisplayDdram(uchar *hz);
void lcd_wdata(uint dat);
uchar KeyValue; //用来存放读取到的键值
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_busy()
{
bit result;
P0=0X00; //关掉数码管的信号。阻止数码管受到P0口信号的影响
lcd_rs = 0;
lcd_rw = 1;
lcd_EN = 1;
delay(1);
result = (bit)(P0&0x80);
lcd_EN = 0;
return(result);
}
void lcd_init(void)
{
lcd_psb = 1; //并口方式
lcd_wcmd(0x34); //扩展指令
delay(5);
lcd_wcmd(0x30); //基本指令
delay(5);
lcd_wcmd(0x0c); //显示光标开关
delay(5);
lcd_wcmd(0x01); //清除lcd的显示内容
delay(5);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
lcd_rs = 0;
lcd_rw = 0;
lcd_EN = 0;
lcd_data=cmd;
delay(1);
lcd_EN = 1;
delay(1);
lcd_EN = 0;
}
void DisplayDdram(uchar *hz)
{
while(*hz!= '\0')
{
lcd_wdata(*hz);//地址里面的值
hz++;
}
}
void lcd_wdata(uint dat)
{
while(lcd_busy());
lcd_rs = 1;
lcd_rw = 0;
lcd_EN = 0;
lcd_data = dat;
delay(1);
lcd_EN = 1;
delay(1);
lcd_EN = 0;
}
void lcd_pos(uchar x,uchar y)
{
uchar pos;
if(x==0)
{
x = 0x80;
}else if(x==1)
{
x= 0x90;
}else if(x==2)
{
x = 0x88;
}else if(x==3)
{
x = 0x98;
}
pos = x + y;
lcd_wcmd(pos);
}
uchar KeyDown()
{
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(10);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0f;
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=1;break;
case(0X0d):KeyValue=2;break;
case(0X0e):KeyValue=3;break;
}
//测试行
GPIO_KEY=0Xf0;
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue;break;
case(0Xb0):KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0):KeyValue=KeyValue+12;break;
}
}
}
return KeyValue;
}
void main()
{
uchar q;
lcd_init();
while(1)
{
q=KeyDown(); //按键判断函数
lcd_pos(2,1);
switch(q)
{
case 0:DisplayDdram("1");break;
case 1:DisplayDdram("2");break;
case 2:DisplayDdram("3");break;
case 3:DisplayDdram("4");break;
case 4:DisplayDdram("5");break;
case 5:DisplayDdram("6");break;
case 6:DisplayDdram("7");break;
case 7:DisplayDdram("8");break;
case 8:DisplayDdram("9");break;
case 9:DisplayDdram("10");break;
case 10:DisplayDdram("11");break;
case 11:DisplayDdram("12");break;
}
delay(1000);
lcd_wcmd(0x01);
}
}
|