|
//实例81:用LCD显示字符'A'
#include<reg51.h> //包含单片机寄存器的头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//#define LED_PORT P1
//unsigned char led_pattern = 0xFE;
//bit led_mode = 0; // 0-流水灯模式 1-全亮模式
#define GPIO_KEY P1
unsigned char KeyValue; //用来存放读取到的键值
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E= P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
bit buzzer_flag = 0; //设立中断标志位为FLAG=0;
sbit BUZZER=P2^6;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^4;
void key();
//unsigned char i;
//void Delay500ms();
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<120; j++);
}
//void timer0_init() {
// TMOD = 0x01; // 定时器0模式1
// TH0 = 0xFC; // 1ms定时初值
// TL0 = 0x66;
// ET0 = 1; // 允许定时器0中断
// TR0 = 1; // 启动定时器0
//}
//
//void int0_init() {
// IT0 = 1; // 边沿触发
// EX0 = 1; // 允许外部中断0
// EA = 1; // 开总中断
//}
//
//void int1_init() {
// IT1 = 1; // 边沿触发
// EX1 = 1; // 允许外部中断1
// EA = 1; // 开总中断
//}
/*****************************************************
函数功能:延时1us
***************************************************/
void delay_us(uint i)
{
while(--i);
}
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
//void delay1ms()
//{
// unsigned char i,j;
// for(i=0;i<10;i++)
// for(j=0;j<33;j++)
// ;
// }
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
delay_us(4); //延时4微秒,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void Write_order_add (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
delay_us(2); //延时4微秒,给硬件反应时间 // 就是让E从0到1发生正跳变,所以应先置"0"
P0=dictate; //将数据送入P0口,即写入指令或地址
delay_us(4); //延时4微秒,给硬件反应时间
E=1; //E置高电平
delay_us(4); //延时4微秒,给硬件反应时间//空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
delay_us(4); //延时4微秒,给硬件反应时间
E=1; //E置高电平
delay_us(4); //延时4微秒,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInit(void)
{
delay_ms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
Write_order_add(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay_ms(5); //延时5ms
Write_order_add(0x38);
delay_ms(5);
Write_order_add(0x38);
delay_ms(5);
Write_order_add(0x0E); //(0x0c、0x0d、0x0e、0x0f显示模式设置:显示开,有光标,光标闪烁
delay_ms(5);
Write_order_add(0x06); //(0x04、0x06、0x07显示模式设置:光标右移,字符不移
delay_ms(5);
Write_order_add(0x01); //清屏幕指令,将以前的显示内容清除
delay_ms(5);
}
void main(void) //主函数
{
unsigned int i;
// timer0_init();
// int0_init();
// int1_init();
LcdInit();
// LED_PORT = 0xFF; //调用LCD初始化函数
while(1) {
if(buzzer_flag){
BUZZER = ~BUZZER;
delay_ms(1);
i++;
if(i >= 200) {
i = 0;
buzzer_flag = 0;
}
}
key();
}
}
//void timer0_isr() interrupt 1 {
// TH0 = 0xFC;
// TL0 = 0x66;
//
//
// // 定时器中断服务程序
//}
//void int1_isr() interrupt 2 {
//// LED_PORT = 0x1F; // 所有LED亮 F8
//// delay_ms(2000); // 保持亮1秒
//// LED_PORT = 0xFF; // LED熄灭
//// Write_order_add(0xC7);
//// WriteData('L'); //将字符常量'A'写入液晶模块
//// WriteData('O');
//// WriteData('S');
//// WriteData('E');
//// WriteData(' ');
//// WriteData(' ');
//}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay_ms(20);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=1;break;
case(0X0b): KeyValue=2;break;
case(0X0d): KeyValue=3;break;
case(0X0e): KeyValue=4;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;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay_ms(20);
a++;
}
}
}
}
void LCD_Dis(unsigned char p1, unsigned char p2)
{
buzzer_flag = 1;
Write_order_add(0xC7);
WriteData(p1); //将字符常量'A'写入液晶模块
WriteData(p2); //将字符常量'A'写入液晶模块
}
void key()
{
KeyDown();
switch(KeyValue){
case 1: LCD_Dis('1', ' '); break;
case 2: LCD_Dis('2', ' '); break;
case 3: LCD_Dis('3', ' '); break;
case 4: LCD_Dis('4', ' '); break;
case 5: LCD_Dis('5', ' '); break;
case 6: LCD_Dis('6', ' '); break;
case 7: LCD_Dis('7', ' '); break;
case 8: LCD_Dis('8', ' '); break;
case 9: LCD_Dis('9', ' '); break;
case 10: LCD_Dis('1', '0'); break;
case 11: LCD_Dis('1', '1'); break;
case 12: LCD_Dis('1', '2'); break;
case 13: LCD_Dis('1', '3'); break;
case 14: LCD_Dis('1', '4'); break;
case 15: LCD_Dis('1', '5'); break;
case 16: LCD_Dis('1', '6'); break;
}
KeyValue = 0;
if(!KEY1)
{
delay_ms(20);
while(!KEY1);
buzzer_flag = 1;
Write_order_add(0xC7);
WriteData('1'); //将字符常量'A'写入液晶模块
WriteData('7'); //将字符常量'A'写入液晶模块
}
if(!KEY2)
{
delay_ms(20);
while(!KEY2);
buzzer_flag = 1;
Write_order_add(0xC7);
WriteData('1'); //将字符常量'A'写入液晶模块
WriteData('8'); //将字符常量'A'写入液晶模块
}
if(!KEY3)
{
delay_ms(20);
while(!KEY3);
buzzer_flag = 1;
Write_order_add(0xC7);
WriteData('1'); //将字符常量'A'写入液晶模块
WriteData('9'); //将字符常量'A'写入液晶模块
}
if(!KEY4)
{
delay_ms(20);
while(!KEY4);
buzzer_flag = 1;
Write_order_add(0xC7);
WriteData('2'); //将字符常量'A'写入液晶模块
WriteData('0'); //将字符常量'A'写入液晶模块
}
if(!KEY5)
{
delay_ms(20);
while(!KEY5);
buzzer_flag = 0;
Write_order_add(0xC7); //将显示地址指定为第1行第8列
WriteData(' '); //将字符常量'A'写入液晶模块
WriteData(' ');
}
// if(!KEY11)
// {
// delay_ms(20);
// while(!KEY11);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('9'); //将字符常量'A'写入液晶模块
// WriteData(' '); //将字符常量'A'写入液晶模块
// }
// if(!KEY12)
// {
// delay_ms(20);
// while(!KEY12);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('0'); //将字符常量'A'写入液晶模块
// }
// if(!KEY13)
// {
// delay_ms(20);
// while(!KEY13);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('1'); //将字符常量'A'写入液晶模块
// }
// if(!KEY14)
// {
// delay_ms(20);
// while(!KEY14);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('2'); //将字符常量'A'写入液晶模块
// }
// if(!KEY15)
// {
// delay_ms(20);
// while(!KEY15);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('3'); //将字符常量'A'写入液晶模块
// }
// if(!KEY16)
// {
// delay_ms(20);
// while(!KEY16);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('4'); //将字符常量'A'写入液晶模块
// }
// if(!KEY17)
// {
// delay_ms(20);
// while(!KEY17);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('5'); //将字符常量'A'写入液晶模块
// }
// if(!KEY18)
// {
// delay_ms(20);
// while(!KEY18);
// buzzer_flag = 1;
// Write_order_add(0xC7); //将显示地址指定为第1行第8列
// WriteData('1'); //将字符常量'A'写入液晶模块
// WriteData('6'); //将字符常量'A'写入液晶模块
// }
}
//void int0_isr() interrupt 0 {
//// buzzer_flag = ~buzzer_flag;// 切换蜂鸣器状态
//// LED_PORT = 0x7F; // 所有LED亮 FB
//// delay_ms(2000); // 保持亮1秒
//// LED_PORT = 0xFF; // LED熄灭
//// Write_order_add(0xC7); //将显示地址指定为第1行第8列
//// WriteData('S'); //将字符常量'A'写入液晶模块
//// WriteData('U');
//// WriteData('C');
//// WriteData('C');
//// WriteData('E');
//// WriteData('S');
//
// //字符的字形点阵读出和显示由液晶模块自动完成
//}
//
//void Delay500ms() //@12.000MHz
//{
// unsigned char i, j, k;
// i = 4;
// j = 205;
// k = 187;
// do
// {
// do
// {
// while (--k);
// } while (--j);
// } while(--i);
//}
|
|