📄 a.c
字号:
/*-------------说明--------------------------*/
//P0液晶数据
//P1矩阵键盘
//P2液晶功能端
/*-----------------------------------------------*/
#include <stdio.h>
#include <reg51.h>
#include<absacc.h>
#include<intrins.h>
unsigned char k=' ';
sbit rs = P1^0; //1=数据; 0=指令;
sbit rw = P1^1; //1=读; 0=写;
sbit e = P1^2; //1=使能;
#define PA XBYTE[0x1FFC]
#define PB XBYTE[0x1FFD]
#define PC XBYTE[0x1800]
#define COM XBYTE[0x1C00]
#define LCD XBYTE[0x2FFF]
#define unchar unsigned char
#define unint unsigned int
/*-------------键盘去抖动延时--------------------------*/
void delay1(void)
{
unsigned char i;
for(i=0;i<200;i++)
{}
}
/*-------------键盘扫描--------------------------*/
unsigned char keyscan(void)
{
unsigned char code_h;
unsigned char code_l;
COM=0x88;
PC=0xF0;
if((PC&0xF0)!=0xf0)
{
delay1();
if((PC&0xF0)!=0xf0)
{
code_h=0xfe;
while((code_h&0x10)!=0)
{
PC=code_h;
if((PC&0xF0)!=0xf0)
{
code_l=(PC&0xf0)|0x0f;
return((~code_h)+(~code_l));
}
else
code_h=(code_h<<1)|0x01;
}
}
}
return(0);
}
/*-------------键盘数字识别--------------------------*/
unsigned char identify(void)
{
unsigned char a;
a=keyscan();
switch(a)
{
case 0x11:k='1';break;
case 0x21:k='5';break;
case 0x41:k='9';break;
case 0x81:k='C';break;
case 0x12:k='2';break;
case 0x22:k='6';break;
case 0x42:k='0';break;
case 0x82:k='D';break;
case 0x14:k='3';break;
case 0x24:k='7';break;
case 0x44:k='A';break;
case 0x84:k='E';break;
case 0x18:k='4';break;
case 0x28:k='8';break;
case 0x48:k='B';break;
case 0x88:k='F';break;
default:break;
}
return(k);
}
/*-------------测忙延时--------------------------*/
void delay(unsigned char i) //225不稳定,确保安全230-250 约0.5ms
{
while(--i);
}
/*---------------写数据------------------------*/
lcd_write_data(unsigned char c)
{
delay(250);
rs=1;
rw=0;
LCD=c;
e=1;
_nop_();
_nop_();
e=0;
}
/*---------------写指令------------------------*/
lcd_write_comm(unsigned char c)
{
delay(250);
rs=0;
rw=0;
LCD=c;
e=1;
_nop_();
_nop_();
e=0;
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
lcd_write_comm (0x30); //基本指令集
lcd_write_comm (0x01); //清屏,地址指针指向00H
lcd_write_comm (0x06); //光标的移动方向
lcd_write_comm (0x0c); //开显示,关游标
}
/************************************************************************************************
lcd_write_sentence函数:
指定起始行,起始列,连续写入字符串;注意:字符串长度必须小于8;行:1-4;列:0-7
*************************************************************************************************/
void lcd_write_sentence(unchar row,unchar col,unchar *string,unchar lenth)
{
unchar i=0;
lcd_write_comm (0x30);
switch(row)
{
case 1:
lcd_write_comm(0x80+col); //第一行
break;
case 2:
lcd_write_comm(0x90+col); //第二行
break;
case 3:
lcd_write_comm(0x88+col); //第三行
break;
case 4:
lcd_write_comm(0x98+col); //第四行
break;
default:
lcd_write_comm(0x80); //缺省为第一行
break;
}
while(lenth-->0)
{
lcd_write_data(string[i]); //写入字符串
i++;
}
}
/*------------------主程序--------------------*/
void main ()
{
unsigned char buf1[20],i;
init_lcd ();
while (1)
{
for(i=0;i<3;i++)
{
buf1[i]=identify();
}
lcd_write_sentence(1,0,"键值:",6);
lcd_write_sentence(2,0,buf1,3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -