六年前写的4位并口1602程序供参考
- #include <STC89C5xRC.H>
- #define LCD1602_RS P22
- #define LCD1602_EN P23
- #define LCD1602_D4 P24
- #define LCD1602_D5 P25
- #define LCD1602_D6 P26
- #define LCD1602_D7 P27
- #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-Y1@11.0592MHz----------------------------*/
- void Delay_10us(void)
- {
- unsigned char i;
- i=2;
- while(--i);
- }
-
- /*----------------------------延时x10us----------------------------*/
- void Delay_x10us(unsigned char x)
- {
- while(x--)
- Delay_10us();
- }
-
- /*----------------------------延时10ms@STC-Y1@11.0592MHz----------------------------*/
- void Delay_10ms(void)
- {
- unsigned char i,j;
- i=18;
- j=235;
- 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;
- }
-
- /*----------------------------写命令或数据,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]);
- Delay_x10ms(2);
- b++;
- if(b>=10000)
- {
- b=0;
- a++;
- }
- }
- }
- }
复制代码
|