#include <STC8.H>
#include <intrins.h>
#define LCD1602_RS P32
#define LCD1602_EN P33
#define LCD1602_D4 P34
#define LCD1602_D5 P35
#define LCD1602_D6 P36
#define LCD1602_D7 P37
#define Command 0
#define Data 1
#define Clear_Display 0x01 //Clear_Display
#define Return_Home 0x02 //Return_Home
#define Entry_Mode_Cursor_Left 0x04 //Entry_Mode_Set
#define Entry_Mode_Entire_Right 0x05 //Entry_Mode_Set
#define Entry_Mode_Cursor_Right 0x06 //Entry_Mode_Set
#define Entry_Mode_Entire_Left 0x07 //Entry_Mode_Set
#define Display_Off 0x08 //Display_ON/OFF
#define Display_On 0x0c //Display_ON/OFF
#define Display_On_Cursor_Off_Blink_On 0x0d //Display_ON/OFF
#define Display_On_Cursor_On_Blink_Off 0x0e //Display_ON/OFF
#define Display_On_Cursor_On_Blink_On 0x0f //Display_ON/OFF
#define Cursor_Move_Left 0x10 //Cursor_or_Display_Shift
#define Cursor_Move_Right 0x14 //Cursor_or_Display_Shift
#define Display_Move_Left 0x18 //Cursor_or_Display_Shift
#define Display_Move_Right 0x1c //Cursor_or_Display_Shift
#define Setting_Basic_Instruction_Set 0x28 //Function_Set
#define Setting_Extended_Instruction_Set 0x29 //Function_Set
#define Function_Set 0x38 //Function_Set
#define Contrast_Set 0x78 //Contrast_Set
#define Internal_OSC 0x14 //Internal_OSC
#define Power_ICON_Contrast 0x5e //Power_ICON_Contrast
#define Follower_Control 0x6a //Follower_Control
#define Power_ICON_Contrast 0x5e //Power_ICON_Contrast
unsigned char code Display_Hex[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char code Display_Data1[32]=
{
"LCD_1602_Program" //0x80
"Conter:000000000" //0xc0
};
/*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
void Delay_10us(void)
{
unsigned char i;
i=35;
while(--i);
}
/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
while(x--)
Delay_10us();
}
/*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
void Delay_10ms(void)
{
unsigned char i,j;
_nop_();
_nop_();
i=144;
j=157;
do
{
while(--j);
}
while(--i);
}
/*----------------------------延时x10ms----------------------------*/
void Delay_x10ms(unsigned char x)
{
while(x--)
Delay_10ms();
}
/*----------------------------LCD1602_Enable----------------------------*/
void LCD1602_Enable(void)
{
LCD1602_EN=1;
Delay_10us();
LCD1602_EN=0;
Delay_10us();
}
/*----------------------------写命令或数据,x=0传送命令,x=1传送数据----------------------------*/
void LCD1602_Write(unsigned char temp,bit x)
{
LCD1602_RS=x; //x=0传送命令,x=1传送数据
LCD1602_D4=temp&0x10;
LCD1602_D5=temp&0x20;
LCD1602_D6=temp&0x40;
LCD1602_D7=temp&0x80;
LCD1602_Enable();
LCD1602_D4=temp&0x01;
LCD1602_D5=temp&0x02;
LCD1602_D6=temp&0x04;
LCD1602_D7=temp&0x08;
LCD1602_Enable();
}
/*----------------------------整页显示字符----------------------------*/
void Display_Text(unsigned char code *addr)
{
unsigned char i;
LCD1602_Write(0x80,Command); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD1602_Write(*addr,Data);
addr++;
}
LCD1602_Write(0xc0,Command); //设置DDRAM地址
Delay_10us();
for(i=0;i<16;i++)
{
LCD1602_Write(*addr,Data);
addr++;
}
}
/*----------------------------指定位置显示字符----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char temp)
{
switch(y)
{
case 0:
LCD1602_Write(0x80+x,Command); //设置DDRAM地址
Delay_10us();
LCD1602_Write(temp,Data);
break;
case 1:
LCD1602_Write(0xc0+x,Command); //设置DDRAM地址
Delay_10us();
LCD1602_Write(temp,Data);
break;
}
}
/*----------------------------初始化LCD1602----------------------------*/
void LCD12864_Init(void)
{
Delay_10ms();
Delay_10ms();
Delay_10ms();
Delay_10ms(); //延时40ms
// LCD1602_Write(Function_Set,Command); //Function_Set
// Delay_x10us(200); //延时2ms
// LCD1602_Write(Function_Set,Command); //Function_Set
// Delay_x10us(3); //延时3us
LCD1602_Write(Function_Set,Command); //Function_Set
Delay_x10us(3); //延时3us
LCD1602_Write(Setting_Basic_Instruction_Set,Command); //Setting_Basic_Instruction_Set
Delay_x10us(3); //延时3us
LCD1602_Enable();
LCD1602_Write(Setting_Extended_Instruction_Set,Command); //Setting_Extended_Instruction_Set
Delay_x10us(3); //延时3us
// LCD1602_Write(Cursor_Move_Right,Command); //Cursor_Move_Right
// Delay_x10us(3); //延时3us
// LCD1602_Write(Contrast_Set,Command); //Contrast_Set
// Delay_x10us(3); //延时3us
// LCD1602_Write(Internal_OSC,Command); //Internal_OSC
// Delay_x10us(3); //延时3us
// LCD1602_Write(Power_ICON_Contrast,Command); //Power_ICON_Contrast
// Delay_x10us(3); //延时3us
// LCD1602_Write(Follower_Control,Command); //Follower_Control
// Delay_x10ms(20); //延时200ms
LCD1602_Write(Display_On,Command); //Display_On
Delay_x10us(3); //延时3us
LCD1602_Write(Clear_Display,Command); //Clear_Display
Delay_x10us(200); //延时2ms
// LCD1602_Write(Entry_Mode_Cursor_Right,Command); //Entry_Mode_Cursor_Right
// Delay_x10us(3); //延时3us
}
void main(void)
{
unsigned int a=0,b=0;
LCD12864_Init();
while(1)
{
Display_Text(Display_Data1);
while(1)
{
Display_Data(7,1,Display_Hex[a/10000]);
Display_Data(8,1,Display_Hex[a%10000/1000]);
Display_Data(9,1,Display_Hex[a%1000/100]);
Display_Data(10,1,Display_Hex[a%100/10]);
Display_Data(11,1,Display_Hex[a%10]);
Display_Data(12,1,Display_Hex[b%10000/1000]);
Display_Data(13,1,Display_Hex[b%1000/100]);
Display_Data(14,1,Display_Hex[b%100/10]);
Display_Data(15,1,Display_Hex[b%10]);
b++;
if(b>=10000)
{
b=0;
a++;
}
}
}
}