📄 lcdshow.c
字号:
/*文件描述:本文件包含了用HD44780显示相关的3个子程序 *
* 1. LCDShow:在LCD上显示32个字符 *
* 2. LcdInit:初始化Lcd *
* 3. Lcd_Command:执行给定的cmd命令 *
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h" //包含头文件
#define LcdData PTB //Lcd显示数据传送口
#define LcdData_D DDRB //数据口方向寄存器
#define LcdCtrl PTC //Lcd控制信号传送口
#define LcdCtrl_D DDRC //控制口方向寄存器
#define LcdRS 0 //Lcd寄存器选择信号PTC0
#define LcdRW 1 //读写信号接PTC1
#define LcdE 2 //Lcd使能信号接PTC2
//内部调用子程序
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void); //Lcd初始化子程序
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n);
unsigned char ChangeASCII(unsigned char x);
//外部变量
extern unsigned char time[14];
extern unsigned char alarm[14];
void Lcdshowtime(void) //显示日期时间子程序
{ unsigned char i;
LcdInit();
for(i=0;i<4;i++)
{
LcdshowCharacter(ChangeASCII(time[i]),1,(i+4));
}
LcdshowCharacter('-',1,8);
LcdshowCharacter(ChangeASCII(time[4]),1,9);
LcdshowCharacter(ChangeASCII(time[5]),1,10);
LcdshowCharacter('-',1,11);
LcdshowCharacter(ChangeASCII(time[6]),1,12);
LcdshowCharacter(ChangeASCII(time[7]),1,13);
LcdshowCharacter(ChangeASCII(time[8]),2,5);
LcdshowCharacter(ChangeASCII(time[9]),2,6);
LcdshowCharacter(':',2,7);
LcdshowCharacter(ChangeASCII(time[10]),2,8);
LcdshowCharacter(ChangeASCII(time[11]),2,9);
LcdshowCharacter(':',2,10);
LcdshowCharacter(ChangeASCII(time[12]),2,11);
LcdshowCharacter(ChangeASCII(time[13]),2,12);
}
void Lcdshowalarm(void) //显示日期时间子程序
{ unsigned char i;
LcdInit();
for(i=0;i<4;i++)
{
LcdshowCharacter(ChangeASCII(alarm[i]),1,(i+4));
}
LcdshowCharacter('-',1,8);
LcdshowCharacter(ChangeASCII(alarm[4]),1,9);
LcdshowCharacter(ChangeASCII(alarm[5]),1,10);
LcdshowCharacter('-',1,11);
LcdshowCharacter(ChangeASCII(alarm[6]),1,12);
LcdshowCharacter(ChangeASCII(alarm[7]),1,13);
LcdshowCharacter(ChangeASCII(alarm[8]),2,5);
LcdshowCharacter(ChangeASCII(alarm[9]),2,6);
LcdshowCharacter(':',2,7);
LcdshowCharacter(ChangeASCII(alarm[10]),2,8);
LcdshowCharacter(ChangeASCII(alarm[11]),2,9);
LcdshowCharacter(':',2,10);
LcdshowCharacter(ChangeASCII(alarm[12]),2,11);
LcdshowCharacter(ChangeASCII(alarm[13]),2,12);
}
/*LcdShow:在HD44780显示屏上显示一个字符--------------------*
*功能描述:在HD44780显示屏上第m行,第n列显示字符str *
*参 数:str:待显示字符 *
*返 回:无 *
*------------------以上为子程序说明-------------------*/
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n)
{
//LcdInit();
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000|((m-1)*0x40+(n-1)));
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(str);
}
unsigned char ChangeASCII(unsigned char x) //转换数值x为对应的ASCII码
{
unsigned char y;
return y=x+0x30;
}
/*LcdInit:初始化Lcd------------------------------------*
*功 能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1 *
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void LcdInit(void)
{
unsigned char i;
LcdData_D=0b11111111; //数据口为输出
LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
LcdCtrl_D|=(1<<LcdRS);
LcdCtrl_D|=(1<<LcdRW);
LcdCtrl|=(1<<LcdE); //E=1
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
Lcd_Command(0b00000001); //清屏
for(i=0;i<250;i++); //延时>1.6ms
for(i=0;i<250;i++);
//Lcd_Command(0b00010100); //光标右移一个字符位,AC自
// 动加1
Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
}
/*Lcd_Command:执行给定的cmd命令------------------------*
*功 能:执行给定的cmd命令,且延时 *
*参 数:cmd:待执行的命令 *
*返 回:无 *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
{
unsigned char i;
for (i=0;i<20;i++); //等待>40us
LcdData=cmd; //把指令码送到Lcd数据传送口
LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
asm("NOP");
asm("NOP");
asm("NOP");
LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
for (i=0;i<20;i++); //等待>40us
}
void MoveCursor(unsigned char m,unsigned char n) //移到光标到第m行,第n列
{
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00001111);
Lcd_Command(0b10000000|((m-1)*0x40+(n-1)));
//Lcd_Command(0b00001111);
}
void LcdShowCursor(void) //开光标显示,闪烁
{
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00001111);
}
void LcdShowMenu(void) //显示菜单
{
unsigned char temp[12]="1. Set Time";
unsigned char temp2[13]="2. Set Alarm";
unsigned char i;
LcdInit();
for(i=0;i<11;i++)
{
LcdshowCharacter(temp[i],1,(i+1));
}
for(i=0;i<12;i++)
{
LcdshowCharacter(temp2[i],2,(i+1));
}
}
//将输入的键值传送到相应位置的位
void Transmission(unsigned char Keyvalue,unsigned char temp[],unsigned char m,unsigned char n)
{
if(m==1) //在第一行
{
switch(n)
{
case 4:temp[0]=Keyvalue;
if((temp[0]<1)||(temp[0]>3))
temp[0]=2; break;
case 5:temp[1]=Keyvalue; break; //if(temp[1]>2) temp[8]=0 ; break;
case 6:temp[2]=Keyvalue; break;//if(temp[8]>2) temp[8]=0 ; break;
case 7:temp[3]=Keyvalue; break;//if(temp[8]>2) temp[8]=0 ; break;
case 9:temp[4]=Keyvalue;
if(temp[4]>1)
temp[4]=0 ; break;
case 10:temp[5]=Keyvalue;
if((temp[4]==1)&&(temp[5]>2))
{temp[4]=0; temp[5]=0;}
else temp[9]=Keyvalue; break;
case 12:temp[6]=Keyvalue; if(temp[6]>3) temp[6]=0 ; break;
case 13:temp[7]=Keyvalue;
if((temp[6]==3)&&(temp[7]>1))
{temp[6]=0 ; temp[7]=0 ; }
else temp[7]=Keyvalue; break;
}
}
if(m==2) //在第二行
{
switch(n)
{
case 5:temp[8]=Keyvalue;
if(temp[8]>2)
temp[8]=0 ; break;
case 6:temp[9]=Keyvalue;
if((temp[8]==2)&&(temp[9]>3))
{temp[8]=0;temp[9]=0 ; }
else temp[9]=Keyvalue; break;
case 8:temp[10]=Keyvalue;
if(temp[10]>5) temp[10]=0 ; break;
case 9:temp[11]=Keyvalue; break;
case 11:temp[12]=Keyvalue;
if(temp[12]>5) temp[12]=0 ; break;
case 12:temp[13]=Keyvalue; break;
}
}
}
//判断按下的键是否数字键
unsigned char Discriminant(unsigned char m)
{
if(m=='1'||m=='2'||m=='3'||m=='4'||m=='5'||m=='6'||m=='7'||m=='8'||m=='9'||m=='0')
return 1;
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -