📄 按键.c
字号:
#include <iom64v.h>
#include <macros.h>
#define enter 0x74
#define up 0xf0
#define down 0xe4
#define left 0xd4
#define right 0xb4
#define zuo 0x00
#define zhong 0x01
#define can1 0x02
#define can2 0x03
#define set_RS PORTC|=BIT(3)
#define clr_RS PORTC&=~BIT(3)
#define set_RD PORTC|=BIT(5)
#define clr_RD PORTC&=~BIT(5)
#define set_CS PORTC|=BIT(1)
#define clr_CS PORTC&=~BIT(1)
#define set_WR PORTC|=BIT(4)
#define clr_WR PORTC&=~BIT(4)
#define set_RESET PORTC|=BIT(2)
#define clr_RESET PORTC&=~BIT(2)
#define set_cs6675 PORTB|=BIT(0)
#define clr_cs6675 PORTB&=~BIT(0)
#define set_sck PORTB|=BIT(1)
#define clr_sck PORTB&=~BIT(1)
//===========================================
#define uint unsigned int
#define uchar unsigned char
//=========================================
#define mSetDS1302SCK PORTG|=BIT(0)
#define mClrDS1302SCK PORTG&= ~BIT(0)
#define mSetDS1302RST PORTG|=BIT(1)
#define mClrDS1302RST PORTG&= ~BIT(1)
#define mSetDS1302IO PORTG|=BIT(2)
#define mClrDS1302IO PORTG&= ~BIT(2)
#define mTestDS1302IO PING& BIT(2)
#define mDS1302IO_In DDRG &= ~BIT(2)
#define mDS1302IO_Out DDRG |= BIT(2)
//=========================================
#define mDS1302_SEC_Reg 0x80
#define mDS1302_MIN_Reg 0x82
#define mDS1302_HOUR_Reg 0x84
#define mDS1302_CONTROL_Reg 0x8e
#define mDS1302_CHARGER_Reg 0x90
#define mDS1302_CLKBURST_Reg 0xbe
//=========================================
#define wait asm("nop\n nop")
#define _nop asm("nop")
#define MAXCOLUMN 131 //最大列数量
#define BLACK 0xff //lcd全黑
#define WHITE 0x00 //lcd全白
#define YES 0x01
#define NO 0x00
#define DEL 0x01
#define SELECT 0x00
#define page_0 0x00 //lcd的页,共8页
#define page_1 0x01
#define page_2 0x02
#define page_3 0x03
#define page_4 0x04
#define page_5 0x05
#define page_6 0x06
#define page_7 0x07
static unsigned char entercount,leftcount,rightcount;
static unsigned char position1302,hh,mm,positioncanbi,canbianjian;
static unsigned int time_array[6],canbi_array[5];
// //////////////////////////////////////////////////////////////////////////
//固定数据区
/////////////////////////////////////////////////////////////////////////
static const unsigned char arab_1[16]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
static const unsigned char arab_2[16]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};
static const unsigned char arab_3[16]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};
static const unsigned char arab_4[16]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};
static const unsigned char arab_5[16]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};
static const unsigned char arab_6[16]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};
static const unsigned char arab_7[16]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};
static const unsigned char arab_8[16]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};
static const unsigned char arab_9[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};
static const unsigned char arab_0[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};
static const unsigned char T[16]={0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00};
static const unsigned char t[16]={0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00};
static const unsigned char maohao[16]={0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};
static const unsigned char xiaoshudian[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};
static const unsigned char E[16]={0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00};
static const unsigned char l[16]={0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
static const unsigned char g[16]={0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00};
static const unsigned char P[16]={0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00};
static const unsigned char H[8]={0x00,0x7E,0x10,0x7E,0x00,0x50,0x70,0x40};
static const unsigned char ll[8]={0x00,0x00,0x42,0x7E,0x42,0x00,0x00,0x00};
static const unsigned char lll[8]={0x00,0x00,0x42,0x7E,0x42,0x7E,0x42,0x00};
static const unsigned char zhenghao[16]={0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00};
static const unsigned char fuhao[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
void Send_Byte(unsigned char bdata)
{
set_CS; //模拟时序信号
set_CS;
set_RS;
set_WR;
_nop;
//开始发送数据
PORTA = bdata; //将显示数据放在端口A
set_RS;
clr_CS;
clr_WR;
_nop;
clr_WR;
_nop;
set_WR;
_nop;
set_CS;
set_RS;
}
void Send_Command(unsigned char cdata)
{
set_CS;
set_RS;
set_WR;
_nop;
//开始发送命令
PORTA = cdata; //将命令字放在端口A
clr_RS;
clr_CS;
_nop;
clr_WR;
_nop;
set_WR;
_nop;
set_CS;
set_RS;
}
unsigned char Gen_Column_MSB(unsigned char column)
{
unsigned char temp; //用于保存列数的高4bit命令字
temp = column+0x04 ;
temp = temp >>4; //右移4位,得到高4位的列数据
temp |=0x10; //00010000,将列地址的DB4置1
return temp;
}
unsigned char Gen_Column_LSB(unsigned char column)
{
unsigned char temp = column;
temp = column+0x04 ;
temp &= 0x0f; //取出column的低四位
return temp;
}
unsigned char Gen_Page(unsigned char page)
{
unsigned char temp;
temp = page & 0x0f;
temp |= 0xb0; //得到显示数据页的控制字
return temp;
}
void Initial_LCD(void)
{
Send_Command(0xe2); //初始化内部功能(RESET),初始化初始显示线,列地址,页地址和普通
//输出地址状态到初始状态,但是不能影响显示数据RAM的内容
wait;
//等待2个时钟周期
Send_Command(0xaf); //Display on
Send_Command(0x23); //internal voltage regulator resistor ratio,(4.5)0x23
Send_Command(0x2f); //内部供电VC=VR=VF:111,使内部VC,VR,VF的电压控制电路工作
Send_Command(0x40); //初始化显示线在line address 0
Send_Command(0x81); //设置参考电压模式对比度共64级
Send_Command(0xa1);
Send_Command(0xa1);
Send_Command(0xa3); //选择LCD偏置电压比率以驱动LCD,bias=1
Send_Command(0xa4); //全亮显示,EON=0,normal display(不管显示RAM中有何数据)
Send_Command(0xb0); //设置页地址为0
Send_Command(0x0c); //选择COM(行地址)输出扫描方向,决定LCD驱动器的输出状态。SHL=0,normal direction(COM0-COM63)
Send_Command(0xad); //设置STATIC INDICATOR STATUS(SM=1,STATIC INDICATOR ON)
Send_Command(0x03); //STATUS OF STATIC INDICATOR OUTPUT ALWAYS ON
}
void Initial_MCU(void)
{
DDRA=0xff;
PORTA=0xff;
DDRB=0x03;
PORTB=0xff;
DDRC=0xff;
PORTC=0xff;
PORTG=0x00;
DDRG=0x00;
DDRE=0xfe;
PORTE=0xff;
}
void Clear_DDRAM(unsigned char c_page_start,unsigned char c_page_end)
{
unsigned char i,j;
unsigned char start_page; //用于存放清除的起始页数
unsigned char c_column_msb=0x10,c_column_lsb=0x04; //清除的起始列为第4列
start_page = Gen_Page(c_page_start); //取得清除的起始页地址
for(j=c_page_start;j<=c_page_end;j++)
{
Send_Command(0x10); //从第4列开始清除LCD显示的数据
Send_Command(0x04);
Send_Command(start_page); //清除位置在第start_page页
for(i=0;i<=127;i++)
{
Send_Byte(WHITE); //清除页内所有列显示的数据
}
start_page++; //清除下一页数据
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个8*8大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x8(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
Send_Command(Gen_Page(page)); //送页地址
Send_Command(Gen_Column_LSB(column)); //送低4位地址
Send_Command(Gen_Column_MSB(column)); //送高4位地址
for(i=0;i<=7;i++) //水平宽度为8列
{
Send_Byte(*pdata);
pdata++;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个8*16大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x16(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
unsigned char j;
for(j=0;j<=1;j++)
{
Send_Command(Gen_Page(page));
Send_Command(Gen_Column_LSB(column));
Send_Command(Gen_Column_MSB(column));
for(i=0;i<=7;i++)
{
Send_Byte(*pdata);
pdata++;
}
page++;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制一个反白显示8*16大小的位图
//////////////////////////////////////////////////////////////////////////
void Bmp8x16_rev(unsigned char page,unsigned char column,const unsigned char
*pdata)
{
unsigned char i;
unsigned char j;
for(j=0;j<=1;j++)
{
Send_Command(Gen_Page(page));
Send_Command(Gen_Column_LSB(column));
Send_Command(Gen_Column_MSB(column));
for(i=0;i<=7;i++)
{
Send_Byte(~(*pdata));
pdata++;
}
page++;
}
}
//////////////////////////////////////////////////////////////////////
//数值大小与阿拉伯数字之间的转换反白显示
//////////////////////////////////////////////////////////////////////
void Draw_NtoArab_rev(unsigned char page,unsigned char column,unsigned char number)
{
switch(number)
{
case 0x00:
{
Bmp8x16_rev(page,column,arab_0);
break;
}
case 0x01:
{
Bmp8x16_rev(page,column,arab_1);
break;
}
case 0x02:
{
Bmp8x16_rev(page,column,arab_2);
break;
}
case 0x03:
{
Bmp8x16_rev(page,column,arab_3);
break;
}
case 0x04:
{
Bmp8x16_rev(page,column,arab_4);
break;
}
case 0x05:
{
Bmp8x16_rev(page,column,arab_5);
break;
}
case 0x06:
{
Bmp8x16_rev(page,column,arab_6);
break;
}
case 0x07:
{
Bmp8x16_rev(page,column,arab_7);
break;
}
case 0x08:
{
Bmp8x16_rev(page,column,arab_8);
break;
}
case 0x09:
{
Bmp8x16_rev(page,column,arab_9);
break;
}
default:
{
Bmp8x16_rev(page,column,arab_0);
}
break;
}
}
//////////////////////////////////////////////////////////////////////
//数值大小与阿拉伯数字之间的转换显示
//////////////////////////////////////////////////////////////////////
void Draw_NtoArab(unsigned char page,unsigned char column,unsigned char number)
{
switch(number)
{
case 0x00:
{
Bmp8x16(page,column,arab_0);
break;
}
case 0x01:
{
Bmp8x16(page,column,arab_1);
break;
}
case 0x02:
{
Bmp8x16(page,column,arab_2);
break;
}
case 0x03:
{
Bmp8x16(page,column,arab_3);
break;
}
case 0x04:
{
Bmp8x16(page,column,arab_4);
break;
}
case 0x05:
{
Bmp8x16(page,column,arab_5);
break;
}
case 0x06:
{
Bmp8x16(page,column,arab_6);
break;
}
case 0x07:
{
Bmp8x16(page,column,arab_7);
break;
}
case 0x08:
{
Bmp8x16(page,column,arab_8);
break;
}
case 0x09:
{
Bmp8x16(page,column,arab_9);
break;
}
default:
{
Bmp8x16(page,column,arab_0);
}
break;
}
}
//////////////////////////////////////////////////////////////////////////
//绘制菜单界面
//////////////////////////////////////////////////////////////////////////
void Draw_Menu_Interface()
{ Bmp8x16(0x00,0x18,T);
Bmp8x16(0x00,0x20,maohao);
Bmp8x16(0x00,0x38,maohao);
Bmp8x16(0x00,0x50,maohao);
Bmp8x16(0x02,0x00,t);
Bmp8x16(0x02,0x08,maohao);
Bmp8x16(0x02,0x30,xiaoshudian);
Bmp8x16(0x02,0x40,E);
Bmp8x16(0x02,0x48,maohao);
Bmp8x16(0x02,0x70,xiaoshudian);
Bmp8x16(0x04,0x10,l);
Bmp8x16(0x04,0x18,g);
Bmp8x16(0x04,0x20,P);
Bmp8x8(0x04,0x28,ll);
Bmp8x8(0x05,0x28,H);
Bmp8x16(0x04,0x30,maohao);
Bmp8x16(0x04,0x50,xiaoshudian);
Bmp8x16(0x06,0x10,l);
Bmp8x16(0x06,0x18,g);
Bmp8x16(0x06,0x20,P);
Bmp8x8(0x06,0x28,lll);
Bmp8x8(0x07,0x28,H);
Bmp8x16(0x06,0x30,maohao);
Bmp8x16(0x06,0x50,xiaoshudian);
}
void pDS1302_Write(uchar reg,uchar data)
{
uchar i;
mDS1302IO_Out;
mSetDS1302IO;
mClrDS1302RST;
wait;
mClrDS1302SCK;
wait;
mSetDS1302RST;
wait;
for(i=0;i<8;i++)
{
if(reg&BIT(i))
mSetDS1302IO;
else
mClrDS1302IO;
wait;
mSetDS1302SCK;
wait;
mClrDS1302SCK;
wait;
}
for(i=0;i<8;i++)
{
if(data&BIT(i))
mSetDS1302IO;
else
mClrDS1302IO;
wait;
mSetDS1302SCK;
wait;
mClrDS1302SCK;
wait;
}
wait;
mClrDS1302RST;
wait;
}
uchar pDS1302_Read(uchar reg)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -