📄 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初始化子程序
//在HD44780显示屏上显示一个字符子函数
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n);
unsigned char ChangeASCII(unsigned char x); //转换数值x为对应的ASCII码子函数
//外部变量
extern unsigned char time[14];
extern unsigned char alarm[14];
extern unsigned char Ttime[3];
extern int Tdate[3];
extern unsigned char Ttime2[3];
extern int Tdate2[3];
/*LcdshowCharacter:在HD44780显示屏上显示一个字符--------------------*
*功能描述:在HD44780显示屏上第m行,第n列显示字符str *
*参 数:str:待显示字符 *
*返 回:无 *
*------------------以上为子程序说明-------------------*/
void LcdshowCharacter(unsigned char str,unsigned char m,unsigned char n)
{
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;
}
//显示大小为n字符数组在第m行的子函数
void LcdShowString(unsigned char str[],unsigned char n,unsigned char m)
{
unsigned char i;
LcdInit();
for(i=0;i<n;i++)
{
LcdshowCharacter(str[i],m,(i+1));
}
}
void Lcdshow(unsigned char temp[]) //显示日期时间子程序
{ unsigned char i;
LcdInit();
for(i=0;i<4;i++)
{
LcdshowCharacter(ChangeASCII(temp[i]),1,(i+4));
}
LcdshowCharacter('-',1,8);
LcdshowCharacter(ChangeASCII(temp[4]),1,9);
LcdshowCharacter(ChangeASCII(temp[5]),1,10);
LcdshowCharacter('-',1,11);
LcdshowCharacter(ChangeASCII(temp[6]),1,12);
LcdshowCharacter(ChangeASCII(temp[7]),1,13);
LcdshowCharacter(ChangeASCII(temp[8]),2,5);
LcdshowCharacter(ChangeASCII(temp[9]),2,6);
LcdshowCharacter(':',2,7);
LcdshowCharacter(ChangeASCII(temp[10]),2,8);
LcdshowCharacter(ChangeASCII(temp[11]),2,9);
LcdshowCharacter(':',2,10);
LcdshowCharacter(ChangeASCII(temp[12]),2,11);
LcdshowCharacter(ChangeASCII(temp[13]),2,12);
}
/*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(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 LcdShowCursor(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)));
}
/*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;break;
case 5:temp[1]=Keyvalue;break;
case 6:temp[2]=Keyvalue;break;
case 7:temp[3]=Keyvalue;break;
case 9:temp[4]=Keyvalue;break;
case 10:temp[5]=Keyvalue;break;
case 12:temp[6]=Keyvalue;break;
case 13:temp[7]=Keyvalue;break;
}
}
if(m==2) //在第二行
{
switch(n)
{
case 5:temp[8]=Keyvalue;break;
case 6:temp[9]=Keyvalue;break;
case 8:temp[10]=Keyvalue;break;
case 9:temp[11]=Keyvalue;break;
case 11:temp[12]=Keyvalue;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;
}
void Delay(void)
{ unsigned char u;
unsigned char v;
for(u=0;u<=250;u++)
for(v=0;v<=250;v++);
}
void Changetime(int temp1[],unsigned char temp2[]) //将数组temp1拆分存储到数组temp2
{
time[0]=temp1[0]/1000;
time[1]=temp1[0]/100%10;
time[2]=temp1[0]/10%10;
time[3]=temp1[0]%10;
time[4]=temp1[1]/10;
time[5]=temp1[1]%10;
time[6]=temp1[2]/10;
time[7]=temp1[2]%10;
time[8]=temp2[0]/10;
time[9]=temp2[0]%10;
time[10]=temp2[1]/10;
time[11]=temp2[1]%10;
time[12]=temp2[2]/10;
time[13]=temp2[2]%10;
}
void Change(void) //将数组time组合存储到数组Tdate
{
Tdate[0]=time[0]*1000+time[1]*100+time[2]*10+time[3];
Tdate[1]=time[4]*10+time[5];
Tdate[2]=time[6]*10+time[7];
Ttime[0]=time[8]*10+time[9];
Ttime[1]=time[10]*10+time[11];
Ttime[2]=time[12]*10+time[13];
}
void Change2(void) //将数组alarm组合存储到数组Tdate2
{
Tdate2[0]=alarm[0]*1000+alarm[1]*100+alarm[2]*10+alarm[3];
Tdate2[1]=alarm[4]*10+alarm[5];
Tdate2[2]=alarm[6]*10+alarm[7];
Ttime2[0]=alarm[8]*10+alarm[9];
Ttime2[1]=alarm[10]*10+alarm[11];
Ttime2[2]=alarm[12]*10+alarm[13];
}
void Controle(void) //控制时钟的日期时间合法
{
if(time[12]>5) time[12]=0;
if(time[10]>5) time[10]=0;
if(Ttime[0]>=20&&time[9]>=5) time[9]=0;
if(time[8]>2) time[8]=0;
if(Tdate[1]==2&&(Tdate[0]%4==0&&Tdate[0]%100!=0||Tdate[0]%400==0))
{ if(time[6]>2) time[6]=0;}
if(Tdate[1]==1||Tdate[1]==3||Tdate[1]==5||Tdate[1]==7||
Tdate[1]==8||Tdate[1]==10||Tdate[1]==12)
{ if(time[6]==3&&time[7]>1) time[7]=0;}
if(Tdate[1]==2||Tdate[1]==4||Tdate[1]==6||Tdate[1]==9||Tdate[1]==11)
{ if(time[6]==3&&time[7]>0) time[7]=0;}
if(time[6]>3) time[6]=0;
if(Tdate[1]>10&&time[5]>2) time[5]=0;
if(time[4]>1) time[4]=0;
if(time[6]>3) time[6]=0;
if(Tdate[1]>10&&time[5]>2) time[5]=0;
if(time[4]>1) time[4]=0;
}
void Controle2(void) //控制闹钟的日期时间合法
{
if(alarm[12]>5) alarm[12]=0;
if(alarm[10]>5) alarm[10]=0;
if(Ttime2[0]>=20&&alarm[9]>=5) alarm[9]=0;
if(alarm[8]>2) alarm[8]=0;
if(Tdate2[1]==2&&(Tdate2[0]%4==0&&Tdate2[0]%100!=0||Tdate2[0]%400==0))
{ if(alarm[6]>2) alarm[6]=0;}
if(Tdate2[1]==1||Tdate2[1]==3||Tdate2[1]==5||Tdate2[1]==7||
Tdate2[1]==8||Tdate2[1]==10||Tdate2[1]==12)
{ if(alarm[6]==3&&alarm[7]>1) alarm[7]=0;}
if(Tdate2[1]==2||Tdate2[1]==4||Tdate2[1]==6||Tdate2[1]==9||Tdate2[1]==11)
{ if(alarm[6]==3&&alarm[7]>0) alarm[7]=0;}
if(alarm[6]>3) alarm[6]=0;
if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
if(alarm[4]>1) alarm[4]=0;
if(alarm[6]>3) alarm[6]=0;
if(Tdate2[1]>10&&alarm[5]>2) alarm[5]=0;
if(alarm[4]>1) alarm[4]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -