通过移植51单片机的菜单显示程序,成功显示并增加反白滚动 菜单
单片机源程序如下:
- #include"stm8s.h"
- #include"stm8s_gpio.h"
- #include"Cry12864.h"
- uchar curr=1,currold;
- uchar curr_flag,currold_flag;
- uchar curr_flag1,currold_flag1;
- uchar curr_flag2,currold_flag2;
- uchar flag,flag1,flag2;
- uchar user16x16[]={ 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
- 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,
- };
- unsigned char *MainMenu[]=
- {
- {" 功能菜单"},
- {"登录系统"},
- {"电压显示一"},
- {"电压显示二"},
- };
- unsigned char *MainMenu1[]=
- {
- {" 电流显示一"},
- {"电流显示二"},
- {"制作万年历"},
- {"温度传感器"},
- {" QQ音乐"},
- {"我的图片"},
- {"本地音乐"},
- {"更多应用"},
- };
- unsigned char *MainMenu2[8]=
- {
- {" 全民清账"},
- {"CF"},
- {"飞机"},
- {"王者荣耀"},
- {" 超级玛丽"},
- {"魂斗罗"},
- {"非常英雄"},
- {"下一页"},
- };
- unsigned char *MainMenu3[]=
- {
- {" 幻月后续"},
- {"能否敌发送"},
- {"测试的个i哦"},
- {"饭店附近"},
- {"大幅度"},
- {"放大发送单个"},
- {"地方"},
- {"放大上输给"},
- };
- extern const unsigned char shuzi_table[];
- #define LCD_RS_H GPIOG->ODR|=0x01 //PD6拉高
- #define LCD_RS_L GPIOG->ODR&=~0x01 //PD6拉低
- #define LCD_RW_H GPIOG->ODR|=0x02 //PD7拉高
- #define LCD_RW_L GPIOG->ODR&=~0x02 //PD7拉低
- #define LCD_EN_H GPIOG->ODR|=0x04 //PD5拉高
- #define LCD_EN_L GPIOG->ODR&=~0x04 //PD5拉低
- #define LCD_PSB_H GPIOG->ODR|=0x08 //PD0拉高
- #define LCD_CSB_L GPIOG->ODR&=~0x08 //PD0拉低
- /*******************************************
- 函数名称:Delay_1ms
- 功 能:延时约1ms的时间
- 参 数:无
- 返回值 :无
- ********************************************/
- void Delay_1ms(void)
- {
- uint i,j;
-
- for(i = 16;i > 0;i--)
- for(j=10;j>0;j--);
-
- }
- /*******************************************
- 函数名称:Delay_Nms
- 功 能:延时N个1ms的时间
- 参 数:n--延时长度
- 返回值 :无
- ********************************************/
- void Delay_Nms(uint n)
- {
- uint k;
-
- for(k = n;k > 0;k--) Delay_1ms();
- }
- void Io_Config(void)
- { GPIOB->DDR|=0xff; //PB端口设置为输出
- GPIOB->CR1|=0xff;//推免模式
- GPIOB->CR2&=~0xff;//低速模式
- GPIOG->DDR|=0xff; //PA端口设置为输出
- GPIOG->CR1|=0xff;//推免模式
- GPIOG->CR2&=~0xff;//低速模式*/
- }
- //读状态,检测忙
- void check_busy(void)
- {uchar busy;
- do
- { LCD_RS_L;
- LCD_RW_H;
- LCD_EN_L;
- Delay_1ms();
- LCD_EN_H;
- busy=GPIOB->IDR;
- Delay_1ms();
- LCD_EN_L;
- }
- while(busy&0x80);
- }
- /*******************************************
- 函数名称:Write_Cmd
- 功 能:向液晶中写控制命令
- 参 数:cmd--控制命令
- 返回值 :无
- ********************************************/
- void Write_Cmd(uchar cmd)
- {
- // check_busy();
- LCD_RW_L;
- LCD_RS_L;
- Delay_1ms();
- GPIOB->ODR&=0x00;
- GPIOB->ODR|=cmd;
- LCD_EN_H;
- Delay_1ms();
- LCD_EN_L;
- Delay_1ms();
-
-
-
- }
- /*******************************************
- 函数名称:Write_Data
- 功 能:向液晶中写显示数据
- 参 数:dat--显示数据
- 返回值 :无
- ********************************************/
- void Write_Data(uchar dat)
- { // check_busy();
- LCD_RW_L;
- LCD_RS_H;
- Delay_1ms();
- GPIOB->ODR&=0x00;
- GPIOB->ODR|=dat;
- LCD_EN_H;
- Delay_1ms();
- LCD_EN_L;
- Delay_1ms();
- }
- /*******************************************
- 函数名称:Ini_Lcd
- 功 能:初始化液晶模块
- 参 数:无
- 返回值 :无
- ********************************************/
- void Ini_Lcd(void)
- { Io_Config();
- LCD_PSB_H;
- Delay_Nms(100);
- Write_Cmd(0x30); //基本指令集
- Delay_Nms(10);
- Write_Cmd(0x02); // 地址归位
- Delay_Nms(10);
- Write_Cmd(0x0c); //整体显示打开,游标关闭
- Delay_Nms(10);
- Write_Cmd(0x01); //清除显示
- Delay_Nms(10);
- Write_Cmd(0x06); //游标右移
- Delay_Nms(10);
- Write_Cmd(0x80); //设定显示的起始地址
- }
- /*******************************************
- 函数名称:Clear_GDRAM
- 功 能:清除液晶GDRAM中的随机数据
- 参 数:无
- 返回值 :无
- ********************************************/
- void Clear_GDRAM(void)
- {
- /* uchar i,j,k;
-
- Write_Cmd(0x34); //打开扩展指令集
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x80);
- for(k = 0;k < 16;k++)
- {
- Write_Data(0x00);
- }
- }
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x88);
- for(k = 0;k < 16;k++)
- {
- Write_Data(0x00);
- }
- }
-
- Write_Cmd(0x30); //回到基本指令集
- */
- Write_Cmd(0x01);
- Delay_Nms(15);
-
- }
- /*******************************************
- 函数名称:Draw_PM
- 功 能:在整个液晶屏幕上画图
- 参 数:无
- 返回值 :无
- ********************************************/
- void Draw_PM(const uchar *ptr)
- {
- uchar i,j,k;
-
- Write_Cmd(0x34); //打开扩展指令集
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x80);
- for(k = 0;k < 16;k++)
- {
- Write_Data(*ptr++);
- }
- }
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- Write_Cmd(i++);
- Write_Cmd(0x88);
- for(k = 0;k < 16;k++)
- {
- Write_Data(*ptr++);
- }
- }
- Write_Cmd(0x36); //打开绘图显示
- Write_Cmd(0x30); //回到基本指令集
- }
- /*********************************************************/
- /* */
- /* 设定显示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- Write_Cmd(pos); //显示地址
- }
- /*******************************************
- 函数名称:Disp1Char
- 功 能:在某个位置显示一个字符
- 参 数:x--位置的列坐标
- y--位置的行坐标
- data--显示的字符数据
- 返回值 :无
- ********************************************/
- void Disp1Char(uchar x,uchar y,uchar data)
- {
- lcd_pos( x, y );
- Write_Data( data );
- }
- /*******************************************
- 函数名称:DispNchar
- 功 能:让液晶从某个位置起连续显示N个字符
- 参 数:x--位置的列坐标
- y--位置的行坐标
- n--字符个数
- ptr--指向字符存放位置的指针
- 返回值 :无
- ********************************************/
- void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
- {
- uchar i;
-
- for (i=0;i<n;i++)
- {
- Disp1Char(x++,y,ptr[i]);
- if (x == 0x0f)
- {
- x = 0;
- y ^= 1;
- }
- }
- }
- /*******************************************
- 函数名称:DispString
- 功 能:让液晶从某个位置起连续显示N个字符
- 参 数:x--位置的列坐标
- y--位置的行坐标
- n--字符个数
- ptr--指向字符存放位置的指针
- 返回值 :无
- ********************************************/
- void DispString(uchar x,uchar y,uchar *ptr)
- {
- uchar i = 0;
- lcd_pos( x, y );
- while(ptr[i] != '\0')
- { //显示字符
-
- Write_Data(ptr[i]);
- i++;
- }
- }
- /*******************************************
- 函数名称:Draw_TX
- 功 能:显示一个16*16大小的图形
- 参 数:Yaddr--Y地址
- Xaddr--X地址
- dp--指向图形数据存放地址的指针
- 返回值 :无
- ********************************************/
- void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
- {
- uchar j;
- uchar k=0;
-
- // Write_Cmd(0x01); //清屏,只能清除DDRAM
- Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
- for(j=0;j<16;j++)
- {
- Write_Cmd(Yaddr++); //Y地址
- Write_Cmd(Xaddr); //X地址
- Write_Data(dp[k++]);
- Write_Data(dp[k++]);
- }
- Write_Cmd(0x36); //打开绘图显示
- // Write_Cmd(0x30); //回到基本指令集模式
- }
- /***********************************************
- 写入用户自定义函数
- ***********************************************/
- void CGRAM()
- {
- int i;
- Write_Cmd(0x30);
- Write_Cmd(0x40); //对CGRAM第一个自定义符操作
- for(i=0;i<16;i++)
- {
- Write_Data(user16x16[i*2]);
- Write_Data(user16x16[i*2+1]);
- }
- }
- /***********************************************
- 显示用户自定义字符
- ***********************************************/
- void DisplayCGRAM(unsigned char x,unsigned char y)
- {
- switch(y)
- {
- case 1: Write_Cmd(0x80+x);break;
- case 2: Write_Cmd(0x90+x);break;
- case 3: Write_Cmd(0x88+x);break;
- case 4: Write_Cmd(0x98+x);break;
- default:break;
- }
- Write_Data(00); //é???óDò???×?·?2ù×÷0x04á? ?ùò??±?óD′
- Write_Data(00); //D′×?·? Write_Data(user16x16[i*2]);
- // Write_Data(user16x16[i*2+1]);
- }
- /*************************************************************
- //为反白做准备,目地是在图形显示时防止有噪点
- *************************************************************/
- void display() //为反白做准备,目地是在图形显示时防止有噪点
- {
- uchar i,j;
- Write_Cmd(0x34); //写数据时,关闭图形显示
- for(i=0;i<32;i++)
- {
- Write_Cmd(0x80+i); //先写入水平坐标值
- Write_Cmd(0x80); //写入垂直坐标值
- for(j=0;j<16;j++) //再写入两个8位元的数据
- Write_Data(0x00);
- Delay_Nms(1);
- }
- for(i=0;i<32;i++)
- {
- Write_Cmd(0x80+i);
- Write_Cmd(0x88);
- for(j=0;j<16;j++)
- Write_Data(0x00);
- Delay_Nms(1);
- }
- Write_Cmd(0x36);//写完数据,开图形显示
- }
- /*******************************************************
- 反白函数
- *********************************************************/
- void photodisplay(uchar x,uchar y,uchar width) //反白,X值为0-7,Y值为0-3,width为行反白格数
- {
- uchar i,j,flag=0x00;
- display();
- if(y>1)
- {
- flag=0x08;
- y=y-2;
- }
- Write_Cmd(0x34); //写数据时,关闭图形显示,且打开扩展指令集
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
12864菜单程序.rar
(1 MB, 下载次数: 61)
|