一、 实验目标:在LCM上实现二级菜单的编写
二、源程序:
#include <iom16.h>
#include<intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,cc,dd,q,p,loop;
//-------------------------------
#define SET_BIT(x,y) (x|=(1<<y))
#define CLR_BIT(x,y) (x&=~(1<<y))
#define GET_BIT(x,y) (x&(1<<y))
#define PB0 0
#define PB1 1
#define PB2 2
#define PB3 3
#define PB4 4
#define PB5 5
#define PB6 6
#define PB7 7
//---------------引脚电平的宏定义
#define RS_1 SET_BIT(PORTB,PB0)
#define RS_0 CLR_BIT(PORTB,PB0)
#define RW_1 SET_BIT(PORTB,PB1)
#define RW_0 CLR_BIT(PORTB,PB1)
#define EN_1 SET_BIT(PORTB,PB2)
#define EN_0 CLR_BIT(PORTB,PB2)
#define CS1_1 SET_BIT(PORTB,PB3)
#define CS1_0 CLR_BIT(PORTB,PB3)
#define CS2_1 SET_BIT(PORTB,PB4)
#define CS2_0 CLR_BIT(PORTB,PB4)
#define RST_1 SET_BIT(PORTB,PB5)
#define RST_0 CLR_BIT(PORTB,PB5)
//======================================
#define DataPort PORTA //端口定义,双向数据总线。
#define xtal 8
//-------------------------------------
void Delay_1ms(void) //1mS延时子函数
{ uint i;
for(i=1;i<(uint)(xtal*143-2);i++);
}
//====================================
void Delay_nms(uint n) //n*1mS延时子函数
{
uint i=0;
while(i<n)
{Delay_1ms();
i++;
}
}
/*********************************************/
void SCN1(void)
{
if(GET_BIT(PIND,4)==0)
{
Delay_nms(10);
if(GET_BIT(PIND,4)==0)
{
q++;
if(q>3)q=0;
switch(q)
{
case 0:dd=1;bb=cc=aa=0;break;
case 1:aa=1;bb=cc=dd=0;break;
case 2:bb=1;aa=cc=dd=0;break;
case 3:cc=1;aa=bb=dd=0;break;
default:break;
}
}
}
Delay_nms(220);
}
/*********************************************/
void SCN3(void)
{
if(GET_BIT(PIND,6)==0)
{
Delay_nms(10);
if(GET_BIT(PIND,6)==0)
{
p=0;
Delay_nms(200);
}
}
}
/**********函数声明列表*************/
void Delay_1ms(void);
void Delay_nms(uint n);
void wcode(uchar c,uchar sel_l,uchar sel_r);
void wdata(uchar c,uchar sel_l,uchar sel_r);
void set_startline(uchar i);
void set_xy(uchar x,uchar y);
void dison_off(uchar o);
void reset(void);
void m16_init(void);
void lcd_init(void);
void lw(uchar x, uchar y, uchar dd);
void SCN1(void);
void SCN2(void);
void SCN3(void);
void display_tu1(uchar fb);
void display_tu2(uchar fb);
void display_tu3(uchar fb);
void display_tu4(uchar fb);
__flash uchar tu1[];
__flash uchar tu2[];
__flash uchar tu3[];
__flash uchar tu4[];
void display_hz(uchar x, uchar y, uchar n, uchar fb);
__flash uchar hz[];
/*************主函数*************/
void main(void)
{
uchar loop;
lcd_init();
aa=bb=cc=dd=0;
while(1)
{
for(loop=0;loop<8;loop++)
{display_hz(2*loop,0,loop,aa);}
for(loop=0;loop<8;loop++)
{display_hz(2*loop,2,loop+8,bb);}
for(loop=0;loop<8;loop++)
{display_hz(2*loop,4,loop+16,cc);}
for(loop=0;loop<8;loop++)
{display_hz(2*loop,6,loop+24,dd);}
SCN1();
if(GET_BIT(PIND,5)==0)
{
Delay_nms(10);
if(GET_BIT(PIND,5)==0)
{
if(aa==1)display_tu1(0);Delay_nms(200);
if(bb==1)display_tu2(0);Delay_nms(200);
if(cc==1)display_tu3(0);Delay_nms(200);
if(dd==1)display_tu4(0);Delay_nms(200);
p=1;
while(p)
{
SCN3();
}
}
}
}
}
/*----------ATMEGA16L初始化子函数。-------*/
void m16_init(void)
{
PORTA=0x00;
DDRA=0xff;
PORTB=0x00;
DDRB=0xff;
PORTD=0xff;
DDRD=0x07;
}
/*---------------判LCM忙子函数---------------*/
void lcd_busy(void)
{
uchar val;
RS_0;__no_operation();__no_operation();
RW_1;__no_operation();__no_operation();
DataPort=0x00;
while(1)
{
EN_1;__no_operation(); __no_operation();
DDRA=0x00;
val=PINA;
if(val<0x80) break;
EN_0;__no_operation(); __no_operation();
}
DDRA=0xff;
EN_0;__no_operation();__no_operation();
}
/*--------------写指令到LCM子函数---------------*/
void wcode(uchar c,uchar sel_l,uchar sel_r)
{
if(sel_l==1)CS1_1;
else CS1_0;
__no_operation();__no_operation();
if(sel_r==1)CS2_1;
else CS2_0;
__no_operation();__no_operation();
lcd_busy();
RS_0;__no_operation();__no_operation();
RW_0;__no_operation();__no_operation();
DataPort=c;
EN_1;__no_operation();__no_operation();
EN_0;__no_operation();__no_operation();
}
/*---------------写数据到LCM子函数-------------*/
void wdata(uchar c,uchar sel_l,uchar sel_r)
{
if(sel_l==1)CS1_1;
else CS1_0;
__no_operation();__no_operation();
if(sel_r==1)CS2_1;
else CS2_0;
__no_operation();__no_operation();
lcd_busy();
RS_1;__no_operation();__no_operation();
RW_0;__no_operation();__no_operation();
DataPort=c;
EN_1;__no_operation();__no_operation();
EN_0;__no_operation();__no_operation();
}
/*根据x、y地址定位,将数据写入LCM左半屏或右半屏的子函数*/
void lw(uchar x, uchar y, uchar dd)
{
if(x>=64)
{
set_xy(x-64,y);
wdata(dd,0,1);
}
else
{
set_xy(x,y);
wdata(dd,1,0);
}
}
/*---------------设定起始行子函数--------------*/
void set_startline(uchar i)
{
i=0xc0+i;
wcode(i,1,1);
}
/*---------定位x方向、y方向的子函数-----------*/
void set_xy(uchar x,uchar y)
{
x=x+0x40;
y=y+0xb8;
wcode(x,1,1);
wcode(y,1,1);
}
/*---------------屏幕开启、关闭子函数--------------*/
void dison_off(uchar o)
{
o=o+0x3e;
wcode(o,1,1);
}
/*---------------复位子函数---------------*/
void reset(void)
{
RST_0;
Delay_nms(10);
RST_1;
Delay_nms(10);
}
/*--------------LCM初始化子函数-------------*/
void lcd_init(void)
{
uchar x,y;
reset();
set_startline(0);
dison_off(0);
for(y=0;y<8;y++)
{
for(x=0;x<128;x++)lw(x,y,0);
}
dison_off(1);
}
/*---------------显示图片1的子函数--------------*/
void display_tu1(uchar fb)
{
uchar i,dx,n;
for(n=0;n<8;n++)
{
for(i=0;i<128;i++)
{
dx=tu1[i+n*128];
if(fb)dx=255-dx;
lw(i,n,dx);
}
}
}
/*---------------显示图片2的子函数--------------*/
void display_tu2(uchar fb)
{
uchar i,dx,n;
for(n=0;n<8;n++)
{
for(i=0;i<128;i++)
{
dx=tu2[i+n*128];
if(fb)dx=255-dx;
lw(i,n,dx);
}
}
}
/*---------------显示图片3的子函数--------------*/
void display_tu3(uchar fb)
{
uchar i,dx,n;
for(n=0;n<8;n++)
{
for(i=0;i<128;i++)
{
dx=tu3[i+n*128];
if(fb)dx=255-dx;
lw(i,n,dx);
}
}
}
/*---------------显示图片4的子函数--------------*/
void display_tu4(uchar fb)
{
uchar i,dx,n;
for(n=0;n<8;n++)
{
for(i=0;i<128;i++)
{
dx=tu4[i+n*128];
if(fb)dx=255-dx;
lw(i,n,dx);
}
}
}
/****************************图片2的点阵码表*********************************/
__flash uchar tu2[]=
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xDF,0xE
LCM.rar_菜单
版权申诉
112 浏览量
2022-09-21
17:27:22
上传
评论
收藏 5KB RAR 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+
最新资源
- 520马上到了两款动态爱心表白HTML代码(附源码)李峋同款爱心,快送给你爱的她或(他)吧12 情侣纪念日代码.zip
- 电子设计竞赛的单相不间断电源设计
- cutcamera1715961370938.png
- 基于MATLAB的图像处理课程设计报告.doc
- tensorflow-gpu-2.6.0-cp38-cp38-manylinux2010-x86-64.whl
- mmexport1715960553858.png
- tensorflow-gpu-2.6.0-cp37-cp37m-manylinux2010-x86-64.whl
- 通过 .NET 应用程序中的源代码查找 SQL 注入
- 电子设计竞赛2007年B题 无线识别装置.doc
- Wox全局搜索工具,一款win下的全局搜索软件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈