标题:
stm8的12864菜单程序 反白滚动菜单
[打印本页]
作者:
XD1860
时间:
2017-12-4 20:42
标题:
stm8的12864菜单程序 反白滚动菜单
通过移植51单片机的菜单显示程序,成功显示并增加反白滚动 菜单
0.png
(7.38 KB, 下载次数: 35)
下载附件
2017-12-4 23:53 上传
单片机源程序如下:
#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)
2017-12-4 20:41 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1