📄 jianpan+1602.c
字号:
//MCU:AT89S51
//晶振:11.0592M
#include "AT89X51.h"
#include "intrins.h"
#define LCDPORT P1 //LCD数据线
#define uchar unsigned char
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^4;
//*************LCD1602驱动程序***************************///
void lcd_delay(unsigned char delaytime)
{
while(delaytime)delaytime--;
}
/********1ms延时子程序***********/
void delay_nms(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++)
; //空操作
}
void write_lcd_command(unsigned char write_command)
{
lcd_delay(40);
RS=0;
RW=0;
LCDPORT=write_command;
EN=1;
EN=0;
}
void write_lcd_data(unsigned char write_data) //写数据
{
lcd_delay(40);
RS=1;
RW=0;
LCDPORT=write_data;
EN=1;
EN=0;
}
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) //x表示行,y表示该行的位置(也就是列)
{
//LCD_set_xy( x, y );
switch(x)
{
case 0:
write_lcd_command(0x80+y); //第一行
break;
case 1:
write_lcd_command(0xc0+y); //第二行
break;
}
// LCD_en_dat(dat);
write_lcd_data(dat|0x30); //dat或上0x30,就时把数字0123456789转换成ASIIC码,写入LCD
}
void lcd_displaystr(unsigned char x,unsigned char y,unsigned char code *str)
{ //x表示行,y表示该行的位置(也就是列)
switch(x)
{
case 0:
write_lcd_command(0x80+y);
break;
case 1:
write_lcd_command(0xc0+y);
break;
}
while (*str)
{
write_lcd_data(*str);
str++;
}
}
//***********************初始化LCD1602*************************//
void initial_lcd1602(void)
{
unsigned char i;
EN=0;
for(i=200;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38);//设置lcd1602为16X2显示,每个字符5×7显示,8个数据接口
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38);
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x0f); //开显示,光标显示并闪烁
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x06);//光标移动设置,每写一个数,文字不动,光标自动右移
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x01); //清屏
for(i=4;i>0;i--)
lcd_delay(248);
}
//********************lcd1602驱动程序到此完********************//
//********************键盘扫描程序********************//
uchar keyscan(void)
{
uchar code_h,code_l,num;
P0 = 0xf0; // 发全0行扫描码
if ((P0&0xf0)!=0xf0) // 若有键按下
{
delay_nms(20); // 延时去抖动
if ((P0&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
code_h = 0xfe;
while((code_h&0x10)!=0xf0) // 逐行扫描
{
P0 = code_h; // 输出行扫描码
if ((P0&0xf0)!=0xf0) // 本行有键按下
{
code_l = (P0&0xf0|0x0f);
/* 保留P0口高4位,低4位变为1,作为列值 */
num=(~code_h)+(~code_l);
return num;
}
else code_h = (code_h<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
void main(void)
{
unsigned char key,t[16],q,p;
initial_lcd1602();
//输出显示
lcd_displaystr(0,0x00," Hello Everybody ");
lcd_displaystr(1,0x00,"Made by Zhenkun ");
while(1)
{
//按键扫描
key=keyscan();
delay_nms(10);
switch(key)
{
case 0x00:
break;
case 0x11:
lcd_displaystr(0,0x00," Key Number:01 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0){
t[0]++;}
if(t[0]>9)
t[0]=0;
LCD_write_char(1,0x0d,t[0]);delay_nms(400);
for(q=1;q<16;q++)
t[q]=0;
break;
case 0x21:
lcd_displaystr(0,0x00," Key Number:02 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[1]++;delay_nms(500);
if(t[1]>9)
t[1]=0;
LCD_write_char(1,0x0d,t[1]);delay_nms(400);
t[0]=0;
for(q=2;q<16;q++)
t[q]=0;
break;
case 0x41:
lcd_displaystr(0,0x00," Key Number:03 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[2]++;delay_nms(500);
if(t[2]>9)
t[2]=0;
LCD_write_char(1,0x0d,t[2]);delay_nms(400);
t[0]=0;t[1]=0;
for(q=3;q<16;q++)
t[q]=0;
break;
case 0x81:
lcd_displaystr(0,0x00," Key Number:04 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[3]++;delay_nms(500);
if(t[3]>9)
t[3]=0;
LCD_write_char(1,0x0d,t[3]);delay_nms(400);
t[0]=0;t[1]=0;t[2]=0;
for(q=4;q<16;q++)
t[q]=0;
break;
case 0x12:
lcd_displaystr(0,0x00," Key Number:05 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[4]++;delay_nms(500);
if(t[4]>9)
t[4]=0;
LCD_write_char(1,0x0d,t[4]);delay_nms(400);
t[0]=0;t[1]=0;t[2]=0;t[3]=0;
for(q=5;q<16;q++)
t[q]=0;
break;
case 0x22:
lcd_displaystr(0,0x00," Key Number:06 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[5]++;delay_nms(500);
if(t[5]>9)
t[5]=0;
LCD_write_char(1,0x0d,t[5]);delay_nms(400);
t[0]=0;t[1]=0;t[2]=0;t[3]=0;t[4]=0;
for(q=6;q<16;q++)
t[q]=0;
break;
case 0x42:
lcd_displaystr(0,0x00," Key Number:07 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[6]++;delay_nms(500);
if(t[6]>9)
t[6]=0;
LCD_write_char(1,0x0d,t[6]);delay_nms(400);
t[0]=0;t[1]=0;t[2]=0;t[3]=0;t[4]=0;t[5]=0;
for(q=7;q<16;q++)
t[q]=0;
break;
case 0x82:
lcd_displaystr(0,0x00," Key Number:08 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[7]++;delay_nms(500);
if(t[17]>9)
t[17]=0;
LCD_write_char(1,0x0d,t[7]);delay_nms(400);
for(p=0;p<7;p++)
t[p]=0;
for(q=8;q<16;q++)
t[q]=0;
break;
case 0x14:
lcd_displaystr(0,0x00," Key Number:09 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[8]++;delay_nms(500);
if(t[8]>9)
t[8]=0;
LCD_write_char(1,0x0d,t[8]);delay_nms(400);
for(p=0;p<8;p++)
t[p]=0;
for(q=9;q<16;q++)
t[q]=0;
break;
case 0x24:
lcd_displaystr(0,0x00," Key Number:10 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[9]++;delay_nms(500);
if(t[9]>9)
t[9]=0;
LCD_write_char(1,0x0d,t[9]);delay_nms(400);
for(p=0;p<9;p++)
t[p]=0;
for(q=10;q<16;q++)
t[q]=0;
break;
case 0x44:
lcd_displaystr(0,0x00," Key Number:11 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[10]++;delay_nms(500);
if(t[10]>9)
t[10]=0;
LCD_write_char(1,0x0d,t[10]);delay_nms(400);
for(p=0;p<10;p++)
t[p]=0;
for(q=11;q<16;q++)
t[q]=0;
break;
case 0x84:
lcd_displaystr(0,0x00," Key Number:12 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[11]++;delay_nms(500);
if(t[11]>9)
t[11]=0;
LCD_write_char(1,0x0d,t[11]);delay_nms(400);
for(p=0;p<11;p++)
t[p]=0;
for(q=12;q<16;q++)
t[q]=0;
break;
case 0x18:
lcd_displaystr(0,0x00," Key Number:13 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[12]++;delay_nms(500);
if(t[12]>9)
t[12]=0;
LCD_write_char(1,0x0d,t[12]);delay_nms(400);
for(p=0;p<12;p++)
t[p]=0;
for(q=13;q<16;q++)
t[q]=0;
break;
case 0x28:
lcd_displaystr(0,0x00," Key Number:14 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[13]++;delay_nms(500);
if(t[13]>9)
t[13]=0;
LCD_write_char(1,0x0d,t[13]);delay_nms(400);
for(p=0;p<13;p++)
t[p]=0;
for(q=14;q<16;q++)
t[q]=0;
break;
case 0x48:
lcd_displaystr(0,0x00," Key Number:15 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[14]++;delay_nms(500);
if(t[14]>9)
t[14]=0;
LCD_write_char(1,0x0d,t[14]);delay_nms(400);
for(p=0;p<14;p++)
t[p]=0;
t[15]=0;
break;
case 0x88:
lcd_displaystr(0,0x00," Key Number:16 ");
lcd_displaystr(1,0x00," Push Times: ");
if(key!=0)
t[15]++; delay_nms(500);
if(t[15]>9)
t[15]=0;
LCD_write_char(1,0x0d,t[15]);delay_nms(400);
for(p=0;p<15;p++)
t[p]=0;
break;
default:
lcd_displaystr(0,0x00," Sorry!You push ");
lcd_displaystr(1,0x00,"keys more than 2");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -