|
之前自己练习1602液晶显示的成果,1602的驱动编写和调用里面解释很详细了
结合我的解释,仔细看我编程的结构和思路
慢慢的你会对1602的使用有所了解
自己专研下肯定会让你收益颇丰,
发出来也是对自己学习的鼓励吧!加油各位!!
- /**************************************************/
- /*
- 1602 模拟显示车辆速度、温度、油量
- 1.欢迎语句 Welcome GXUST 第二行car system
- 2. place select 1 2 3 功能选项
- 3.轮流显示1.speed
- 2.temperatuer
- 3.oil mass
-
- 我一直认为单片机是开放的,可以思考的,我做的这份
- 是个引子,读者看懂了自然可以快速自己加入自己想显示的字符。
- ***************************************************/
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- #define Data P0//数据端口
- #define GPIO_KEY P1 //键盘口
- sbit RS = P2^0; //Pin4
- sbit RW = P2^1; //Pin5
- sbit E = P2^2; //Pin6
- unsigned char KeyValue;
- unsigned char kk=0;
- char TimeNum[16]="Welcome GXUSt";
- char Test1[16]="car systen";
- char Test2[16]="place select 123";
- char speed[16]=" 1.speed";
- char temperatuer[16]=" 2.temperatuer";
- char oil[16]=" 3.oil mass"; /*这些是定义字符串,方便显示调用*/
- void DelayUs(unsigned char us)//微秒级延时函数
- {
- unsigned char uscnt;
- uscnt=us>>1;
- while(--uscnt);
- }
- void DelayMs(unsigned int ms) //毫秒级延时函数
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- void WriteCommand(unsigned char c)//写命令函数
- {
- DelayMs(5);//操作前短暂延时,保证信号稳定
- E=0; //使能清零
- RS=0; //选择写命令
- RW=0; //选择写入
- // _nop_(); //延时一会
- // E=1;
- Data=c; //送数
- DelayMs(1);
- E=1;
- DelayMs(5);//等待写入完成
- E=0;
- }
- void WriteData(unsigned char c) //写数据函数
- {
- DelayMs(5);//操作前短暂延时,保证信号稳定
- E=0;
- RS=1;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- RS=0;
- }
- void ShowChar(unsigned char pos,unsigned char c)//写字符函数 哪个位置写
- {
- unsigned char p;
- if (pos>=0x10)
- p=pos+0xb0; //是第二行则命令代码高4位为0xc 从第二行开始写
- else
- p=pos+0x80; //是第二行则命令代码高4位为0x8 从第一行的POS开始写
- WriteCommand (p);//写命令
- WriteData (c);//写数据
- }
- void lcd_sfm(unsigned char add,unsigned char date)//显示位置和数据 在哪里add显示 显示数据date
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- WriteCommand(0x80+0x40+add);
- WriteData(0x30+shi);
- WriteData(0x30+ge);
- }
- void ShowString (unsigned char line,char *ptr)//写字符串函数 line:行
- {
- unsigned char l,i;
- l=line<<4;//若line=0,则地址的高四位为0;若line=1.则地址的高四位为1 写哪一行
- for (i=0;i<16;i++)
- ShowChar (l++,*(ptr+i));//循环显示16个字符
- }
- void InitLcd()//初始化函数
- {
- DelayMs(15);
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x06); //显示光标移动位置
- WriteCommand(0x0c); //显示开及光标设置 不显示光标
- WriteCommand(0x01); //显示清屏
- // WriteCommand(0x80+0x10); //设定数据指针起始点
- }
- unsigned char keyscan() //键盘扫描函数
- {
- char a=0;
- GPIO_KEY=0x0f; //P1口值准备
- if(GPIO_KEY!=0x0f)
- {
- DelayMs(10); //延时消抖
- if(GPIO_KEY!=0x0f)//再次判断
- {
- GPIO_KEY=0x0f; //再次装值准备
- switch(GPIO_KEY) //测试行
- {
- case(0x07):KeyValue=0;break; //第一行
- case(0x0b):KeyValue=1;break; //第二行
- case(0x0d):KeyValue=2;break; //第三行
- case(0x0e):KeyValue=3;break; //第四行
- }
- GPIO_KEY=0xf0; //高四位赋1,判断准备
- switch(GPIO_KEY) //测试行
- {
- case(0x70):KeyValue=KeyValue;break; //0-3
- case(0xb0):KeyValue=KeyValue+4;break; //4-7
- case(0xd0):KeyValue=KeyValue+8;break; //8-11
- case(0xe0):KeyValue=KeyValue+12;break; //12-15
- }
- while((GPIO_KEY!=0x0f)&&(a<20)) //判断是否松手,假若没有松手,一段延时后依旧判断松手完成
- {
- DelayMs(5);
- a++;
- }
- a=0;
- }
- }
- return KeyValue;
- }
- void cjm() //初始界面
- {
- ShowString(1,Test2); //显示plaace
- DelayMs(1000);
- WriteCommand(0x01); //显示清屏
-
- ShowString(0,speed); //显示speed
- DelayMs(1000);
- WriteCommand(0x01); //显示清屏
-
- ShowString(0,temperatuer);//显示temperatuer
- DelayMs(1000);
- WriteCommand(0x01); //显示清屏
- ShowString(0,oil); //显示oil
- DelayMs(1000);
- WriteCommand(0x01); //显示清屏
- }
- void jin()//进入界面
- {
- DelayMs(15);//延时保证信号稳定
- ShowString(0,TimeNum); //写字符串
- DelayMs(15);
- ShowString(1,Test1);//写字符串
- DelayMs(2000);
- WriteCommand(0x01); //显示清屏
- }
- void Intput0() //外部中断
- {
- IT0=1; //跳变沿触发
- EX0=1; //开外部中断允许
- EA=1; //开总中断
- }
- void main(void)//主函数
- {
-
- InitLcd(); //初始化
- jin(); //进入界面
- while(1)
- {
- kk=keyscan();
- cjm();
- }
- }
- void exit0() interrupt 0//中断处理
- {
- if(kk==1)
- {
- kk=0;
- WriteCommand(0x01); //显示清屏
- ShowString(0, "the speed is:");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //显示清屏
- }
- if(kk==2)
- {
- kk=0;
- WriteCommand(0x01); //显示清屏
- ShowString(0, "temperatuer is:");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //显示清屏
- }
- if(kk==3)
- {
- kk=0;
- WriteCommand(0x01); //显示清屏
- ShowString(0,"the oil is: ");
- ShowString(1, " 0.return");
- DelayMs(2000);
- WriteCommand(0x01); //显示清屏
- }
- if(kk==0) //返回界面
- {
- WriteCommand(0x01); //显示清屏
- cjm();
- jin();
- }
- kk=0;
- }
复制代码
|
评分
-
查看全部评分
|