📄 hy12864_浏览器.c
字号:
/*******************************************************************************
功能:液晶HY12864T2显示。
说明:显示两行字符串,words1[],words2[]。
制作:电子科大huang_api@sina.com
*******************************************************************************/
#include <string.h>
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
///////控制引脚RS为P32. RW为P33. E为P34//////////
sbit RS = P3^2;
sbit RW = P3^3;
sbit E = P3^4;
sbit KEY= P3^5;
sbit LED= P1^5;
bit flg_over=0; //文章显示完毕标志位,1为显示完毕
bit flg_key=1;//按键发生标志位,1为按键发生
uchar page;//页码变量
uchar *p;//显示文章首地址指针
uchar code word[] =
{"单片机的C 语言应用程序设计(第4 版)本书针对目前最通用的8051单片机和最流行的程序设计语言C 语言,结合KEIL公司8051单片机开发套件;介绍单片机的C 语言应用程序设计。全书共13章,既有单片机的基础部分;51的基础部分,本书可以作为高等学院相关专业培训及全国电子设计竞赛的教材。也可以作为从事单片机应用开发的工程技术人员的参考用书!谢谢使用!"};
/****************************延时函数***************************
名称:delay()
输入:uchar m
输出:无
***************************************************************/
void delay(uchar ms)
{ // 延时子程序
uchar i;
while(ms--)
{
i=250;
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/******************************LCD状态检测函数**************************************
名称:lcd_state()
功能:lcd状态忙碌判断
参数:P2口为数据口
输入:无
输出:返回状态标志state位
************************************************************************************/
bit lcd_state(void)
{ // 测试LCD忙碌状态
bit state;
RS = 0;//command
RW = 1;//read
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
state = (bit)(P2 & 0x80);
E = 0;
return state;
}
/******************************LCD指令写入函数**************************************
名称:lcd_w_cmd()
功能:写指令到LCD数据口P2
参数:P2口为数据口
输入:待写指令
输出:无
************************************************************************************/
void lcd_w_cmd(uchar cmd)
{ // 写入指令数据到LCD
while(lcd_state());
RS = 0;//command
RW = 0;//write
P2 = cmd;
_nop_();
_nop_();
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
E = 0;
}
/******************************LCD状态检测函数**************************************
名称:lcd_adder()
功能:lcd显示地址设置
参数:P2口为数据口
输入:一字节待设置的显示地址长度0~15
输出:无
************************************************************************************/
void lcd_adder(uchar adder)
{ //设定显示位置
lcd_w_cmd(adder);
}
/******************************LCD数据写入函数**************************************
名称:lcd_w_date()
功能:写数据到LCD数据口P2
参数:P2口为数据口
输入:一字节待写显示数据
输出:无
************************************************************************************/
void lcd_w_date(uchar dat)
{ //写入字符显示数据到LCD
while(lcd_state());
RS = 1;//date
RW = 0;//write
P2 = dat;
_nop_();
_nop_();
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
E = 0;
}
/******************************LCD初始化函数**************************************
名称:lcd_init()
功能:初始化LCD模块
参数:初始化指令
输入:无
输出:无
************************************************************************************/
void lcd_init(void)
{
EA=0;
page=48; //页码起始值设定
p=word; //全局指针变量P为待显示字符串地址
lcd_w_cmd(0x38); //LCD初始化设定
delay(5);
lcd_w_cmd(0x0c); //
delay(5);
lcd_w_cmd(0x06); //
delay(5);
lcd_w_cmd(0x01); //清除LCD的显示内容
delay(5);
}
/******************************LCD显示函数**************************************
名称:lcd_display()
功能:显示words1[],words2[]字符串!
参数:P2口为数据口,*word1,*word2为待显示字符串指针,adder1,adder2为两行显示起始地址
说明:word为待显示字符串首地址;dder为显示起始地址;str为起始显示字符的顺序位置;len_s为显示长度
输入:待显示的数据的指针,显示地址
输出:无
*******************************************************************************/
lcd_display(uchar *word,uchar adder,uint str,uchar len_s)
{
lcd_adder(adder); //0~7
while(str<len_s)
{
if(word[str]=='\0'){flg_over=1;return 0;}
else // 显示字符
{ lcd_w_date(word[str]);
str++;
}
}
}
/******************************显示字符长度测量函数*****************************
名称:words_len()
功能:测试显示字符串长度!
参数:待测字符串地址为输入参数
输入:待测试字符串的指针
输出:字符串长度
*******************************************************************************/
uchar words_len(uchar *s)
{
return(strlen(s));
}
/******************************显示一个单一字符函数*****************************
名称:word_display()
功能:显示单一一个字符
参数:待测显示字符地址为输入参数
输入:待显示字符的地址
输出:无
*******************************************************************************/
word_display(uchar *c,uchar adder_c)
{
lcd_adder(adder_c);
_nop_();
_nop_();
lcd_w_date(*c);
}
/*******************************键盘识别函数************************************
名称:key()
功能:识别键盘动作
参数:识别键盘动作返回布尔类型值
输入:无
输出:BIT类型值
*******************************************************************************/
bit key(void)
{
if(KEY==0)
{
delay(1);
if(KEY==1) return 0;
while(!KEY) _nop_();
LED=!LED;
return 1;
}
else return 0;
}
/******************************显示控制函数**************************************
名称:display_ctr()
功能:控制显示输出
参数:P2口为数据口,*word1,*word2为待显示字符串指针,adder1,adder2为两行显示起始地址
说明:word为待显示字符串首地址;dder为显示起始地址;str为起始显示字符的顺序位置;len_s为显示长度
输入:待显示的数据的指针,显示地址
输出:无
*******************************************************************************/
void display_ctr(void)
{
loop:
if(flg_key)
{
lcd_w_cmd(0x01);//清除显示DDRAM数据
if(flg_over==1){p=word;flg_over=0;page=48;}//显示完毕从新开始显示文章
if((page-48) < 9)page++;
else page=48;// 个位循环显示页码
word_display(&page,0x80); //显示页码
lcd_display(p,0x81,0,16); //1行
p+=16;
if(flg_over==1){flg_key=0;goto loop;}
lcd_display(p,0x90,0,16); //2行
p+=16;
if(flg_over==1){flg_key=0;goto loop;}
lcd_display(p,0x88,0,16); //3行
p+=16;
if(flg_over==1){flg_key=0;goto loop;}
lcd_display(p,0x98,0,16); //4行
p+=16;
if(flg_over==1){flg_key=0;goto loop;}
}
}
/*------------------------------------------------------------------------
------------------------------------MAIN函数------------------------------
--------------------------------------------------------------------------*/
main()
{
lcd_init(); // 初始化LCD变量和显示指令
delay(50);
while(1)
{
display_ctr();//显示控制
flg_key=key();//键盘扫描
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -