标题:
LCD12864显示例程(导航旋钮组合框)无字库的
[打印本页]
作者:
踏莎行pretty
时间:
2021-7-11 21:49
标题:
LCD12864显示例程(导航旋钮组合框)无字库的
带你玩转LCD12864
单片机源程序如下:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DATABUS P1
#endif
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit CS1 = P2^4;
sbit CS2 = P2^5;
sbit PIN4 =P3^0;
sbit PIN3 =P3^1;
sbit PIN1 =P3^2;
void delay300ms(); //延时300ms
void Delay2ms(void); //延时20ms
void Init(void); //初始化
void OnOff(uchar onoff); //屏幕开关
void Clear(void); //清屏
void Write_Com(uchar com); //写命令
void Write_Data(uchar Data); //写数据
void Select_Screen(uchar cs); //选择左右半屏
void Set_Page(uchar page); //页选择函数
void Set_Row(uchar row); //行选择函数
void Set_Rank(uchar rank); //列选择函数
void Show_Im_128x64(uchar *Im); //128x64图像显示
void Show_Im_64x64(uchar screen,uchar *Im); //64x64图像显示
void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo); //32x32字符显示
void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo); //16x16字符显示
void Show_Num_16x64(uchar screen,uchar page,uchar *Num); //16x64数字显示
void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu); //菜单显示
//延时2ms
void Delay2ms()
{
uchar i, j;
i = 1;
j = 5;
do
{
while (--j);
} while (--i);
}
//300ms
void delay300ms()
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//初始化屏幕
void Init(void)
{
Select_Screen(0);
OnOff(1);
Clear();
Select_Screen(1);
OnOff(1);
Clear();
}
//屏幕开关
void OnOff(uchar onoff)
{
onoff = onoff | 0x3E; //0关1开
Write_Com(onoff);
}
//清屏
void Clear(void)
{
uchar i,j;
Set_Page(0);
Set_Row (0);
Set_Rank(0);
for(i = 0;i < 8;i++){
Set_Page(i);
for(j = 0;j < 64;j++){
Write_Data(0x00);
}
}
}
//写命令
void Write_Com(uchar com)
{
RS = 0;RW = 0;EN = 0;
DATABUS = com;
EN = 1;
Delay2ms();
EN = 0;
}
//写数据
void Write_Data(uchar Data)
{
RS = 1;RW = 0;EN = 0;
DATABUS=Data;
EN = 1;
Delay2ms();
EN = 0;
}
//屏幕选择函数
void Select_Screen(uchar cs)
{
switch(cs){
case 0:CS1 = 1;CS2 = 0;break; //左半屏
case 1:CS1 = 0;CS2 = 1;break; //右半屏
default: CS1 = 1;CS2 = 0;break;
}
}
void Set_Page(uchar page)
{
page = 0xB8 | page;
Write_Com(page);
}
void Set_Row(uchar row)
{
row = 0xC0 | row;
Write_Com(row);
}
void Set_Rank(uchar rank)
{
rank = rank & 0x3F;
rank = rank | 0x40;
Write_Com(rank);
}
//128x64图像
void Show_Im_128x64(uchar *Im)
{
uchar i,j;
Select_Screen(0); //左半
for(i = 0;i < 8;i++){
Set_Page(i);
for(j = 0;j < 64;j++){
Write_Data(Im[i*128+j]);
}
}
Select_Screen(1); //右半
for(i = 0;i < 8;i++){
Set_Page(i);
for(j = 64;j < 128;j++){
Write_Data(Im[i*128+j]);
}
}
}
void Show_Im_128x32(uchar *Im)
{
uchar i,j;
Select_Screen(0); //左半
for(i = 0;i < 4;i++){
Set_Page(i);
for(j = 0;j < 64;j++){
Write_Data(Im[i*128+j]);
}
}
Select_Screen(1); //右半
for(i = 0;i < 4;i++){
Set_Page(i);
for(j = 64;j < 128;j++){
Write_Data(Im[i*128+j]);
}
}
}
//64x64
void Show_Im_64x64(uchar screen,uchar *Im)
{
uchar i, j;
Select_Screen(screen);
for(i = 0;i < 8;i++){
Set_Page(i);
for(j = 0;j < 64;j++){
Write_Data(Im[i*64+j]);
}
}
}
//32x32
void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo)
{
uchar i, j;
//Init();
Select_Screen(screen);
for(i = 0;i < 4;i++){
Set_Page(page+i);
Set_Rank(rank);
for(j = 0;j < 32;j++){
Write_Data(ImWo[i*32+j]);
}
}
}
//16x16
void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo)
{
uchar i, j;
//Init();
Select_Screen(screen);
for(i = 0;i < 2;i++){
Set_Page(page+i);
Set_Rank(rank);
for(j = 0;j < 16;j++){
Write_Data(ImWo[i*16+j]);
}
}
}
//16x64
void Show_Num_16x64(uchar screen,uchar page,uchar *Num)
{
uchar i, j;
Select_Screen(screen);
Set_Page(page);
for(i = 0;i < 8;i++){
for(j = 0;j < 8;j++){
Write_Data(Num[16*i+j]);
}
};
Set_Page(page+1);
for(i = 0;i < 8;i++){
for(j = 0;j < 8;j++){
Write_Data(Num[16*i+j+8]);
}
};
}
//菜单
void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu)
{
uchar n;
if(sel) n=128;
else n=0;
Show_ImWo_16x16(screen,page,0,&menu[0+n]);
Show_ImWo_16x16(screen,page,16,&menu[32+n]);
Show_ImWo_16x16(screen,page,32,&menu[64+n]);
Show_ImWo_16x16(screen,page,48,&menu[96+n]);
}
bit Click; //单击信号
bit D_Click;
bit Clock_Wise; //顺时针信号
bit A_Clock_Wise; //逆时针信号
uchar sta=0;
//"熊猫",128*64
uchar code panda[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0x03,0xAB,0xAB,0xA9,0xAA,0xAB,0xAB,0xAB,0x03,0xFF,0xFF,0xFF,0xFF,
0xBF,0xCF,0xFF,0xFC,0xC6,0xBE,0xBE,0xBA,0xA6,0xBE,0xBE,0x8C,0xFF,0xF7,0xCF,0xFF};/*"?",3*/
//判断单击信号
void Click_Flag()
{
uchar sta[3]={0,0,0};
if(PIN4==0){
Delay2ms(); //????(???????,??????????)
if(PIN4==0);sta[0]=1; //?????
Delay2ms();
if(PIN4==1) sta[1]=1; //????
Delay2ms();
if(PIN4==0) sta[2]=1; //?????*/
Click = sta[0]; //???????
D_Click = sta[0]&sta[1]&sta[2]; //???????
while(!PIN4); //????(??????CPU????,???)
}
}
//中断
void inter() interrupt 0
{ unsigned char Current_PIN3_status,flag,Last_PIN3_status;
Last_PIN3_status = PIN3;
while(!PIN1)
{
Current_PIN3_status = PIN3;
flag = 1;
}
if(flag == 1)
{
flag = 0;
if((Last_PIN3_status)==0&&(Current_PIN3_status==1))
Clock_Wise = 1;//顺时针
if((Last_PIN3_status)==1&&(Current_PIN3_status==0))
A_Clock_Wise = 1;//逆时针
}
}
//选择菜单1
void show_menu1 ()
{
Clock_Wise=0;//???????
A_Clock_Wise=0;//???????
Show_Menu(1,0,0,menu1);
Show_Menu(0,0,2,menu2);
Show_Menu(0,0,4,menu3);
}
//选择菜单2
void show_menu2 ()
{
Clock_Wise=0;
A_Clock_Wise=0;
Show_Menu(0,0,0,menu1);
Show_Menu(1,0,2,menu2);
Show_Menu(0,0,4,menu3);
}
//选择菜单3
void show_menu3 ()
{
Clock_Wise=0;
A_Clock_Wise=0;
Show_Menu(0,0,0,menu1);
Show_Menu(0,0,2,menu2);
Show_Menu(1,0,4,menu3);
}
void show_menu1_1 ()
{
Clock_Wise=0;
A_Clock_Wise=0;
Show_Menu(1,1,0,menu1_1);
Show_Menu(0,1,2,menu1_2);
Show_Menu(0,1,4,menu1_3);
}
void show_menu1_2 ()
{
Clock_Wise=0;
A_Clock_Wise=0;
Show_Menu(0,1,0,menu1_1);
Show_Menu(1,1,2,menu1_2);
Show_Menu(0,1,4,menu1_3);
}
void show_menu1_3 ()
{
Clock_Wise=0;
A_Clock_Wise=0;
Show_Menu(0,1,0,menu1_1);
Show_Menu(0,1,2,menu1_2);
Show_Menu(1,1,4,menu1_3);
}
void main()
{
bit toHead;
IE = 0X81; //总中断
IT0 = 1; //下降沿触发中断
Init();
while(1)
{
Show_Im_128x64(panda); //欢迎界面
// Delay300ms();
// Show_ImWo_32x32(1,0,0,wang);
// Show_ImWo_32x32(1,0,32,hao);
// Show_Num_16x64(1,5,stunum);
Click_Flag(); //判断单击
if(Click)
{
Click=0;
Select_Screen(0);Clear();
Select_Screen(1);Clear();
while(1)
{
if(D_Click)break;
A_Clock_Wise=0;
Clock_Wise=0;
toHead=0;
show_menu1 ();//初始选中菜单1
if(A_Clock_Wise)//逆时针旋转
{
A_Clock_Wise=0;
Clock_Wise=0;
while(1)
{
if(toHead)break;
show_menu3 ();//选中菜单3
Click_Flag();
if(Click) while(1){Show_Im_128x64(name);delay300ms();delay300ms();delay300ms();if(A_Clock_Wise){A_Clock_Wise=0;Click=0;Select_Screen(0);Clear();
Select_Screen(1);Clear();break;}
}
if(Clock_Wise){Clock_Wise = 0;A_Clock_Wise=0;break;}//顺时针旋转break 选中1
if(A_Clock_Wise) //逆时针旋转
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有代码51hei提供下载:
LCD.rar
(352.51 KB, 下载次数: 33)
2021-7-11 21:48 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1