/************************************************************************
Function:HT66FU50 1602液晶显示
Write By:Holtek
Modify By:姚 鹏 2013/02/28
Description:按照2013/02/01原理图编写
*************************************************************************/
#include "HT66FU50.h"
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
void lcd_init(void);
void write_cmd(unsigned char cmd);
void mydelay(unsigned long x);
void write_string(unsigned char *s);
void write_data(unsigned char data);
void set_display_place(unsigned char line,unsigned char column);
void MCU_init(void);
#define RS _pb6 //根据66FU50原理图重置1602液晶的引脚
#define RW _pc1 //2013/02/28修改
#define E _pb5
#define LCD _pe
#define key1 _pa4
#define key2 _pa5
#define key3 _pa6
#define key4 _pa7
const char num[]="0123456789";
void write_cmd(unsigned char cmd) //写指令
{
RS=0; //写指令模式
RW=0;
E=1;
_pe = cmd;
E=0; //E:1->0
mydelay(20);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void mydelay(unsigned long x) //延迟函数
{
unsigned long i;
while(x--)
_delay(100);
}
void write_data(unsigned char data) //写入单个字符数据
{
RS = 1; //写数据模式
RW = 0;
E = 1;
_pe = data;
E = 0;
mydelay(20);
}
void write_string(unsigned char *s) //写字符串
{
while(*s != '\0')
{
write_data(*s);
s++;
}
}
void set_display_place(unsigned char line,unsigned char column) //设置字符显示位置
{
unsigned char address;
if(line == 1)
address = 0x80 + column; //0x80表示DDRAM地址设置(第1行从00H开始,DB7位为“1”)
else
if(line == 2)
address = 0xc0 + column; //0xc0表示DDRAM地址设置(第2行从40H开始,DB7位为“0”)
write_cmd(address);
}
void write_string_lcd(unsigned char line,unsigned char column,unsigned char *string) //向1602写入字符串
{
set_display_place(line,column);
write_string(string);
}
void lcd_init(void) //初始化1602液晶
{
write_cmd(0x06); //输入模式为,字符不动,光标右移(设置输入模式)
write_cmd(0x38); //设定两列(功能设置)
write_cmd(0x0c); //开启显示屏,不显示光标,光标所在(显示开/关控制)
write_cmd(0x01); //清屏的指令应该在液晶初始化最后面一行(清显示)
}
void MCU_init(void) //初始化HT66FU50
{
_tmpc0 = 0; //TM0、TM1(定时器)除能
_tmpc1 = 0; //TM2、TM3(定时器)除能
_acerl = 0; //屏蔽pa7-pa0的A/D输入功能
_cp0c = 0; //屏蔽pa0、pa2、pa3的比较器0的输入/出功能
_cp1c = 0; //屏蔽pa5、pc2、pc3的比较器1的输入/出功能
_pbc = 0x00; //pb口全部设置为输出模式
_pec = 0x00; //pe口全部设置为输出模式
_pcc = 0x00; //pc口全部设置为输出模式(2013/02/28修改)
}
void main()
{
char n1=0,n2=0,n3=0,n4=0,renshu=20,rs=30,flag0=0,flag1=0,t,shi,ge,s,g;
MCU_init();
lcd_init();
while(1)
{
if(key1==0)
{
n1++;
// flag0=1;
key2=1;
while(key2);
// key2=1;
n2++;
if(n1==n2)
{
mydelay(500);
t=1;
renshu++;
// flag0=0;
// flag1=0;
}
}
if(key2==0)
{
n2++;
// flag1=1;
key1=1;
while(key1);
// key1=1;
n1++;
if(n1==n2)
{
mydelay(500);
t=1;
renshu--;
// flag0=0;
// flag1=0;
}
}
if(key3==0)
{
n3++;
// flag0=1;
key4=1;
while(key4);
// key2=1;
n4++;
if(n3==n4)
{
mydelay(500);
t=1;
rs++;
// flag0=0;
// flag1=0;
}
}
if(key4==0)
{
n4++;
// flag1=1;
key3=1;
while(key3);
// key1=1;
n3++;
if(n3==n4)
{
mydelay(500);
t=1;
rs--;
// flag0=0;
// flag1=0;
}
}
if(t==1)
{
shi=renshu/10;
ge=renshu%10;
s=rs/10;
g=rs%10;
write_cmd(0x80+1);
write_data(num[ge]);
write_cmd(0x80+0);
write_data(num[shi]);
write_cmd(0x80+6);
write_data(num[g]);
write_cmd(0x80+5);
write_data(num[s]);
// write_com(0x18);
t=0;
}
}
}